2010-07-14 3 views
1

나는 실제로 미터로 측정 된 반경을 가진 latlon 위치 인 원을가집니다. 또한 도로 A-B는 두 개의 위도 경도로 정의됩니다. 그 길이 원 안에서 교차하는지 아닌지 어떻게 알 수 있습니까? xy 위치에 투영 latlon 위치없이 가능합니까? 가능하다면 어떻게하는지 말해주십시오. 나는 실제로 네비게이션 소프트웨어에서 스냅 - 투 -로드 기능을 구현하려고하고있다. 그래서 이것은 숙제가 아니며 곧 사용할 수있는 절차는 수학에서 나쁘기 때문에 대단히 감사하겠습니다.원과 선분 교차점 탐지 (LatLon 점, 미터 반경 및 LatLon 선)

감사합니다.

답변

2

나는 위도 - 길이 표현을 모른다.
하지만 일반적으로이 질문에는 높은 수학이 필요하지 않습니다.
먼저 A와 B 사이의 선 방정식을 작성하십시오 (L1 선 호출).
그런 다음 원의 중심을 통과하는 L1에 대한 수직선의 방정식을 찾습니다 (L2라고 함).
두 방정식의 교차점을 찾고 교차점이 원 안에 있는지 그리고 [A-B]에 있는지 확인하십시오.

+0

@Italy, 내 수학은 덤프입니다. 나는 선의 방정식을 만드는 법을 모른다. 더 많은 힌트 pls? – VOX

+0

@VOX : Google에 시도 했습니까? –

+0

예. 지금까지, phew ... – VOX

0

Itay의 솔루션은 우아하고 많은 매트가 필요하지 않습니다.

당신은 그러나 더 순진 (CPU 무거운) 구현을 위해 갈 수 :

포인트의 배열로 라인을 다음 원의 중심에 각 점에서의 거리를 측정 :

방법 (I는이 메소드 간단히 테스트 한) 좌표의 배열로 광고의 모든 포인트에 원형의 중심으로부터의 거리를 계산하기

public static Point[] generatePath(int startX, int startY, int endX, int endY) { 
     _deltaX = Math.Abs(endX - startX); 
     _deltaY = Math.Abs(endY - startY); 
     if (_deltaX >=_deltaY) { 
     //x is independent variable 
     _numpixels = _deltaX + 1; 
     _d = (2 * _deltaY) - _deltaY; 
     _dinc1 = _deltaY << 1; 
     _dinc2 = (_deltaY - _deltaX) << 1; 
     _xinc1 = 1; 
     _xinc2 = 1; 
     _yinc1 = 0; 
     _yinc2 = 1; 
     } else { 
     //y is independent variable 
     _numpixels = _deltaY + 1; 
     _d = (2 * _deltaX) - _deltaY; 
     _dinc1 = _deltaX << 1; 
     _dinc2 = (_deltaX - _deltaY) << 1; 
     _xinc1 = 0; 
     _xinc2 = 1; 
     _yinc1 = 1; 
     _yinc2 = 1; 
     } 
     // Make sure x and y move in the right directions 
     if (startX > endX) { 
     _xinc1 = -_xinc1; 
     _xinc2 = -_xinc2; 
     } 
     if (startY > endY) { 
     _yinc1 = -_yinc1; 
     _yinc2 = -_yinc2; 
     } 
     _x = startX; 
     _y = startY; 
     Point[] returnPath = new Point[_numpixels]; 
     for (int i = 0;i < _numpixels;i++) { 
     returnPath[i].X =_x; 
     returnPath[i].Y =_y; 
     if (_d < 0) { 
      _d = _d + _dinc1; 
      _x = _x + _xinc1; 
      _y = _y + _yinc1; 
     } else { 
      _d = _d + _dinc2; 
      _x = _x + _xinc2; 
      _y = _y + _yinc2; 
     } 
     } 
     return returnPath; 
    } 

방법을 두 점을 변형 :

public static double GetLenghtBetweenPoints(Point Source, Point Distination) { 
     return Math.Sqrt((Math.Pow((Source.X-Distination.X), 2) + Math.Pow((Source.Y-Distination.Y), 2))); 
    } 
+0

을 보시면 저에게 맞지 않을 것입니다. 나는 .NET CPU에서 적은 CPU 전력 장치를 사용하고 있습니다. 그러나 어쨌든 고마워. – VOX