삼각비와 삼각함수
삼각비는 직각삼각형의 세 변의 길이의 비를 나타낸 것이다.
삼각형은 이름 그대로 세 개의 각으로 이루어진 도형이고, 당연히 세 개의 변을 가지게 된다.
유클리드 공간에서 삼각형의 세 각의 합은 반드시 180도이며, 이 중 가장 큰 각이 90도보다 작으면 예각 삼각형, 90도보다 크면 둔각 삼각형이라 하고, 특히 90도, 즉 직각인 삼각형을 직각 삼각형이라고 한다.
삼각함수는 직각 삼각형에서 밑변과 빗변이 이루는 각을 A라고 했을 때, 각 A에 대해 세 변의 길이의 비를 나타낸 함수이다. 대표적인 삼각함수는 사인(sine), 코사인(cosine), 탄젠트(tangent)가 있다.
사인 함수는 sin(A)으로 나타내며, 빗변 / 밑변를 뜻한다.
코사인 함수는 cos(A)으로 나타내며, 빗변 / 높이를 뜻한다.
탄젠트 함수는 tan(A)으로 나타내며, 높이 / 밑변를 뜻한다.
반대로 실수 f를 가지고 각도를 계산해내는 역삼각함수도 정의된다. 역삼각함수의 이름은 위의 삼각함수 앞에 아크를 붙인다.
아크 사인 함수는 asin(A), 아크 코사인 함수는 acos(A), 아크 탄젠트 함수는 atan(A)로 나타낸다.
단위원으로 정의하는 삼각함수
좌표 평면에 반지름의 길이가 1인 단위원을 그려보자.
원 위에 있는 임의의 점이 있다. 우리가 이 점의 위치를 표현할 때, (x, y)의 숫자 쌍으로 표현할 수 있다. x는 점 P가 좌표계의 x축 상에서 어느 위치에 있는지를 나타내고, y는 점 P가 좌표계의 y축 상에서 어느 위치에 있는지를 나타낸다.
x축의 양의 방향으로 시작점으로 하고, 반시계 방향 회전을 양의 방향이라고 하면, 점 P의 각도를 θ라고 할 수 있다. 이 때 점 P로부터 x축에 수직한 직선을 그리면 직각 삼각형을 그릴 수 있다.
원의 반지름이 1이므로 빗변의 길이도 1이다. 각 θ에 대해 위에서 말한 세개의 삼각함수의 값을 구할 수 있다.
예를 들어 P의 좌표가 (-0.6, 0.8)이라면 sin( θ) = 0.8, cos( θ) = -0.6, tan( θ) = -4/3이다.
좌표 평면 위에 원을 그리고 시초선으로부터의 각을 정의함으로써 실제 삼각형에서는 있을 수 없는 각도에서의 삼각함수를 정의할 수 있다.
호도법
각도를 말할 때, 우리는 30도, 60도, 180도 등, 숫자 뒤에 "도"라는 단위를 붙여서 말한다. 그러나 각도를 표현하는 체계는 다양하다. 대표적으로 호도법이 있다.
호도법은 부채꼴에서 반지름과 호의 길이가 같은 사이각을 1라디안으로 정의한다.
반지름의 길이가 1인 단위원에서 원주의 길이는 2π이고 각도로 360도이기 때문에, 2 π rad = 360도임을 알 수 있다.
2차원 평면 상에서 직선 표현하기
직교 좌표계에서 직선을 표현하려면 어떻게 해야할까?
다양한 방법이 있겠지만, 컴퓨터 공학에서는 벡터를 주로 사용한다.
컴퓨터 공학에서 공간을 벡터로 표현하는 이유는 효율성, 표준화된 표현, 수학적 유용성 때문이다.
- 벡터는 단순한 숫자쌍으로 나타기 때문에 손쉽게 차원을 확장할 수 있다는 장점이 있다. 숫자가 2개면 2차원 벡터, 3개면 3차원 벡터... n개면 n차원 벡터다.
- 벡터는 점의 위치와 방향을 동시에 표현할 수 있다. 예를 들어, (a, b, c)라는 3차원 벡터가 있다. 이 벡터는 3차원 공간 상에서 x축 좌표가 a, y축 좌표가 b, z축 좌표가 c인 점을 나타낼 수도 있지만, 원점으로부터 점 (a, b, c) 까지를 잇는 직선의 방향을 나타내기도 한다.
- 벡터는 덧셈, 뺄셈, 내적, 외적 등의 연산이 간단하다. 이는 3차원 공간에서 기하학적 문제를 해결하는데 필수적이다.
- 벡터는 3차원 공간에서 점, 선, 평면 등을 표현할 수 있다. 점은 3차원 벡터 그 자체로 위치를 나타낼 수 있으며, 직선은 점과 방향 벡터, 평면은 점과 법선 벡터를 통해 나타낼 수 있다.
- 벡터는 행렬과 함께 연산될 수 있다. 3차원 공간에서 이동, 회전, 스케일링 등의 변환 연산은 행렬을 통해 표현되는데, 벡터와 행렬은 함께 연산하기가 쉽다.
- 벡터는 속도, 가속도, 힘 등의 물리량을 표현하기에 적합하다. 컴퓨터 공학에서 공간을 시뮬레이션 할 때는 이러한 물리 연산이 중요하다.
벡터를 사용해서 점 r0를 지나고 방향 벡터가 v인 직선을 표현하면 다음와 같다.
- r(t)=r0+tv
벡터의 내적
벡터의 내적은 다음과 같이 정의된다.
- a⋅b=∥a∥∥b∥cosθ
즉, 두 벡터의 내적은 두 벡터의 길이의 곱과 두 벡터의 사이각 중 더 작은 각의 코사인 값의 곱으로 나타내진다.
만약 두 벡터가 크기가 1인 단위벡터였다면, 두 벡터의 내적은 말 그대로 두 벡터의 사이각의 코사인 값이 된다.
내적을 계산하는 또 다른 방법이 있는데, 바로 두 벡터의 각 성분 값을 모두 곱한 값의 합이다.
- a⋅b=a1b1+a2b2+a3b3
이를 통해 두 직선 사이의 각도를 쉽게 구할 수 있다.
두 직선 사이의 각도 구하기
위에서 보았듯이 벡터의 내적을 통해 두 직선 사이의 각도를 쉽게 구할 수 있다.
두 직선의 방향 벡터를 v1, v2라고 하면, v1과 v2의 내적은 다음과 같이 나타낼 수 있다.
- v1⋅v2=∥v1∥∥v2∥cosθ
벡터의 내적과 벡터의 크기 모두 쉽게 계산할 수 있다. 양변을 계산하고 잘 정리하면 cosθ값이 구해진다.
- cosθ=∥a∥∥b∥ / a⋅b
역삼각함수 acos(x)를 사용하면 각 θ를 구할 수 있다.
3차원 공간으로 확장하기
벡터는 차원 확장이 쉽다는 장점이 있다. 게다가 차원을 확장하더라도 벡터의 연산 규칙은 변하지 않는다. 3차원 평면에서의 내적은 2차원 평면에서의 내적과 크게 다르지 않다. 2차원 벡터의 내적처럼, 두 벡터의 각 성분의 곱을 모두 더하기만 하면 된다. 따라서 3차원 공간에서 두 직선 사이의 각도를 구하는것도 쉽게 할 수 있다.
3차원 벡터의 외적
3차원 공간에서는 벡터의 외적이 정의된다. 외적은 두 벡터의 크기와 방향 정보를 결합하여 새로운 벡터를 만든다.
벡터의 외적은 기하학적으로 아래와같이 정의한다.
외적으로 만들어진 벡터의 방향은 오른손 법칙을 생각하면 직관적으로 알 수 있다. 두 벡터 a, b가 있을 때, a와 b를 외적한 벡터의 방향은 아래 그림처럼 나타낼 수 있다.
3차원 각도 표현 체계 (Quaternion)
가장 직관적으로 생각할 수 있는 방식은 오일러 각도 체계이다. 이 방식은 벡터가 x축, y축, x축으로부터 각각 몇 도의 각을 이루고 있는지를 3차원 벡터로 표현한다.
하지만 이러한 각도 표현 체계는 짐벌락(Gimbal Lock)이라는 문제를 일으킬 수 있다.
다른 방식으로 회전 행렬(Rotaion Matrix)이 있다. 회전 행렬은 벡터를 특정 축을 기준으로 회전시키는데 사용하는 선형 변환 행렬이다. 회전하고자 하는 점이나 벡터를 행렬로 표현하고, 회전 행렬을 곱함으로써 변환된 결과를 얻을 수 있다.
회전 행렬은 직관적으로 이해하기 좋고, 행렬로 표현되므로 계산이 간단하다. 하지만 n차원 벡터의 회전에 대해서 n^2개의 성분이 필요하므로 메모리 소모가 크고, 더 많은 연산을 필요로 한다. 무엇보다 여전히 짐벌락 문제를 해결하지 못한다.
쿼터니언(Quaternion)은 회전과 방향을 표현하는 수학적 구조다. 쿼터니언은 하나의 실수 성분과 세 개의 허수 성분으로 구성된 4차원 벡터이다.
- q=w+xi+yj+zk
i, j, k는 서로 직교하는 허수 단위로, 다음의 관계를 만족한다.
- i2=j2=k2=ijk=−1
쿼터니언은 행렬보다 계산량이 적고 연속적인 회전에도 안정적이고, 9차원 벡터로 표현되는 회전행렬보다 적은 4차원 벡터로 표현할 수 있다는 장점이 있다. 그리고 무엇보다 짐벌락 문제를 해결한다. 하지만 허수가 끼어있다보니 직관적으로 이해하기 힘들다는 단점이 있다.
벡터의 회전
2차원 공간에서는 회전축이 존재하지 않기 때문에 3차원보다 벡터의 회전이 간단하다. 주어진 벡터 v를 원점을 기준으로 θ만큼 반시계 방향으로 회전하면 다음과 같이 계산된다.
- v′=R⋅v
R은 회전행렬이다.
3차원 공간에서 벡터를 회전하는 방법은 회전 행렬, 쿼터니언 등이 있다.
회전 행렬을 이용한 벡터의 회전은, 벡터 v=(x, y, z)에 x축 회전 행렬 Rx, y축 회전 행렬 Ry, z축 회전 행렬 Rz를 모두 곱해주면 된다. 행렬의 곱은 순서가 중요하기 때문에, 원하는 회전 값을 얻으려면 순서에 주의해야 한다.
쿼터니언을 이용한 벡터의 회전은 직관적으로 이해하기 어렵지만 수학적으로 명쾌하다. 먼저 회전하기를 원하는 벡터를 순수 쿼터니언으로 변환한다. 단순히 벡터의 첫 원소로 0을 넣어 4차원 벡터로 만들면 된다. 예를 들어, 벡터 v=(1, 2, 3)을 순수 쿼터니언으로 변환하면 v'=(0, v)=(0, 1, 2, 3)이 된다.
그 다음 순수 쿼터니언으로 변환한 벡터의 앞에 회전하고 싶은 쿼터니언을, 뒤에는 쿼터니언의 켤레 쿼터니언을 곱한다.
- v′=qvq−1
'일기' 카테고리의 다른 글
TCP 소켓 프로그래밍 실습 (0) | 2025.01.17 |
---|---|
CPU (0) | 2025.01.15 |
로드 밸런싱 (0) | 2025.01.14 |
대칭키 암호화와 공개키 암호화 (0) | 2025.01.14 |
protobufjs (0) | 2025.01.08 |