>백엔드 개발 >C++ >2차원과 3차원 모두에서 두 벡터 사이의 시계 방향 각도를 어떻게 직접 계산할 수 있습니까?

2차원과 3차원 모두에서 두 벡터 사이의 시계 방향 각도를 어떻게 직접 계산할 수 있습니까?

DDD
DDD원래의
2024-12-07 21:33:15364검색

How can you directly compute the clockwise angle between two vectors in both two and three dimensions?

벡터 사이의 시계 방향 각도를 직접 계산하는 방법

2차원 벡터를 다룰 때 행렬식을 사용하여 시계 방향 각도를 직접 계산할 수 있습니다. 그리고 내적. 내적은 코사인에 대한 정보를 제공하는 반면, 행렬식은 각도의 사인을 나타냅니다. atan2 함수를 활용하면 다음과 같이 시계 방향 각도를 얻을 수 있습니다.

dot = x1*x2 + y1*y2  # Dot product of [x1, y1] and [x2, y2]
det = x1*y2 - y1*x2  # Determinant
angle = atan2(det, dot)  # Clockwise angle

각도의 방향이 좌표계와 일치한다는 점에 유의하세요. 오른손잡이 시스템(x 오른쪽, y 아래)의 경우 시계 방향 각도는 양수 값을 생성합니다. 입력 순서를 바꾸면 각도의 부호가 변경됩니다.

벡터가 임의의 평면을 따라 있을 수 있는 3차원에서 회전축도 임의적입니다. 일반적으로 각도는 양수 각도로 간주되며 축은 양수 각도를 향합니다. 그런 다음 정규화된 벡터 간의 내적을 통해 각도를 결정할 수 있습니다.

dot = x1*x2 + y1*y2 + z1*z2  # Dot product of [x1, y1, z1] and [x2, y2, z2]
lenSq1 = x1*x1 + y1*y1 + z1*z1  # Squared length of vector 1
lenSq2 = x2*x2 + y2*y2 + z2*z2  # Squared length of vector 2
angle = acos(dot/sqrt(lenSq1 * lenSq2))  # Clockwise angle

벡터가 알려진 평면 내에 있는 경우 평면의 법선 벡터를 행렬식에 통합하여 수정된 2D 계산을 사용할 수 있습니다.

dot = x1*x2 + y1*y2 + z1*z2
det = n * (v1 × v2)  # Triple product
angle = atan2(det, dot)

여기서 n은 단위 길이 법선 벡터입니다.

다음을 보장하기 위해 조정이 필요할 수 있습니다. 각도가 원하는 범위(예: [0, 360°]) 내에 들어갑니다. 음수 결과에 2π를 추가하거나 atan2(-det, -dot) π를 사용하면 그에 따라 각도를 조정할 수 있습니다.

위 내용은 2차원과 3차원 모두에서 두 벡터 사이의 시계 방향 각도를 어떻게 직접 계산할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.