2009-11-29 4 views
0

노스 사우스 이스트 웨스트 방향의 논리를 사용하여 선분 (lx1, ly1) (lx2, ly2)과 관련하여 2D 그래프에서 점 (px, py)의 위치를 ​​확인하려고합니다. . 내가 구현 한 논리는 점에서 선분에 직각을 그리는 것입니다.2D 수학 지리적 방향

수직선이 온라인이면 그 남쪽을 의미합니다.

오른쪽의 점이 동쪽을 가리키는 경우.

왼쪽의 점이 서쪽을 의미하면.

수직선이 정방향으로 선에서 벗어난다면 북쪽을 의미합니다.

수직선이 역방향으로 선에서 멀어지면 남쪽을 의미합니다.

내 논리는이 논리가 용지에서 좋게 보이지만 NW, NE, SW 또는 SE의 경우를 결정하는 것이 어렵다는 것입니다. 아무도 나 에게이 논리를 계산하는 방법을 제안 할 수 있습니까 ?? 나는 C++을 사용하고 있지만 어떤 언어의 알고리즘이든 큰 도움이 될 것입니다.

북동쪽 서쪽 관계를 계산하기 위해 선분 끝점을 사용하고 있습니다.

건배

답변

1
  • delta_x = x2 - x1
  • delta_y = y2 - y1
  • distance = sqrt (delta_x^2 + delta_y^2)
  • tan (theta) = delta_y/delta_x
  • theta = arctan (delta_y/delta_x); 하지만 0으로 나누지 마십시오!
  • 180/PItheta 곱셈하여도

도는 X 축의 양 측으로부터 반 시계 방향 도착. 결국 0을 (오른쪽 대신에) 올리고 시계 방향으로 돌리려면 각도를 재 지정하기 위해 적은 양의 대수를 사용해야합니다. 하지만 그 전에 :

문제는 arctan (1/-1)arctan (-1/1)과 같습니다. I.의 경우 왼쪽 상단 (180도 오프셋 필요)과 오른쪽 하단 (모두 괜찮음)에 대해 -PI/4 라디안 또는 -45도를 얻게됩니다. delta_ydelta_x의 테스트를 수행해야 arctan의 결과를 조정해야하는지 확인해야합니다.

솔루션을 코딩하기 전에 호출하는 함수가 예상 값을 생성하는지 테스트하기 위해 코드를 작성해야합니다.

+1

대부분의 수학 라이브러리에서 사용할 수있는 atan2() 함수 호출을 사용하면 0으로 나누기 문제를 피할 수 있습니다. – ndim

+0

아, 각도를 라디안으로 지정하면 (arctan()처럼) '2 * PI'를 곱하는 대신 '180/PI'를 곱하여 각도를 얻습니다. – ndim

+0

안녕 얘들 아, 고맙습니다. 나는이 제안을 시도하고 당신을 업데이트 할 것입니다. – Zinx

0

"북쪽"또는 "NE"또는 선분의 ​​"동쪽"실제로 불분명의 의미의 의미.

"북쪽"또는 "동쪽"또는 "NE"와 같은 길 찾기는 일반적으로 다른 (기본) 지점을 기준으로 한 지점의 위치를 ​​설명하는 데 사용됩니다. 해당 기준점으로 사용하는 선분의 ​​포인트는 무엇입니까?

편집 : 지금 당신이 말하는 것을 당신은 나침반, (x,y) 델타 벡터 (x-x2,y-y2)를 검사하여 나침반을 기준으로 위치 할 점에 대한 중심점으로 엔드 포인트 (x2,y2)를 사용하고 싶습니다.

델타 벡터에서 atan2()을 사용하는 이유는 쉽게 알 수 있으며 atan2()에 의해 반환 된 각도를 고려합니다.

그러나 인수를 atan2()과 비교하여 그로부터 각도 범위를 결정하는 것도 좋은 방법 일 수 있습니다. 이것은 기본적으로 컴파일 타임에 (또는 그 전에) 계산을 수행해야하는 비용으로 런타임에 atan2()을 호출하는 것을 피합니다.

+0

안녕하세요, 나는 그 관계에 대해 선분 세그먼트를 사용하고 있습니다. – Zinx

1

나는 ndim에 동정한다. 한 지점에서 다른 지점으로 방향을 계산하는 것은 쉽습니다. 나는 어떤 상황에서 당신이 한 줄로 방향을 바꿀 필요가 있는지 이해하지 못합니다. 매핑 애플리케이션입니까? 도로가 있습니까? 도로 구간을 따라 도중에 약 지점이 있습니다.

+0

안녕하세요, 네, 길거리 게임입니다. 당신은 지점에서 다른 지점으로 방향을 계산하는 방법을 알려주시겠습니까 ??? – Zinx