삼각비와 삼각함수
삼각비란?
- 직각삼각형에서 각도와 변의 길이 사이의 관계를 나타내는 말.
- 삼각비는 사인(sin), 코사인(cos), 탄젠트(tan)의 세 가지 기본적인 함수(삼각함수)로 표현함.
- 값을 모르는 특정 각을 표현함(각도)를 "세타(θ)" 로 표현함
삼각함수란?
- 삼각함수는 각도와 관련된 함수로, 주로 직각삼각형의 변의 비율을 설명하는 데 사용함.
- 특정 값을 입력하면 삼각비의 결과를 반환하는 함수라고 볼 수 있음.
- 사인 (sin): 직각삼각형에서 주어진 각 θ를 반대변의 길이를 빗변의 길이로 나눈 비율 (높이 / 빗변)
- 코사인 (cos): 직각삼각형에서 주어진 각 θ의 인접변의 길이를 빗변의 길이로 나눈 비율 (밑변 / 빗변)
- 탄젠트 (tan): 직각삼각형에서 주어진 각 θ의 반대변의 길이를 인접변의 길이로 나눈 비율 (높이 / 밑변)
θ = 0 | θ = 45 | θ = 90 | |
sin(θ) | 0 | \( \frac{\sqrt{2}}{2} \) | 1 |
cos(θ) | 1 | \( \frac{\sqrt{2}}{2} \) | 0 |
tan(θ) | 0 | 1 | ∞(0을 나눠야 함) |
유니티에서의 활용 예시
- 삼각함수를 활용하면 나와 적 오브젝트와의 거리를 계산하거나 각도를 받아와 여러 방면에서 활용이 가능하다.
- 플레이어의 위치 좌표가 (0,0)일때 적 캐릭터 와의 거리를 받아오자.
- 직선의 거리일 경우에는 눈금을 보면 쉽게 계산이 가능하지만 대각선의 길이는 삼각 함수를 이용해 거리를 구해야 한다.
public void GetSinAngle()
{
var enemyDistance = Mathf.Sqrt(Mathf.Pow(enemyTransform.position.x, 2) + Mathf.Pow(enemyTransform.position.z, 2)); // 빗변의 길이
Debug.Log("enemyDistance = " + enemyDistance);
var sinTheta = enemyTransform.position.z / enemyDistance;
var arcSin = Mathf.Asin(sinTheta);
Debug.Log("Theta = " + arcSin * Mathf.Rad2Deg);
}
대각선의 길이(적과 나와의 거리)
- 적 오브젝트와 나와의 거리를 변수 enemyDistance로 받아온다.
- 피타고라스 정리를 이용해 적 오브젝트와 나와의 대각선의 길이를 구한다.
- 가로 길이는 enemyTransform의 position 값의 x축이고, 세로는 z축이다.
- Mathf.Sqrt 함수를 이용해 제곱근을 구해주고 Mathf.Pow 함수를 이용해 해당 값의 제곱을 계산 한다.
- Debug.Log를 이용해 해당 값을 받아온다.
각도(적과 나와의 각도)
- sin(θ) = (높이/빗변) 임.
- 높이의 경우는 세로값이므로 조금 전에 알아낸 enemyTransform의 position 값의 z축이고, 빗변의 경우는 조금전에 계산한 대각선의 길이(enemyDistance) 임.
- 해당 값을 sinTheta에 저장하고 Mathf.Asin 함수를 이용해 아크사인(역사인)을 계산하는 데 사용함. (반환값은 라디안*임)
라디안은 원의 반지름 만큼 길이를 가진 호로 나눈 단위임. 각도를 표기할때 degree를 보통 사용하지만 수학에서는 라디안을 사용하는 경우도 있음. (360도 = 2πrad // 1rad = 57.2958도 정도)
- 해당 라디안 값을 degree 값으로 변환하기 위해 arcSin 값을 Mathf.Rad2Deg 함수를 이용해 몇도 인지 확인함.
적과의 거리는 7.61정도, 각도는 66.8 도 라고 잘 나오는것을 확인할 수 있음.
사실 유니티에는 Vector3.Distance 함수와 Vector3.Angle 함수를 이용해 간단하게 원하는 오브젝트와의 거리와 각도를 언제든 호출할 수 있음.
(Vector3.Angle의 경우는 Vector에 대한 개념이 필요하기 때문에 다른 글에서 정의하도록 하겠음.)
Vector3.Distance 함수는 간단하게 내 위치와 적의 위치값을 입력하면 거리를 반환해 줌.
public void GetDistance()
{
var enemyDistance = Mathf.Sqrt(Mathf.Pow(enemyTransform.position.x, 2) + Mathf.Pow(enemyTransform.position.z, 2)); // 빗변의 길이
Debug.Log("enemyDistance = " + enemyDistance);
var unityDistance = Vector3.Distance(transform.position, enemyTransform.position);
Debug.Log("unityDistance = " + unityDistance);
}
매번 Vector3.Distance 를 사용했지만 삼각함수를 이용해 해당 원리를 직접 한번 구현해 보는것은 한번쯤은 직접 코딩 해보는 것이 좋다고 생각함.
그림 출처 : https://news.samsungdisplay.com/24578/
과학·공학의 필수! 주기를 그리는 '삼각함수'
고대 문명에서 발견된 삼각형의 진리 기원전 4,000년경, 티그리스강과 유프라테스강 사이에 형성된 넓고 비옥한 평야에서 세계 4대 문명 중 하나인 메소포타미아 문명이 탄생한다. 메소포타미
news.samsungdisplay.com