극 좌표계
무엇보다도 먼저, 우주는 구형이라는 점에 주목해야 한다.— 니콜라우스 코페르니쿠스 (1473–1543)
데카르트 좌표계가 공간을 매핑하고 위치를 정확하게 정의하는 유일한 시스템은 아닙니다. 데카르트 시스템의 대안은 극 좌표계이며, 이것이 이 챕터의 주제입니다. 극 좌표에 익숙하지 않다면 난해하거나 고급 주제처럼 보일 수 있으며(특히 삼각함수 때문에), 대충 넘어가고 싶을 수도 있습니다. 이런 실수를 하지 마세요. AI 및 카메라 제어와 같은 영역에는 극 좌표의 프레임워크에서 쉽게 이해할 수 있는(그리고 내재된 어려움도!) 매우 실용적인 문제들이 많이 있습니다.
이 챕터는 다음 섹션으로 구성되어 있습니다:
•
Section 7.1은 2D 극 좌표를 설명합니다.
•
Section 7.2는 극 좌표가 데카르트 좌표보다 선호되는 몇 가지 예를 제공합니다.
•
Section 7.3은 극 공간이 3D에서 어떻게 작동하는지 보여주고 원통 및 구면 좌표를 소개합니다.
•
마지막으로, Section 7.4는 극 공간이 위치뿐만 아니라 벡터를 설명하는 데에도 사용될 수 있음을 명확히 합니다.
7.1 2D 극 공간
이 섹션은 극 좌표의 기본 아이디어를 2차원을 사용하여 소개합니다. Section 7.1.1은 극 좌표를 사용하여 위치를 설명하는 방법을 보여줍니다. Section 7.1.2는 극 좌표의 앨리어싱에 대해 논의합니다. Section 7.1.3은 2D에서 극 좌표와 데카르트 좌표 간에 변환하는 방법을 보여줍니다.
7.1.1 2D 극 좌표를 사용하여 점 찾기
2D 데카르트 좌표 공간에는 좌표 공간의 위치를 설정하는 원점과 원점을 통과하는 두 개의 축이 있어 공간의 방향을 설정한다는 것을 기억하세요. 2D 극 좌표 공간에도 원점(극점이라고 함)이 있으며, 이는 동일한 기본 목적을 가지고 있습니다-좌표 공간의 "중심"을 정의합니다. 그러나 극 좌표 공간에는 하나의 축만 있으며, 때때로 극축이라고 불리며, 일반적으로 원점에서 나오는 광선으로 묘사됩니다. 수학 문헌에서는 극축이 다이어그램에서 오른쪽을 가리키는 것이 관례이며, 따라서 Figure 7.1에 표시된 것처럼 데카르트 시스템의 축에 해당합니다.
Figure 7.1
2D 극 좌표 공간
Section 7.3.3에 표시된 것처럼 이와 다른 규칙을 사용하는 것이 편리한 경우가 많습니다. 그때까지 우리의 논의는 수학 문헌의 전통적인 규칙을 따릅니다.
데카르트 좌표계에서는 두 개의 부호 있는 거리를 사용하여 2D 점을 설명했습니다. 극 좌표계는 하나의 거리와 하나의 각도를 사용합니다. 관례상, 거리는 일반적으로 변수에 할당되며("반지름"의 약자), 각도는 일반적으로라고 불립니다. 극 좌표 쌍은 다음과 같이 2D 공간의 점을 지정합니다:
2D 극 좌표로 설명된 점 찾기
Step 1. 원점에서 시작하여 극축 방향을 향하고 각도만큼 회전합니다. 양수 값은 일반적으로 반시계 방향 회전을 의미하고, 음수 값은 시계 방향 회전을 의미합니다.
Step 2. 이제 원점에서 단위만큼 앞으로 이동합니다. 극 좌표로 설명된 점에 도착했습니다.
이 과정은 Figure 7.2에 표시되어 있습니다.
Figure 7.2
2D 극 좌표를 사용하여 점 찾기
Figure 7.3
2D 극 좌표로 레이블이 지정된 예제 점들
요약하면, 는 점에서 원점까지의 거리를 정의하고, 는 원점에서 점의 방향을 정의합니다. Figure 7.3은 여러 점과 그 극 좌표를 보여줍니다. 작동 방식을 이해했다고 확신할 때까지 이 그림을 공부해야 합니다.
극 좌표 공간의 다이어그램에는 격자선이 포함되어 있지만, 이러한 격자선은 데카르트 좌표계의 다이어그램에 사용되는 격자선과 약간 다르다는 것을 알아차렸을 것입니다. 데카르트 좌표계의 각 격자선은 좌표 중 하나에 대해 동일한 값을 가진 점들로 구성됩니다. 수직선은 모두 동일한 좌표를 가진 점들로 구성되고, 수평선은 모두 동일한 좌표를 가진 점들로 구성됩니다. 극 좌표계의 격자선도 비슷합니다:
•
"격자 원"은 일정한 선을 보여줍니다. 이것은 의미가 있습니다; 결국 원의 정의는 중심에서 등거리에 있는 모든 점의 집합입니다. 그래서 문자가 이 거리를 보유하는 관례적인 변수인 이유는 반지름 거리이기 때문입니다.
•
원점을 통과하는 직선 격자선은 일정한 선을 보여주며, 원점에서 같은 방향에 있는 점들로 구성됩니다.
각도 측정에 관한 한 가지 주의사항. 데카르트 좌표에서는 측정 단위가 실제로 중요하지 않았습니다. 피트, 미터, 마일, 야드, 광년, 수염-초 또는 파이카를 사용하여 다이어그램을 해석할 수 있었고 실제로 문제가 되지 않았습니다.[1] 데카르트 좌표 데이터를 가져와서 다른 물리적 단위를 사용하여 해석하면 보고 있는 것이 더 크거나 작아지지만 비례적으로 같은 모양입니다. 그러나 극 좌표의 각도 구성 요소를 다른 각도 단위를 사용하여 해석하면 극적으로 왜곡된 결과가 나올 수 있습니다.
도 또는 라디안(또는 그레이드, 밀, 분, 기호, 육분의, 또는 퍼먼)을 사용하든 상관없이 일관되게 유지하는 한 실제로 중요하지 않습니다. 이 책의 본문에서는 거의 항상 특정 각도 측정값을 도 단위로 제공하고 숫자 뒤에 기호를 사용합니다. 우리가 이렇게 하는 이유는 우리가 인간이고, 수학 교수가 아닌 대부분의 인간은 의 분수보다 정수를 다루는 것이 더 쉽기 때문입니다. 실제로 360이라는 숫자의 선택은 많은 일반적인 경우에 분수를 피할 수 있도록 특별히 설계되었습니다. 그러나 컴퓨팅 기계[2]는 라디안으로 표현된 각도로 작업하는 것을 선호하므로 이 책의 코드 스니펫은 도가 아닌 라디안을 사용합니다.
7.1.2 앨리어싱
극 좌표의 작동 방식과 극 좌표 공간의 모습을 잘 이해하기 시작했기를 바랍니다. 그러나 머릿속에 성가신 생각이 있을 수 있습니다. 의식적이든 무의식적이든 데카르트 공간과 극 공간 사이의 근본적인 차이를 알아차렸을 것입니다. 아마도 2D 데카르트 공간을 완벽하게 균일한 연속체로 상상했을 것입니다. 흠없는 젤로 시트처럼 모든 방향으로 무한히 펼쳐져 있고, 무한히 얇은 각 조각이 다른 모든 조각과 동일합니다. 물론 원점과 축 같은 "특별한" 장소가 있지만, 그것들은 팬 바닥의 표시와 같습니다—젤로 자체는 다른 곳과 동일합니다. 그러나 극 좌표 공간의 구조를 상상했을 때 뭔가 달랐습니다. 극 좌표 공간에는 약간 "조각난" "이음새"와 불연속성이 있습니다. 무한히 큰 원형 팬의 젤로에는 여러 장의 젤로가 서로 쌓여 있습니다. 특정 장소에 숟가락을 내려놓으면 종종 여러 조각을 먹게 됩니다! 젤로 블록에는 머리카락 한 가닥이 있으며, 특별한 예방 조치가 필요한 특이점입니다.
극 공간에 대한 정신적 이미지가 젤로였든 다른 맛있는 디저트였든, 아마도 다음과 같은 질문들을 고민했을 것입니다:
1.
반지름 거리가 음수가 될 수 있습니까?
2.
θ가 구간 밖으로 나갈 수 있습니까?
3.
원점의 바로 "서쪽"(즉, 데카르트 좌표를 사용하여 x < 0, y = 0인 점들)의 각도 값은 모호합니다. Figure 7.3에서 이러한 점들 중 어느 것도 레이블이 지정되지 않았음을 알아차렸을 것입니다. 이러한 점들에 대해 θ가 180°인가요, 아니면 −180°인가요?
4.
원점 자체의 극 좌표도 모호합니다. 분명히 r = 0이지만, θ에 어떤 값을 사용해야 합니까? 모든 θ 값이 작동하지 않습니까?
이 모든 질문에 대한 답은 "예"입니다.[3] 사실, 우리는 극 공간에 대한 다소 가혹한 현실에 직면해야 합니다.
주어진 점은 무한히 많은 극 좌표 쌍으로 설명할 수 있습니다.
이 현상을 앨리어싱이라고 합니다. 두 좌표 쌍이 다른 숫자 값을 가지지만 공간의 동일한 점을 참조하는 경우, 서로의 앨리어스라고 합니다. 데카르트 공간에서는 앨리어싱이 발생하지 않습니다—각 점에는 정확히 하나의 좌표 쌍이 할당되며, 점에서 좌표 쌍으로의 매핑은 일대일입니다.
극 좌표계의 앨리어싱을 쉽게 설명해드릴게요.
데카르트 좌표계의 경우:
어떤 점의 위치가 (3, 4)라면, 이 점을 표현하는 방법은 딱 하나예요. 점
좌표가 1:1로 매칭됩니다.
극 좌표계의 경우:
하지만 극 좌표에서는 같은 점을 여러 가지 방법으로 표현할 수 있어요. 예를 들어:
•
(5, 30°)와 (5, 390°)는 같은 점이에요. 390° = 30° + 360°이니까요.
•
(-5, 30°)와 (5, 210°)도 같은 점이에요. 음수 거리로 반대 방향으로 가는 것과, 180° 돌아서 양수 거리로 가는 것이 같은 결과거든요.
왜 이런 일이 생기나요?
•
각도에 360°를 더하거나 빼도 같은 방향
•
거리를 음수로 만들고 각도를 180° 바꿔도 같은 위치
이렇게 다른 숫자 쌍이지만 같은 점을 가리키는 좌표들을 서로의 "앨리어스"라고 부릅니다.
쉽게 비유하면, 집 주소를 "정문으로 들어가서 앞으로 10m"라고도 할 수 있고, "뒷문으로 들어가서 뒤로 -10m"라고도 할 수 있는 것과 비슷해요. 표현은 다르지만 같은 장소를 가리키는 거죠.
앨리어싱의 어려움을 다루기 전에, 먼저 앨리어싱이 문제가 되지 않는경우를 살펴보겠습니다. 바로 극 좌표 쌍이 주어졌을 때 그것이 가리키는 점을 찾는 작업입니다. r과 θ가 어떤 값이든 상관없이 항상 합리적으로 해석할 수 있습니다.
r이 음수일 때는 "반대 방향으로 이동"하는 것으로 해석하면 됩니다. 즉, r이 양수였다면 갔을 방향의 정반대 방향으로 가는 것이죠. θ가 정해진 범위를 벗어나도 괜찮습니다. 어느 방향인지는 여전히 알 수 있으니까요.[4] 정리하면, "비정상적인" 극 좌표는 있을 수 있지만 "무효한" 극 좌표는 없습니다. 한 점을 여러 좌표 쌍으로 나타낼 수 있지만, 반대로 하나의 좌표 쌍은 항상 정확히 한 점만을 가리킵니다.
앨리어스를 만드는 방법 중 하나는 θ에 360°의 배수를 더하는 것입니다. 한 바퀴 이상 "회전"을 더해도 최종 방향은 바뀌지 않기 때문입니다. 따라서 (r, θ)와 (r, θ + 360k)는 같은 점을 나타냅니다(k는 정수). 또 다른 방법은 θ에 180°를 더하고 r의 부호를 바꾸는 것입니다. 정반대 방향을 향하되 반대 부호만큼 움직이면 결국 같은 곳에 도착하는 원리입니다.
일반적으로 원점이 아닌 점 p의 경우, (r, θ)의 모든 앨리어스는 (±r, θ + 360k°) 형태로 표현할 수 있습니다(k는 임의의 정수).
따라서 앨리어싱이 있어도 r과 θ가 무엇이든 극 좌표가 가리키는 점이 어디인지는 명확합니다. 그런데 반대 상황은 어떨까요? 공간의 한 점이 주어졌을 때, 그 점을 나타낼 극 좌표에 대해 모두가 동의할 수 있을까요? 한 점을 나타낼 수 있는 극 좌표 쌍이 무한히 많다고 했는데, 그중 어느 것을 써야 할까요? 간단히 답하면 "어느 것을 써도 괜찮지만, 그중 하나가 선호됩니다"입니다.
분수의 약분과 비슷합니다. 우리 모두 특정 분수가 완전히 유효하다는 데 동의하고, 그 값이 무엇인지도 명확합니다. 하지만 그 분수는 "비정상적"입니다. 대부분은 더 간단하고 이해하기 쉬운 약분된 형태를 선호하죠. 분수는 분자와 분모를 1보다 큰 공약수로 더 이상 나눌 수 없을 때 "선호되는" 형태, 즉 기약분수가 됩니다. 분수를 기약분수로 만들 의무는 없지만, 관례상 보통 그렇게 합니다. 이 관례를 얼마나 지키는지는 학창시절 수학 선생님이 약분하지 않은 답에 얼마나 점수를 깎았는지에 달려 있습니다.[5]
극 좌표도 마찬가지로, 한 점을 나타내는 "선호되는" 방법을 그 점의 정규 좌표라고 합니다. 2D 극 좌표 쌍이 정규 형태가 되려면 r이 0 이상이고 θ가 −180° ≤ θ < 180° 구간에 있어야 합니다. 이 구간이 반열린구간이라는 점에 주목하세요. 원점의 바로 "서쪽"에 있는 점들(x축의 음의 방향)은 θ = 180°가 아닌 θ = −180°로 나타냅니다. 또한 r = 0(원점)일 때는 보통 θ = 0°로 정합니다. 이러한 규칙들을 적용하면 2D 공간의 모든 점을 정규 극 좌표로 나타내는 방법이 정확히 하나씩만 존재하게 됩니다. 수학 기호로 간결하게 정리하면, 극 좌표 쌍 (r, θ)가 정규 형태가 되려면 다음 조건들을 모두 만족해야 합니다:
정규 좌표가 만족하는 조건
다음 알고리즘을 사용하여 극 좌표 쌍을 정규 형태로 변환할 수 있습니다:
극 좌표 쌍 을 정규 형태로 변환
Listing 7.1은 C에서 어떻게 할 수 있는지 보여줍니다. Section 7.1.1에서 논의한 것처럼, 우리의 컴퓨터 코드는 일반적으로 라디안을 사용하여 각도를 저장합니다.
// Radial distance
float r;
// Angle in RADIANS
float theta;
// Declare a constant for 2*pi (360 degrees)
const float TWOPI = 2.0f*PI;
// Check if we are exactly at the origin
if (r == 0.0f)
{
// At the origin - slam theta to zero
theta = 0.0f;
}
else
{
// Handle negative distance
if (r < 0.0f)
{
r = -r;
theta += PI;
}
// Theta out of range? Note that this if() check is not
// strictly necessary, but we try to avoid doing floating
// point operations if they aren't necessary. Why
// incur floating point precision loss if we don't
// need to?
if (fabs(theta) > PI)
{
// Offset by PI
theta += PI;
// Wrap in range 0...TWOPI
theta -= floor(theta / TWOPI) * TWOPI;
// Undo offset, shifting angle back in range -PI...PI
theta -= PI;
}
}
C++
복사
세심한 독자라면 이 코드가 θ를 닫힌 구간 [−π, π]에 포함시키지만, θ = π인 경우를 명시적으로 배제하지 않는다는 점을 눈치챌 수 있습니다. π의 값은 부동 소수점으로 정확히 표현할 수 없습니다. 사실 π는 무리수이기 때문에 부동 소수점은 물론 어떤 진법을 사용하더라도 유한한 자릿수로는 정확히 표현할 수 없습니다! 우리 코드의 상수 PI는 π와 정확히 같지 않고, float 타입으로 표현 가능한 값 중 π에 가장 가까운 근사값입니다. 배정밀도를 사용하면 실제 값에 더 가까이 다가갈 수 있지만, 여전히 정확한 값은 아닙니다. 따라서 이 함수는 실질적으로 열린 구간 (−π, π) 범위의 값을 반환한다고 볼 수 있습니다.
7.1.3 2D에서 데카르트 좌표와 극 좌표 간 변환
이 섹션에서는 2D 공간에서 데카르트 좌표와 극 좌표를 서로 변환하는 방법을 다룹니다. Section 1.4.5에서 배운 삼각법이 드디어 쓰일 때가 왔습니다.
Figure 7.4는 극 좌표와 데카르트 좌표를 변환할 때 필요한 기하학적 관계를 보여줍니다.
Figure 7.4
데카르트 좌표와 극 좌표 간 변환
극 좌표를 데카르트 좌표로 변환하는 것은 사인과 코사인의 정의를 사용하면 간단합니다.
2D 극 좌표를 데카르트로 변환 앨리어싱은 여기서 문제가 되지 않습니다. Equation (7.1)은 "이상한" 와 값에도 잘 작동합니다.
데카르트 좌표에서 극 좌표를 계산하는 것이 좀 더 까다롭습니다. 앨리어싱 때문에 정답이 하나만 있는 것이 아니라, 한 점을 나타내는 극 좌표 쌍이 무한히 많습니다. 보통은 정규 좌표를 구하는 것이 목표입니다.
피타고라스 정리를 사용하면 를 쉽게 계산할 수 있습니다.
제곱근 함수는 항상 양수 값을 반환하므로, 때문에 정규 범위를 벗어날 걱정은 하지 않아도 됩니다.
는 쉽게 구했으니, 이제 좌표를 구해봅시다:
하지만 이 방법에는 두 가지 문제가 있습니다. 첫째, 이면 나눗셈이 불가능합니다. 둘째, 함수의 치역이 에 불과합니다. 근본적인 문제는 나눗셈 과정에서 중요한 정보가 사라진다는 것입니다. 와 는 각각 양수나 음수일 수 있고, 이는 점이 위치할 수 있는 네 가지 사분면에 대응됩니다. 하지만 나눗셈 결과는 하나의 값만 나옵니다. 와 의 부호를 모두 바꾸면 점은 다른 사분면으로 이동하지만, 비율 은 그대로입니다.
이런 이유로 데카르트 좌표를 극 좌표로 완전히 변환하려면 각 사분면을 따로 처리하는 조건문이 필요해서 "수학하는 사람들"에게는 다소 복잡합니다. 다행히 "프로그래밍하는 사람들"에게는 atan2 함수가 있어서, 원점의 특수한 경우만 제외하면 모든 와 에 대해 각도 를 정확히 계산해줍니다. 이 표기법을 빌려서, 책에서 사용할 수학 함수를 정의하겠습니다:
이 책에서 사용되는 함수 Equation (7.2)에 대해 두 가지를 짚고 넘어가겠습니다. 첫째, 대부분의 프로그래밍 언어 표준 라이브러리의 atan2 함수 관례에 따라, 인수 순서가 "반대"입니다: . 그냥 반대라고 기억하거나, 와 의 철자가 비슷하다는 점을 활용하면 됩니다. 또는 이고 라는 점을 기억하는 것도 좋습니다.
둘째, 많은 소프트웨어 라이브러리의 atan2 함수는 일 때 원점에서 정의되지 않습니다. 이 책에서 수식에 사용하는 함수는 에서 로 정의됩니다. 코드에서는 라이브러리의 atan2 함수를 쓰고 원점을 별도로 처리하지만, 수식에서는 원점에서도 정의된 추상 함수 를 사용합니다. (글꼴 차이를 주목하세요.)
다시 본론으로 돌아가서, 2D 데카르트 좌표에서 극각 를 계산하는 방법입니다. 함수를 사용하면 2D 데카르트 좌표를 극 좌표로 쉽게 변환할 수 있습니다:
2D 데카르트에서 극 좌표로의 변환
Listing 7.2의 C 코드는 데카르트 좌표 쌍을 정규 극 좌표로 변환하는 방법을 보여줍니다.
// Input: Cartesian coordinates
float x,y;
// Output: polar radial distance, and angle in RADIANS
float r, theta;
// Check if we are at the origin
if (x == 0.0f && y == 0.0f)
{
// At the origin - slam both polar coordinates to zero
r = 0.0f;
theta = 0.0f;
} else
{
// Compute values. Isn't the atan2 function great?
r = sqrt(x*x + y*y);
theta = atan2(y,x);
}
C++
복사
7.2 왜 누군가 극 좌표를 사용할까요?
앨리어싱, 도와 라디안, 삼각법 등이 복잡한데도 데카르트 좌표가 잘 작동한다면 왜 굳이 극 좌표를 사용할까요? 사실 데카르트 좌표보다 극 좌표를 더 자주 사용하게 될 것입니다. 일상 대화에서도 자주 등장하기 때문입니다.
예를 들어, 한 저자는 텍사스 Alvarado 출신입니다. 사람들이 텍사스 Alvarado가 어디냐고 물으면 "Burleson에서 남동쪽으로 약 15마일 떨어진 곳"이라고 답합니다. 이는 극 좌표를 사용해 Alvarado의 위치를 설명하는 것으로, 원점(Burleson), 거리(15마일), 각도(남동쪽)를 명시하고 있습니다. 물론 텍사스 출신이 아닌 대부분의 사람들은(심지어 텍사스 출신 중에도 많은 사람들이) Burleson이 어디인지 모르기 때문에 "Dallas에서 남서쪽으로 약 50마일"이라고 설명하는 것이 더 효과적입니다. 다행히 미국 밖의 사람들도 대부분 Dallas가 어디인지는 알고 있습니다.[6] 참고로 텍사스 사람들이 모두 카우보이 모자와 부츠를 신는 것은 아니지만, "y'all"이나 "fixin'" 같은 단어는 실제로 사용합니다.[7]
간단히 말해서, 사람들은 위치를 거리와 방향으로 자연스럽게 인식하기 때문에 극 좌표가 자주 사용됩니다. (물론 극 좌표를 사용할 때 매우 정확하지는 않지만, 정밀도는 인간 뇌의 장점이 아닙니다.) 데카르트 좌표는 우리에게 익숙한 방식이 아닙니다. 컴퓨터는 그 반대입니다. 일반적으로 컴퓨터로 기하학 문제를 풀 때는 극 좌표보다 데카르트 좌표가 더 쉽습니다. Chapter 8에서 3D 방향을 표현하는 다양한 방법을 비교할 때 인간과 컴퓨터 간의 이런 차이를 다시 살펴보겠습니다.
극 좌표를 선호하는 이유는 아마도 각 극 좌표가 그 자체로 명확한 의미를 갖기 때문일 것입니다. 전투기 조종사가 동료에게 "적기, 6시 방향!"이라고 외칠 수 있습니다.[8] 공중전 한가운데서 이 용감한 조종사들은 실제로 극 좌표를 사용하고 있습니다. "6시 방향"은 "뒤쪽"을 의미하며 우리가 배운 각도입니다. 조종사가 거리를 명시할 필요가 없었다는 점에 주목하세요. 아마도 동료가 직접 돌아서 확인하는 것이 말로 듣는 것보다 빠르기 때문일 것입니다. 따라서 하나의 극 좌표(이 경우 방향)만으로도 유용한 정보가 됩니다. 다른 극 좌표인 거리()도 마찬가지입니다. 이를 데카르트 좌표 하나의 유용성과 비교해보세요. 전투기 조종사가 "적기, !"라고 말하는 상황을 상상해보세요. 이 정보는 처리하기 어렵고 별로 유용하지 않습니다.
비디오 게임에서 극 좌표가 가장 흔히 사용되는 경우는 카메라, 무기 등을 특정 타겟에 조준할 때입니다. 이 문제는 데카르트-극 좌표 변환을 사용하면 쉽게 해결할 수 있습니다. 보통 필요한 것은 각도이기 때문입니다. 각도 데이터를 피할 수 있는 경우에도(예를 들어 객체의 방향을 행렬로 지정하면 순수 벡터 연산만 사용할 수 있음) 극 좌표는 여전히 유용합니다. 일반적으로 카메라, 포탑, 암살자의 팔은 (아무리 뛰어난 암살자라도) 순간적으로 움직일 수 없지만, 타겟은 움직입니다. 이런 상황에서는 보통 어떤 방식으로든 타겟을 "추적"하게 됩니다. 이 추적은 (단순 속도 제한, 지연, 2차 시스템 등 어떤 제어 시스템을 사용하든) 일반적으로 극 공간에서 가장 잘 수행되며, 3D 공간에서 타겟 위치를 보간하는 것보다 효과적입니다.
극 좌표는 거리와 방향 측면에서 기본 측정값을 제공하는 물리적 데이터 수집 시스템에서도 자주 접하게 됩니다.
극 좌표가 데카르트 좌표보다 자연스러운 마지막 경우는 구의 표면에서 이동할 때입니다. 누가 언제 그럴 일이 있을까요? 아마 지금도 그러고 있을 것입니다. 지리적 위치를 나타내는 위도/경도 좌표는 데카르트 좌표가 아니라 극 좌표입니다. (정확히는 Section 7.3.2에서 다룰 3D 극 좌표의 한 종류인 구면 좌표입니다.) 물론 행성 크기에 비해 상대적으로 작은 영역을 보고 있고 적도에서 너무 멀지 않다면, 큰 문제 없이 위도와 경도를 데카르트 좌표처럼 사용할 수 있습니다. Dallas에서는 항상 그렇게 합니다.
7.3 3D 극 공간
극 좌표는 2D뿐만 아니라 3D에서도 사용할 수 있습니다. 짐작하셨겠지만 3D 극 좌표는 세 개의 값을 갖습니다. 그런데 세 번째 좌표는 또 다른 선형 거리(처럼)일까요, 아니면 또 다른 각도(처럼)일까요? 사실 둘 다 가능합니다. 3D 극 좌표에는 두 가지 종류가 있습니다. 선형 거리를 추가하면 다음 섹션의 주제인 원통 좌표가 되고, 각도를 추가하면 이후 섹션에서 다룰 구면 좌표가 됩니다. 원통 좌표는 구면 좌표보다 덜 사용되지만, 이해하기 쉬우므로 먼저 설명하겠습니다.
Section 7.3.1은 3D 극 좌표의 한 종류인 원통 좌표를, Section 7.3.2는 다른 종류인 구면 좌표를 다룹니다. Section 7.3.3은 비디오 게임 코드에서 종종 더 간편하게 사용되는 대체 극 좌표 규칙을 제시합니다. Section 7.3.4는 구면 좌표 공간에서 발생할 수 있는 특수한 형태의 앨리어싱을 설명하고, Section 7.3.5는 구면 좌표와 3D 데카르트 좌표 간 변환 방법을 보여줍니다.
7.3.1 원통 좌표
Figure 7.5
원통 좌표
데카르트 좌표를 3D로 확장하기 위해, 평면에서 작업하는 데 사용되는 2D 시스템으로 시작하여 이 평면에 수직인 세 번째 축을 추가합니다. 이것이 기본적으로 원통 좌표가 극 좌표를 3D로 확장하는 방식입니다. 세 번째 축을 데카르트 좌표에서처럼 -축이라고 부르겠습니다. 원통 좌표 로 설명된 점을 찾기 위해, 2D 극 좌표에서처럼 와 를 처리한 다음 좌표에 따라 "위" 또는 "아래"로 이동합니다. Figure 7.5는 원통 좌표를 사용하여 점 을 찾는 방법을 보여줍니다.
3D 데카르트 좌표와 원통 좌표 간의 변환은 간단합니다. 좌표는 어느 표현에서나 동일하며, Section 7.1.3의 2D 기법을 통해 와 사이를 변환합니다.
이 책에서는 원통 좌표를 많이 사용하지 않지만, 원통 모양의 환경에서 작업하거나 원통 모양의 객체를 설명할 때 일부 상황에서 유용합니다. 사람들이 종종 그것을 알지 못한 채 극 좌표를 사용하는 것과 같은 방식으로(Section 7.2 참조), "원통 좌표"라는 용어를 모르는 사람들도 여전히 그것을 사용할 수 있습니다. 사람들이 원통 좌표를 사용한다고 인정하는 경우에도 표기법과 규칙이 매우 다양하다는 점에 유의하세요. 예를 들어, 일부 사람들은 표기법 를 사용합니다. 또한, 축의 방향과 양의 회전의 정의는 주어진 상황에 가장 편리한 것에 따라 설정됩니다.
7.3.2 구면 좌표
더 일반적인 종류의 3D 극 좌표계는 구면 좌표계입니다. 원통 좌표 세트는 두 개의 거리와 하나의 각도를 가지는 반면, 구면 좌표 세트는 두 개의 각도와 하나의 거리를 가집니다.
극 좌표가 2D에서 어떻게 작동하는지의 본질을 검토해 봅시다. 점은 방향( )과 거리( )를 제공하여 지정됩니다. 구면 좌표도 방향과 거리를 정의하여 작동합니다; 유일한 차이점은 3D에서 방향을 정의하는 데 두 개의 각도가 필요하다는 것입니다. 3D 구면 공간에도 두 개의 극축이 있습니다. 첫 번째 축은 "수평"이며 2D 극 좌표의 극축 또는 우리의 3D 데카르트 규칙의 에 해당합니다. 다른 축은 수직이며 우리의 3D 데카르트 규칙의 에 해당합니다.
다른 사람들은 구면 좌표에 대해 다른 규칙과 표기법을 사용하지만, 대부분의 수학자들은 두 각도가 와 로 명명된다는 데 동의했습니다.[9] 수학자들은 또한 이 두 각도를 방향을 정의하기 위해 해석하는 방법에 대해 일반적으로 동의합니다. 전체 프로세스는 다음과 같이 작동합니다:
극 좌표를 사용하여 3D에서 점 찾기
Step 1. 원점에 서서 수평 극축의 방향을 향합니다. 수직축은 발에서 머리를 가리킵니다. 오른쪽[10] 팔을 수직 극축의 방향으로 똑바로 위로 향합니다.
Step 2. 각도 만큼 반시계 방향으로 회전합니다(2D 극 좌표에서 했던 것과 같은 방식).
Step 3. 팔을 각도 만큼 아래로 회전합니다. 이제 팔은 극 각도 와 로 지정된 방향을 가리킵니다.
Step 4. 이 방향을 따라 원점에서 거리 만큼 변위합니다. 구면 좌표 로 설명된 점에 도착했습니다.
Figure 7.6은 이것이 어떻게 작동하는지 보여줍니다.
Figure 7.6
수학자들이 사용하는 구면 좌표
다른 사람들은 다른 표기법을 사용합니다. 기호 와 가 반전된 규칙은 특히 물리학에서 자주 사용됩니다. 다른 저자들은 아마도 모든 로마 문자를 그리스 문자로 대체하려는 의도로 반지름 거리의 이름으로 대신 를 사용합니다. Section 7.3.3에서 비디오 게임 목적을 위해 좀 더 실용적인 일부 규칙을 제시합니다.
수평 각도 는 방위각으로 알려져 있고, 는 천정각입니다. 아마도 들어본 다른 용어는 경도와 위도입니다. 경도는 기본적으로 와 동일하고, 위도는 경사각 입니다. 따라서 보시다시피, 지구상의 위치를 설명하는 위도/경도 시스템은 실제로 구면 좌표계의 한 유형입니다. 우리는 종종 행성 표면의 점을 설명하는 데만 관심이 있으므로, 지구 중심까지의 거리를 측정하는 반지름 거리 는 필요하지 않습니다. 를 고도와 대략 동등하다고 생각할 수 있지만, "고도"가 정확히 무엇을 의미하는지에 따라 지면 높이 또는 해수면을 0으로 만들기 위해 값이 지구 반지름11만큼 오프셋됩니다.
7.3.3 3D 가상 세계에 유용한 일부 극 좌표 규칙
이전 섹션에서 설명한 구면 좌표계는 수학자들이 사용하는 전통적인 오른손 시스템이며, 이러한 가정 하에 데카르트 좌표와 구면 좌표 간 변환 공식은 다소 우아합니다. 그러나 비디오 게임 업계의 대부분의 사람들에게 이 우아함은 전통적인 규칙의 다음과 같은 짜증나는 단점과 비교하여 약간의 이점일 뿐입니다:
•
의 방향으로 가리키는 기본 수평 방향. 이것은 불행한데, 우리에게 는 "오른쪽" 또는 "동쪽"을 가리키며, 이는 대부분의 사람들의 마음속 "기본" 방향이 아니기 때문입니다. 시계의 숫자가 맨 위에서 시작하는 방식과 유사하게, 수평 극축이 "앞" 또는 "북쪽"인 를 가리키는 것이 우리에게 더 좋을 것입니다.
•
각도에 대한 규칙은 여러 면에서 불행합니다. 데카르트 시스템을 2D에서 3D로 확장하는 방법과 유사하게 0의 세 번째 좌표를 추가하여 2D 극 좌표를 3D로 확장하면 더 좋을 것입니다. 그러나 구면 좌표는 우리가 원하는 대로 2D 극 좌표에 대응하지 않습니다. 사실, 를 할당하면 Section 7.3.4에서 설명하는 특이점인 짐벌 락의 어색한 상황에 놓이게 됩니다. 대신, 2D 평면의 점은 로 표현됩니다. 천정각보다 위도를 측정하는 것이 더 직관적이었을 것입니다. 대부분의 사람들은 기본을 "수평"으로 생각하고 "위"를 극단적인 경우로 생각합니다.
•
그리스인에게 무례한 것은 아니지만, 와 는 익숙해지는 데 약간 시간이 걸립니다. 기호 는 적어도 의미 있는 것을 나타내기 때문에 그렇게 나쁘지 않습니다: 반지름 거리 또는 반지름. 완전히 임의적인 그리스 기호가 아니라 각도를 나타내는 데 사용하는 기호가 영어 단어에 대해 유사하게 짧다면 좋지 않을까요?
•
구면 좌표에 대한 두 각도가 3D에서 방향을 설명하는 데 사용되는 오일러 각12에 사용하는 처음 두 각도와 동일하면 좋을 것입니다. Section 8.3까지 오일러 각에 대해 논의하지 않을 것이므로, 지금은 "우리가 그렇다고 말했기 때문에 좋을 것"이라고 말하면서 데카르트에 두 번 반대합시다.13
•
그것은 오른손 시스템이고, 우리는 (적어도 이 책에서는) 왼손 시스템을 사용합니다.
우리의 목적에 더 적합한 일부 구면 좌표 규칙을 설명해 봅시다. 반지름 거리 에 대한 표준 규칙에 대해 불만이 없으므로 이 좌표의 이름과 의미론을 모두 보존합니다. 우리의 불만은 주로 두 각도에 관한 것이며, 둘 다 이름을 바꾸고 용도를 변경합니다.
Figure 7.7
이 책에서 사용되는 헤딩과 피치 각도
수평 각도 는 로 이름이 변경되며, 이는 헤딩의 약자이고 나침반 헤딩과 유사합니다. 헤딩 0은 컨텍스트에 따라 "앞" 또는 "북쪽"의 방향을 나타냅니다. 이것은 표준 항공 규칙과 일치합니다. Section 1.3.4에서 설명한 3D 데카르트 규칙을 가정하면, 헤딩 0(따라서 우리의 주요 극축)은 에 해당합니다. 또한, 왼손 좌표계를 선호하므로, 양의 회전은 위에서 볼 때 시계 방향으로 회전합니다.
수직 각도 는 로 이름이 변경되며, 이는 하강각을 측정한다는 것을 의미합니다. 이것은 나쁜 선택처럼 보일 수 있지만, 왼손 규칙과 일치합니다(Figure 1.14 참조). 나중에 왼손 규칙과의 일관성이 이 작은 정도의 반직관성을 겪을 가치가 있는 열매를 맺는 방법을 볼 것입니다.
Figure 7.7은 헤딩과 피치가 어떻게 협력하여 방향을 정의하는지 보여줍니다.
7.3.4 구면 좌표의 앨리어싱
Section 7.1.2는 2D 극 좌표의 성가신 앨리어싱 현상을 검토했습니다: 다른 숫자 좌표 쌍은 공간의 동일한 점을 참조할 때 서로의 앨리어스입니다. 세 가지 기본 유형의 앨리어싱이 제시되었으며, 3D 구면 좌표계에도 존재하므로 여기서 검토합니다.
앨리어스를 생성하는 첫 번째 확실한 방법은 어느 각도에 의 배수를 추가하는 것입니다. 이것은 정말 가장 사소한 형태의 앨리어싱이며 각도 측정의 주기적 특성에 의해 발생합니다.
다른 두 가지 형태의 앨리어싱은 좌표의 상호 의존성에 의해 발생하기 때문에 약간 더 흥미롭습니다. 다시 말해서, 한 좌표 의 의미는 다른 좌표인 각도의 값에 따라 달라집니다. 이 종속성은 한 형태의 앨리어싱과 특이점을 생성합니다:
•
2D 극 공간의 앨리어싱은 반지름 거리를 부정하고 반대 방향이 표시되도록 각도를 조정하여 트리거될 수 있습니다. 구면 좌표로도 동일한 작업을 수행할 수 있습니다. Section 7.3.3에서 설명한 헤딩 및 피치 규칙을 사용하여, 180°의 홀수 배수를 추가하여 헤딩을 뒤집은 다음 피치를 부정하기만 하면 됩니다.
•
2D 극 공간의 특이점은 일 때 각도 좌표가 무관하기 때문에 원점에서 발생합니다. 구면 좌표의 경우, 원점에서 두 각도가 모두 무관합니다.
따라서 구면 좌표는 의 의미가 각도의 값에 따라 변하기 때문에 유사한 앨리어싱 동작을 나타냅니다. 그러나 구면 좌표는 피치 각도가 헤딩 각도에 따라 달라지는 축을 중심으로 회전하기 때문에 추가적인 형태의 앨리어싱을 겪습니다. 이것은 에 대한 방향의 종속성에 의해 발생하는 것과 유사한 추가적인 형태의 앨리어싱과 추가적인 특이점을 생성합니다.
•
각 개별 각도의 사소한 앨리어싱을 제외하고도 다른 헤딩 및 피치 값이 동일한 방향을 초래할 수 있습니다. (의 앨리어스는 로 생성될 수 있습니다. 예를 들어, 오른쪽으로 90° 회전("동쪽"을 향함)하고 45° 아래로 피칭하는 대신, 왼쪽으로 90° 회전("서쪽"을 향함)한 다음 135° 아래로 피칭할 수 있습니다. 우리는 거꾸로 있지만 여전히 같은 방향을 보고 있을 것입니다.
•
피치 각도가 (또는 이러한 값의 앨리어스)로 설정될 때 특이점이 발생합니다. 짐벌 락으로 알려진 이 상황에서 표시된 방향은 순수하게 수직(똑바로 위 또는 똑바로 아래)이며 헤딩 각도는 무관합니다. Section 8.3에서 오일러 각에 대해 논의할 때 짐벌 락에 대해 더 많이 말할 것입니다.
2D에서 했던 것처럼, 3D 공간의 주어진 어떤 점도 정규 집합 내의 정확히 하나의 좌표 삼중항에 명확하게 매핑되도록 정규 구면 좌표 세트를 정의할 수 있습니다. 극 좌표에 대해 했던 것과 유사한 제한을 와 에 배치합니다. 피치 각도와 관련된 두 가지 추가 제약이 추가됩니다. 첫째, 피치는 구간 에 있도록 제한됩니다. 둘째, 짐벌 락의 경우 피치가 극값에 도달할 때 헤딩 값이 무관하므로, 그 경우 를 강제합니다. 정규 집합의 점이 만족하는 조건은 아래 기준으로 요약됩니다. (이러한 기준은 와 를 사용하는 전통적인 수학 규칙이 아니라 이 책의 헤딩 및 피치 규칙을 가정합니다.)
이 책의 구면 좌표 규칙을 가정한 정규 구면 좌표가 만족하는 조건
다음 알고리즘을 사용하여 구면 좌표 삼중항을 정규 형태로 변환할 수 있습니다:
구면 좌표 삼중항 을 정규 형태로 변환
Listing 7.3은 C에서 어떻게 할 수 있는지 보여줍니다. 컴퓨터는 라디안을 좋아한다는 것을 기억하세요.
// Radial distance
float r;
// Angles in radians
float heading, pitch;
// Declare a few constants
const float TWOPI = 2.0f*PI; // 360 degrees
const float PIOVERTWO = PI/2.0f; // 90 degrees
// Check if we are exactly at the origin
if (r == 0.0f)
{
// At the origin - slam angles to zero
heading = pitch = 0.0f;
} else
{
// Handle negative distance
if (r < 0.0f)
{
r = -r;
heading += PI;
pitch = -pitch;
}
// Pitch out of range?
if (fabs(pitch) > PIOVERTWO)
{
// Offset by 90 degrees
pitch += PIOVERTWO;
// Wrap in range 0...TWOPI
pitch -= floor(pitch / TWOPI) * TWOPI;
// Out of range?
if (pitch > PI)
{
// Flip heading
heading += PI;
// Undo offset and also set pitch = 180-pitch
pitch = 3.0f*PI/2.0f - pitch; // p = 270 degrees - p
}
else
{
// Undo offset, shifting pitch in range
// -90 degrees ... +90 degrees
pitch -= PIOVERTWO;
}
}
// Gimbal lock? Test using a relatively small tolerance
// here, close to the limits of single precision.
if (fabs(pitch) >= PIOVERTWO*0.9999)
{
heading = 0.0f;
}
else
{
// Wrap heading, avoiding math when possible
// to preserve precision
if (fabs(heading) > PI)
{
// Offset by PI
heading += PI;
// Wrap in range 0...TWOPI
heading -= floor(heading / TWOPI) * TWOPI;
// Undo offset, shifting angle back in range -PI...PI
heading -= PI;
}
}
}
C++
복사
7.3.5 구면 좌표와 데카르트 좌표 간 변환
Figure 7.8
수학자들을 위한 구면 좌표와 데카르트 좌표
구면 좌표를 3D 데카르트 좌표로 어떻게 변환하는지 살펴보겠습니다. Figure 7.8에는 구면 좌표와 데카르트 좌표가 함께 나와 있습니다. 먼저 데카르트 공간과 구면 공간 모두에서 전통적인 오른손 규칙을 사용한 변환을 유도하고, 그 다음 왼손 규칙에 맞는 변환을 보여드리겠습니다.
Figure 7.8을 보면 새로운 변수가 등장합니다. 이것은 점과 수직축 사이의 수평 거리를 나타냅니다. 빗변의 길이가 이고 두 변의 길이가 와 인 직각삼각형을 생각해보면,
다음과 같은 관계를 얻을 수 있습니다
따라서 와 만 구하면 됩니다.
만약 라면 2D 극 좌표와 본질적으로 같습니다. 일 때의 및 좌표를 각각 와 로 표현해봅시다. Section 7.1.3에서,
이라는 결과를 얻었습니다
일 때 입니다. 가 줄어들면 도 줄어들고, 닮은꼴 삼각형의 성질에 의해 가 성립합니다. 를 다시 살펴보면 임을 알 수 있습니다. 이를 모두 합치면, 수학자들이 사용하는 구면 좌표를 3D 데카르트 좌표로 변환하는 공식은
이 방정식들은 오른손 좌표계를 사용하는 수학자들을 위한 것입니다. 데카르트 좌표계(Section 1.3.4 참조)와 구면 좌표계(Section 7.3.3 참조) 모두에서 이 책의 규칙을 따른다면, 다음 공식을 사용해야 합니다:
이 책의 규칙에 따른 구면-데카르트 변환 공식
데카르트 좌표에서 구면 좌표로의 변환은 앨리어싱 문제 때문에 더 복잡합니다. 하나의 3D 위치에 여러 구면 좌표 집합이 대응될 수 있다는 점을 알고 있습니다. 우리가 원하는 것은 정규 좌표입니다. 다음 유도 과정에서는 비디오 게임에서 가장 흔히 사용되는 규칙인 Equation (7.3)의 항공 관련 규칙을 사용하겠습니다.
2D 극 좌표와 마찬가지로, 는 거리 공식을 그대로 적용하면 됩니다:
앞에서와 같이, 원점( )에서의 특이점은 특수한 경우로 처리합니다.
방향 각도는 함수를 사용하면 놀랍도록 간단하게 계산할 수 있습니다:
이 방법이 효과적인 이유는 가 인수들의 비율과 부호만 사용하기 때문입니다. Equation (7.3)을 보면, 의 스케일 계수가 와 양쪽에 공통으로 들어있습니다. 또한 정규 좌표를 사용하므로 및 를 가정할 수 있습니다. 따라서 이고 공통 스케일 계수는 항상 0 이상입니다. 짐벌 락의 경우는 의 정의에서 자동으로 처리됩니다.
마지막으로, 를 알면 에서 를 구할 수 있습니다:
함수의 치역은 인데, 다행히 이것은 정규 집합에서 의 범위와 정확히 일치합니다.
Listing 7.4는 전체 절차를 보여줍니다.
// Input Cartesian coordinates
float x,y,z;
// Output radial distance
float r;
// Output angles in radians
float heading, pitch;
// Declare a few constants
const float TWOPI = 2.0f*PI; // 360 degrees
const float PIOVERTWO = PI/2.0f; // 90 degrees
// Compute radial distance
r = sqrt(x*x + y*y + z*z);
// Check if we are exactly at the origin
if (r > 0.0f) {
// Compute pitch
pitch = asin(-y/r);
// Check for gimbal lock, since the library atan2
// function is undefined at the (2D) origin
if (fabs(pitch) >= PIOVERTWO*0.9999) {
heading = 0.0f;
} else {
heading = atan2(x,z);
}
} else {
// At the origin - slam angles to zero
heading = pitch = 0.0f;
}
C++
복사
7.4 극 좌표를 사용하여 벡터 지정하기
극 좌표를 사용하여 점을 설명하는 방법과 데카르트 좌표를 사용하여 벡터를 설명하는 방법을 살펴보았습니다. 벡터를 설명하기 위해 극 형태를 사용하는 것도 가능합니다. 사실, 극 형태를 "또한" 사용할 수 있다고 말하는 것은 마치 컴퓨터가 키보드로 제어되지만 마우스로 "또한" 제어될 수 있다고 말하는 것과 비슷합니다. 극 좌표는 벡터의 두 가지 핵심 속성인 방향과 길이를 직접 설명합니다. 데카르트 형태에서 이러한 값들은 간접적으로 저장되며, 본질적으로 극 형태로의 변환으로 귀결되는 일부 계산을 통해서만 얻어집니다. 이것이 바로 Section 7.2에서 논의한 것처럼 극 좌표가 일상 대화에서 사용되는 통용 화폐인 이유입니다.
그러나 극 형태를 선호하는 것은 비전문가들만이 아닙니다. 대부분의 물리학 교과서가 벡터에 대한 간단한 소개를 포함하고 있으며, 이 소개는 극 좌표의 틀을 사용하여 진행된다는 점을 주목하는 것은 흥미롭습니다. 이는 수학을 상당히 더 복잡하게 만듦에도 불구하고 이루어집니다.
극 벡터가 어떻게 작동하는지에 대한 세부 사항과 관련해서는, 우리는 실제로 이미 그것들을 다루었습니다. 2D 극 좌표로 설명된 점을 찾기 위한 우리의 "알고리즘"을 생각해보세요. "원점에서 시작"이라는 구절을 제거하고 나머지를 그대로 두면, 그 지침은 주어진 극 좌표로 설명되는 변위(벡터)를 시각화하는 방법을 설명합니다. 이것은 Section 2.4의 같은 아이디어입니다: 벡터는 같은 좌표를 가진 점과 관련이 있는데, 왜냐하면 벡터가 원점에서 그 점까지의 변위를 제공하기 때문입니다.
우리는 또한 이미 데카르트 형태와 극 형태 사이에서 벡터를 변환하는 수학을 배웠습니다. Section 7.1.3에서 논의된 방법들은 점의 관점에서 제시되었지만, 벡터에도 똑같이 유효합니다.

























