역/삼각 함수

  • 삼각함수와 역삼각함수는 프로그래밍에서 수학적 계산, 그래픽스, 물리 시뮬레이션 등 다양한 분야에서 중요한 역할을 함

  • 프로그래밍 언어에서는 단위로 Radian 이 사용됨

  • 주기성 (Periodicity): 삼각 함수는 특정 주기를 가진 반복적인 함수

    • 대부분의 삼각 함수는 2π(약 6.28)를 주기로 가지며, 탄젠트와 코탄젠트는 π를 주기로 가짐
  • 삼각 항등식 (Trigonometric Identities): 삼각 함수들 사이의 관계를 나타내는 수학적 등식

    • 대표적으로 피타고라스 항등식(sin²θ + cos²θ = 1)이 있음

image

  • 단위 원 (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)

image

  • 사인(Sine, sin)

    • 직각삼각형에서 각도에 대한 대변/빗변 비율

    • 각도의 y 좌표를 나타냄

  • 코사인(Cosine, cos)

    • 직각삼각형에서 인접변/빗변 비율

    • 각도의 x 좌표를 나타냄

  • 탄젠트(Tangent, tan)

    • 직각삼각형에서 대변/인접변 비율

    • sin(x) / cos(x)

역삼각 함수(Inverse Trigonometric Function)

  • 삼각함수의 값으로부터 원래 각도를 찾아내는 수학적 도구

  • 삼각함수 앞에 arc를 붙여 사용함

image

  • 단위 원(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));  
    }  
}  

성능 고려사항

  • 삼각함수 계산은 상대적으로 계산 비용이 높음

  • 반복적인 계산이 필요한 경우 미리 계산된 값을 캐시하거나 룩업 테이블을 사용하는 것이 좋음

  • 성능에 민감한 애플리케이션에서는 근사값 사용 고려

Reference

WIKIPEDIA