【发布时间】:2010-07-14 11:13:47
【问题描述】:
我有一个圆,它实际上是一个纬度位置,半径以米为单位。而且我还有一条道路 A-B 定义为两个经纬度位置。我如何找到那条路是否在圆圈内交叉。是否可以不将纬度位置投影到 xy 位置?如果可能,请告诉我该怎么做。我实际上是在尝试在导航软件中实现快速上路功能。所以这不是家庭作业,非常感谢直接可用的程序,因为我的数学很差。
谢谢。
【问题讨论】:
标签: c# geometry navigation gps
我有一个圆,它实际上是一个纬度位置,半径以米为单位。而且我还有一条道路 A-B 定义为两个经纬度位置。我如何找到那条路是否在圆圈内交叉。是否可以不将纬度位置投影到 xy 位置?如果可能,请告诉我该怎么做。我实际上是在尝试在导航软件中实现快速上路功能。所以这不是家庭作业,非常感谢直接可用的程序,因为我的数学很差。
谢谢。
【问题讨论】:
标签: c# geometry navigation gps
我不知道经纬度表示。
但是 - 一般来说,这个问题不需要很高的数学。
首先建立 A 到 B 之间的直线方程(称为直线 L1)。
然后找到通过圆心的 L1 的垂线方程(称为 L2)。
然后找到两个方程的交点,并检查交点是否在圆内,是否在[A-B]中。
【讨论】:
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)));
}
【讨论】: