圆和线段交点检测(LatLon点,Meter Radius和LatLon线)

时间:2010-07-14 11:13:47

标签: c# geometry navigation gps

我有一个实际上是latlon位置的圆,其半径以米为单位。而且我还有一条A-B路被定义为两个lat-lon位置。如何确定该道路是否在圆圈内交叉。没有投影latlon位置进入xy位置是否可能?如果可能的话请告诉我该怎么做。我实际上是想在导航软件中实现一种即用型功能。所以这不是一个功课,直接可用的程序非常受欢迎,因为我的数学非常糟糕。

感谢。

2 个答案:

答案 0 :(得分:2)

我不知道长期代表。
但是 - 一般来说这个问题并不需要很高的数学性能 首先建立A到B之间的线的等式(称为线L1) 然后找到穿过圆心的L1垂线的方程(称之为L2) 然后找到两个方程的交点,检查交点是否在圆内并且是否在[A-B]中。

答案 1 :(得分:0)

Itay's,解决方案优雅,不需要太多垫子。

然而,您可以采用更天真(CPU重)的实现:

将你的线条变成一个点阵列,然后测量从每个点到圆圈中心的距离:

将两个点转换为坐标数组的方法(我只是简单地测试了这个方法)

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