Обнаружение пересечения отрезков окружности и линии (точка LatLon, радиус метра и линия LatLon) - PullRequest
1 голос
/ 14 июля 2010

У меня есть круг, который на самом деле представляет собой позицию латлона с радиусом, измеренным в метрах. И у меня также есть дорога A-B, определенная как две широтные позиции. Как мне найти, пересекает ли эта дорога внутри круга или нет. Возможно ли это без проекции положения латлона в позиции xy? Если возможно, пожалуйста, скажите мне, как это сделать. Я на самом деле пытаюсь реализовать функциональность Snap-to-Road в навигационном программном обеспечении. Так что это не домашнее задание, и прямолинейная процедура очень полезна, так как я очень плохо разбираюсь в математике.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 14 июля 2010

Я не знаю лат-длинное представление.
Но - в общем, этот вопрос не требует высокой математики.
Сначала построите уравнение Линии между A и B (назовите линию L1).
Затем найдите уравнение перпендикулярной линии к L1, проходящей через центр круга (назовите это L2).
Затем найдите пересечение двух уравнений и проверьте, находится ли точка пересечения внутри окружности и находится ли она в [A-B].

0 голосов
/ 14 июля 2010

Итай, решение элегантно и не требует больших затрат.

Однако вы можете пойти на более наивную (загруженную ЦП) реализацию:

превратит вашу линию в массив точекзатем измерьте расстояние от каждой точки до центра вашего круга:

Метод преобразования двух точек в массив координат (я только кратко проверил этот метод)

 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)));
    }
...