역/삼각 함수
-
삼각함수와 역삼각함수는 프로그래밍에서 수학적 계산, 그래픽스, 물리 시뮬레이션 등 다양한 분야에서 중요한 역할을 함
-
프로그래밍 언어에서는 단위로 Radian 이 사용됨
-
주기성 (Periodicity): 삼각 함수는 특정 주기를 가진 반복적인 함수
- 대부분의 삼각 함수는 2π(약 6.28)를 주기로 가지며, 탄젠트와 코탄젠트는 π를 주기로 가짐
-
삼각 항등식 (Trigonometric Identities): 삼각 함수들 사이의 관계를 나타내는 수학적 등식
- 대표적으로 피타고라스 항등식(sin²θ + cos²θ = 1)이 있음
-
단위 원 (Unit Circle): 삼각 함수를 정의하고 설명하는 기하학적 기반
- 반지름이 1인 원을 사용하여 사인(sin), 코사인(cos), 탄젠트(tan) 등의 함수 값을 좌표로 표현할 수 있음
호도법
-
Radian은 원의 반지름(r)과 관련된 각의 단위를 의미
-
호의 길이가 반지름과 동일한 경우 그 각을 1 Radian이라고 정의함
-
1 Radian은 약 57.3도(degree)에 해당하는 절대적인 각도 단위이며, 각도(degree)와 서로 변환할 수 있음
π radian = 180 degree
1 radian = (180 degree) / π
; ==> 1 radian 당 교환비율 degree (180 / π)
1 degree = (π radian) / 180
; ==> 1 degree당 radian 교환비율 (π / 180)
삼각 함수(Trigonometric Function)
-
사인(Sine, sin)
-
직각삼각형에서 각도에 대한 대변/빗변 비율
-
각도의 y 좌표를 나타냄
-
-
코사인(Cosine, cos)
-
직각삼각형에서 인접변/빗변 비율
-
각도의 x 좌표를 나타냄
-
-
탄젠트(Tangent, tan)
-
직각삼각형에서 대변/인접변 비율
-
sin(x) / cos(x)
-
역삼각 함수(Inverse Trigonometric Function)
-
삼각함수의 값으로부터 원래 각도를 찾아내는 수학적 도구
-
삼각함수 앞에 arc를 붙여 사용함
- 단위 원(Unit Circle)에서 각도(내적)와 호의 길이를 연결함
관련 함수
- 라디안과 각도 변환
// 각도를 라디안으로 변환
function degreesToRadians(degrees) {
return degrees * (Math.PI / 180);
}
// 라디안을 각도로 변환
function radiansToDegrees(radians) {
return radians * (180 / Math.PI);
}
- 원점(0, 0)을 중심으로 각도만큼 회전하였을 때의 위치를 알려주는 함수
// 점 회전 함수
function rotatePoint(x, y, angleDegrees) {
// 라디안으로 변환
const angleRadians = angleDegrees * (Math.PI / 180);
// 회전 행렬 적용
const newX = x * Math.cos(angleRadians) - y * Math.sin(angleRadians);
const newY = x * Math.sin(angleRadians) + y * Math.cos(angleRadians);
return { x: newX, y: newY };
}
- 두 백터(크기와 방향이 있는 양) 사이의 각도를 계산해주는 함수
// 벡터 사이의 각도 계산
function vectorAngle(x1, y1, x2, y2) {
// 두 벡터 사이의 각도(내적(Dot Product)) 계산
const dotProduct = x1 * x2 + y1 * y2;
// 피타고라스 정리를 사용하여 벡터의 길이를 구함
const magnitude1 = Math.sqrt(x1**2 + y1**2);
const magnitude2 = Math.sqrt(x2**2 + y2**2);
// 내적을 두 벡터 크기의 곱으로 나눕
let cosAngle = dotProduct / (magnitude1 * magnitude2);
// 부동소수점 오차 처리
cosAngle = Math.max(Math.min(cosAngle, 1), -1);
// Math.acos()로 아크코사인 계산 (라디안)
const angleRadians = Math.acos(cosAngle);
// 라디안을 도로 변환
return angleRadians * (180 / Math.PI);
}
-
미리 계산된 삼각함수 값을 저장하여 계산 속도 개선해주는 함수
-
반복적으로 삼각함수 값을 계산해야 하는 성능 중요한 애플리케이션에 유용
class TrigLookupTable {
constructor(precision = 1) {
this.sinTable = {};
this.cosTable = {};
// 0도부터 360도까지 룩업 테이블 생성
for (let angle = 0; angle <= 360; angle += precision) {
const radians = angle * (Math.PI / 180);
this.sinTable[angle] = Math.sin(radians);
this.cosTable[angle] = Math.cos(radians);
}
}
// 가장 가까운 각도의 sin 값 반환
sin(angle) {
const roundedAngle = Math.round(angle);
return this.sinTable[roundedAngle] || Math.sin(angle * (Math.PI / 180));
}
// 가장 가까운 각도의 cos 값 반환
cos(angle) {
const roundedAngle = Math.round(angle);
return this.cosTable[roundedAngle] || Math.cos(angle * (Math.PI / 180));
}
}
성능 고려사항
-
삼각함수 계산은 상대적으로 계산 비용이 높음
-
반복적인 계산이 필요한 경우 미리 계산된 값을 캐시하거나 룩업 테이블을 사용하는 것이 좋음
-
성능에 민감한 애플리케이션에서는 근사값 사용 고려