"Mathf.Atan2"(y, x)
이 함수는 두 축 y와 x에 대한 **아크탄젠트** 값을 계산합니다.
즉, 원점에서 (x,y)까지의 벡터가 X축과 이루는 각도를 라디안 단위로 반환합니다. 이 각도는 원점을 중심으로 한 반 시계방향의 회전으로 측정되며, 반환 값의 범위는 −π부터 +π까지 입니다.
"Mathf.Atan2"은 벡터가 가리키는 방향의 각도를 얻기 위해 주로 사용됩니다. 예를들어
오른쪽을 가리키는 Vector는 0 라디안, 왼쪽은 π라디안,
위쪽은 π/2 라디안, 아래쪽은 -π/2 으로 라디안의 각도를 반환합니다.
이 각도들을 반환하기 위해 사용하는 변환 계수는 바로
"Mathf.Rad2Def"입니다.
이 상수는 라디안을 도로 변환하며, 1 라디안은 약 57.2958도와 같습니다.
만약 "Mathf.Atan2" 에서 계산한 각도가 π/2 라디안이라면, 이를 도로 반환하기위해 "Mathf.Rad2Def"를 곱해 약 90도가 됩니다.
결과적으로 이 두계산을 연결하여 사용하면 2D Vector가 가리키는 방향의 각도를 도 단위로 얻을수 있으며, 이는 3D 게임에서 플레이어나 오브젝트의 회전을 처리할 떄 유용하게 사용됩니다.
=======================
참고로 π 라디안은 180도를 의미합니다. π/2는 90도이구요.
이는 원의 전체 둘레를 1 라디안으로 나누었을때 2π라디안이 되어 이것은 360도와 같아지는 원의 라디안 측정 방식에서 유래했습니다.
따라서 π 라디안은 원의 반을 나타내므로 180도입니다. π/2는 원의 4분의 1이므로 90도 이구요. 그래서 "Mathf.Atan2"에서 얻은 결과를 "Mathf.Rad2D탄eg"에 곱하면 라디안을 도로 반환할수있는것입니다.
마무리
즉 atan2(y, x)는 항상 y/x 탄젠트 비율을 취해 결과 각도가 원점에서 해당 벡터까지 방향을 정확히 나타내도록 4/4분면을 고려합니다. 그러므로 x,y값이 모두 일때를 제외하면 항상 올바른 사분면에서 각도를 반합니다.
atan함수와 달리 atan2는 이렇게 적절한 각도를 제공하기에, 360도 or (2π라디안) 전체 각도 정보를 제공할수있습니다.
참고로 Mathf.Atan()은 분모가 절대로 0이 되지않는 경우에만 사용하며 잘 사용되지않습니다.
"탄젠트"
탄젠트란 직각 삼각형의 높이를 밑변의 길이로 나눈 값이고, 좌표평면상에서 직선의 기울기를 나타냅니다.
그러므로 아크탄젠트(atan)은 탄젠트 함수의 역함수입니다.
높이를 밑변으로 나눠 구해진 탄젠트에 주어진 각의 비율을 제공하면 아크탄젠트는 그 비율을 각도로 변환해줍니다.
tan(θ) = y/x = sin θ / cos θ
tan(θ) y/x 라고 할 때, θ = atans2(y, x)를 사용해 'θ'각도를 찾습니다.
탄젠트의 함수 그래프
예제
예를들어 앞으로 나아간다고 가정해보겠습니다.
W키를 누르면 (0,1)이 반환됩니다. (여기서 'y'축은 3D의 'z'축입니다.)
그러면 Mathf.Atan2(y,x)에 y에는 1이 들어오게 될겁니다. 이는 (0, 1) 좌표를 얻는 것과 동일합니다.
그러면 정면방향(Z)로 가면 90도가 반환될것입니다.
//벡터에서 각도로 변환
Vector => Degree
public static double Vector2ToDegree(Vector2 vec)
{
double radian = Math.Atan2(vec.y, vec.x)
return (radian * 180.0 / Mathf.PI);
}
//벡터를 라디안으로 변환
Vector2 => Radian
public static double VectorToRadian(Vector2 vec)
{
return Mathf.Atan2(vec.y, vec.x);
}
//라디안을 각도로 변환
Radian => Degree
public static double RadianToDegree(double radian)
{
return (radian * 180 / Mathf.PI)
}
//각도를 라디안으로 변환
Degree => Radian
public static double DegreeToRadian(double degree)
{
return (Mathf.PI / 180) * degree;
}
private float x,y;
//월드 좌표로 회전
public void RotateToWorld(double angle)
{
double radian = Util.DegreeToRadian(angle)
x = (float)(x * Math.Cos(radian) - y * Math.Sin(radian));
y = (float)(x * Math.Sin(radian) + y * Math.Cos(radain));
}
//로컬 좌표로 회전
public void RotateToLocal(double angle, jdVector2 center)
{
Translate(center *-1);
RotateToWorld(angle);
Translate(center);
{
두 점 사이의 각도 구하기
예제1
두 점 A와 B가 있다.
A(x1 ,y1), B(x2, y2)
B에서 A로의 벡터는 (x2 - x1), (y2 - y1)
이때 각도를 구하기 위해 Mathf.Atan2 사용
float angleInRaidans = Mathf.Atan2(y2 - y1, x2 - x1);
float angleInDegrees = angleInRadians * Mathf.Rad2Deg;
즉, 'B'에서 'A'로의 벡터의 각도를 계산했고, 그 각도를 라디안에서 도로 반환한 값이다.
이 각도의 값은 'B'가 'A'를 바라보는 방향의 각도.
=======================================================
예제2
두 벡터 V1(x1, y1) V2(x2, y2)가 있다.
"V1과 V2" 사이의 각도를 찾으려면 다음과 같이 계산
float angleBetweenVectorsInRadians = Mathf.Atan2(y2, x2) - Mathf.Atan(y1, x1);
float angleBetweenVectorsInDegrees = angleBetweenVectorsInRadians * Mathf.Rad2Deg;
이코드는 V1에서 V2까지 벡터 각도를 라디안으로 계산하고, 그 값을 도로 반환한 값이다.
이 각도는 V1이 V2방향으로 얼마나 회전해야 하는지 나타냅니다.
마무리
Mathf.Atan2와 Math.Rad2Deg는 주로 다음과 같은 상황에서 사용된다.
1. 2D 게임 개발: 게임 내 객체가 다른 객체나 특정 위치를 바라보도록할 때이다. 예를들면 커서에 따라 방향을 바꾸는 경우이다.
2. 3D 게임 개발: 카메라나 캐릭터가 특정 대상을 바라보도록 설정할때, 예를들어 타겟팅 시스템에서 자동으로 포커싱을 맞추는 경우.
3. 로봇공학과 자동화: 로봇 팔이나 기계장치가 특정 방향으로 정확히 회전해야할 때 각도를 계산
4. 물리 시물레이션: 힘의 방향이나 속도 벡터 방향 계산시 사용
5. 네비게이션 및 지도: GPS좌표를 기반으로 한 방향 계산에 사용되며, 어떤 방향으로 가야할지를 사용자에게 알려줄 때 쓰인다.
6. 그래픽스와 애니메이션: 개겣가 다른 객체를 따라가거나 바라보도록 애니메이션을 만들 때 사용.
이외에 UI/UX 디자인, 인공지능과 기계 학습에서 사용된다.