2014-06-17 6 views
1

원호의 시작, 중간 및 끝 (a, mb)을 나타내는 원에 있다고 알고있는 3 점이 있습니다. 또한 시계 반대 방향으로 양의 X 축에서이 점의 각도를 가지고 -pi < theta < pi을 가지므로 중심에서 점까지의 세 벡터 중 atan2(y,x)을 사용합니다.세 점/각도 중에서 호의 시작과 끝을 확인하십시오.

나는 또한 포인트가 m이고, 알고 싶은 것은 ab이 호의 시계 방향 끝인지 여부를 알고 있습니다.

나는 포인트가 배열 될 수 8 가지 방법이 있다는 것을 볼 수 있습니다

: 처음 네는 "끝"과 "시작"으로 b 후자 네 가지로 a이 다른 있습니다

"East"  "West"  "East" 
0   -pi | pi  0 
---------------+------------- 
     a m b |   
      a m | b   
      a | m b 
       | a m b 


     b m a | 
      b m | a 
      b | m a 
       | b m a 

길 주변에. 약 0으로 둘러싼 주문은 오른쪽 또는 왼쪽에 표시 될 수 있으므로 기호는 도움이되지 않습니다.

운동이 시작이고 끝점은 깔끔한 방법이 있습니까? 큰, 고밀도의 if/else-if 블록에서 8 가지 옵션 각각의 상대 값을 힘들게 검사하는 것 외에는 그렇지 않습니다.

구현 언어는 Python이지만 언어 별 질문은 아닙니다.

답변

1

ma에서 b까지의 지시선 부분의 왼쪽에있는 경우 a은 반 시계 방향 끝입니다. 그렇지 않으면 시계 방향 끝입니다.

즉 벡터 ab의 왼쪽 수직선을 취해 am으로 해당 내적을 찾습니다. 내적이 양수이면 a가 CCW 끝점입니다.

덧붙여서, 각도를 다루는 가장 빠른 방법은 사용을 피하는 것입니다. 벡터 및 선형 대수학 외형 각도 및 삼각법. 요일.

+0

똑똑하고 간단합니다. 구현을위한 간단한 참고 사항, 90도 왼쪽 회전 (시계 방향)은 (x, y)를 (-y, x)로 변환합니다. 원하는 경우 전체 회전 행렬을 수행 할 수 있지만 더 빠릅니다! – Inductiveload