문제

나는 당신에게 다소 간단한 질문이 있습니다. 나는 오래 전에 답을 찾아야한다고 생각하지만 어떻게 든이 사소한 문제에 머리를 감싸지 못합니다.

벡터 v = (x, y)가 주어지면 '일반적인'방향이라는 것을 알고 싶습니다. 그것은 'up', 'down', 'left'또는 'right'입니다.

벡터의 방향이 45 ~ 135 도인 경우 벡터의 일반 방향은 'UP'입니다. '왼쪽'은 135도에서 225도 사이입니다. '다운'은 225도에서 315도 사이입니다. '오른쪽'은 315도에서 45도 사이입니다.

나는 각도가 정확히 45, 135, 225 또는 315 도인 경우를 실제로 신경 쓰지 않습니다.

캐치는 삼각법을 사용하고 싶지 않습니다. 간단한 솔루션이 있다고 확신합니다.

솔루션이 전체 원을 8로 나눌 수 있다고 생각합니다. 지금까지 내가 가진 것이 있습니다.

if(x > 0 && y > x)
    return Up
if(x > 0 && y > 0 && y < x )
    return Right

... etc ...

기본적으로 솔루션을 찾을 수 있다는 것을 알고 있습니다. 나는이 문제에 대한 당신의 접근 방식에 더 관심이 있습니다.

감사 !

편집하다 : 사용 된 벡터는 정규화되지 않습니다. 한 쌍의 점을 사용하여 벡터를 나타낼 수 있습니다. 간단히 벡터의 원점이 (0,0) 인 척하는 척하십시오.

도움이 되었습니까?

해결책

실제로 방법이 있습니다. ABS (y)> abs (x) 인 경우 방향이 수직이라는 점에서 알아야 할 것은 방향이 수평이라는 것입니다. 수직이면 Y의 부호는 위/아래로 표시되며 그렇지 않으면 X의 부호는 왼쪽/오른쪽을 나타냅니다. 그래서:

if (abs(y) > abs(x)) {
  if (y > 0) up else down
} else {
  if (x > 0) right else left
}

45ish 각도는 항상 왼쪽 또는 오른쪽으로갑니다.

다른 팁

나는 당신이 Trig를 피하고 싶다고 말했지만 당신은 ATAN2 기능? 벡터의 각도를 결정하는 데 사용하기 쉽습니다.

double ldAngle = atan2(vector.y, vector.x) * 180 / PI;

정규화 된 벡터 공간을 가정합니다 (편집하다: 벡터가 구성되어 있음을 의미합니다 단위 벡터) 당신이하는 것처럼 보이면, 당신의 접근 방식은 자리를 잡고 있으며 2D 게임과 애니메이션에 가장 많이 사용됩니다. 그러나 나는 당신의 진실 테이블을 확인합니다.

@Daniel의 접근 방식은 더 우아한 IMO입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top