【问题标题】:Circle and Line Segment Intersection Detection (LatLon Point, Meter Radius and LatLon Line)圆和线段相交检测(纬度点、米半径和纬度长线)
【发布时间】:2010-07-14 11:13:47
【问题描述】:

我有一个圆,它实际上是一个纬度位置,半径以米为单位。而且我还有一条道路 A-B 定义为两个经纬度位置。我如何找到那条路是否在圆圈内交叉。是否可以不将纬度位置投影到 xy 位置?如果可能,请告诉我该怎么做。我实际上是在尝试在导航软件中实现快速上路功能。所以这不是家庭作业,非常感谢直接可用的程序,因为我的数学很差。

谢谢。

【问题讨论】:

    标签: c# geometry navigation gps


    【解决方案1】:

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

    【讨论】:

    • @Italy,我的数学是垃圾。我什至不知道如何建立直线方程。更多提示请?
    • @VOX:你用谷歌搜索了吗?
    • 看看维基百科 - 线方程
    【解决方案2】:

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

    但是,您可以选择更天真的(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)));
        }
    

    【讨论】:

    • 那真的不适合我。我在使用较少 CPU 功率设备的 .NET CF 上。不过还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-03-30
    • 2018-09-09
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    相关资源
    最近更新 更多