C# 求点与线段之间的最短距离
我需要找到点和线段之间的最短距离(点定义为xy,线定义为使用端点ax-ay和bx-by) 我已经写了一些代码,但对于某些参数似乎不起作用。我不确定是否只是某个地方出了点小错误,或者(更有可能)它的工作方式是根本错误的C# 求点与线段之间的最短距离,c#,geometry,distance,euclidean-distance,C#,Geometry,Distance,Euclidean Distance,我需要找到点和线段之间的最短距离(点定义为xy,线定义为使用端点ax-ay和bx-by) 我已经写了一些代码,但对于某些参数似乎不起作用。我不确定是否只是某个地方出了点小错误,或者(更有可能)它的工作方式是根本错误的 public static double GetDist(double ax, double ay, double bx, double by, double x, double y) { double Perpendicular = Math.Abs((by - ay)
public static double GetDist(double ax, double ay, double bx, double by, double x, double y)
{
double Perpendicular = Math.Abs((by - ay) * x - (bx - ax) * y + bx * ay - by * ax) /
Math.Sqrt((ay - by) * (ay - by) + (ax - bx) * (ax - bx));
double to_axay = Math.Sqrt((x - ax) * (x - ax) + (y - ay) * (y - ay));
double to_bxby = Math.Sqrt((x - bx) * (x - bx) + (y - by) * (y - by));
double dist1 = Math.Sqrt((x - ax) * (x - ax) + (y - ay) * (y - ay));
double dist2 = Math.Sqrt((bx - ax) * (bx - ax) + (by - ay) * (by - ay));
double theta1 = Math.Atan(dist1);
double theta2 = Math.Atan(dist2);
double angle = Math.Abs(theta2 - theta1);
if (angle > Math.PI)
angle = 2 * Math.PI - angle;
if (angle <= (1 / 2 * Math.PI))
return Perpendicular;
else
{
if (to_axay >= to_bxby)
return to_bxby;
else
return to_axay;
}
}
公共静态双GetDist(双ax、双ay、双bx、双by、双x、双y)
{
双垂线=数学绝对值((by-ay)*x-(bx-ax)*y+bx*ay-by*ax)/
数学Sqrt((ay-by)*(ay-by)+(ax-bx)*(ax-bx));
double to_axay=Math.Sqrt((x-ax)*(x-ax)+(y-ay)*(y-ay));
double to_bxby=Math.Sqrt((x-bx)*(x-bx)+(y-by)*(y-by));
double dist1=Math.Sqrt((x-ax)*(x-ax)+(y-ay)*(y-ay));
double dist2=Math.Sqrt((bx-ax)*(bx-ax)+(by-ay)*(by-ay));
双θ=Math.Atan(dist1);
双θ=Math.Atan(dist2);
双角度=数学绝对值(θ2-θ1);
如果(角度>数学PI)
角度=2*Math.PI-角度;
如果(角度=至_bxby)
返回_bxby;
其他的
返回_axay;
}
}
当它不工作时的示例:
x=0,y=30
ax=-30,ay=0
bx=30,by=0
预期结果是30。相反,我的程序返回42.4264。角度部分有一些错误,因此计算其中一端的结果(30*sqrt(2))。(请注意,您计算距离的atan,但参数应该是两个距离的比率。此外,这种方法存在atan范围等问题) 但是你不需要做三角计算。只需找到ba和bp向量的标量积和ab和ap向量的标量积 如果第一个为负(角度abp为钝角),则获取到b终点的距离。如果第二个为负值,则获取到a终点的距离 如果两者都为负值,则使用通过叉积计算的距离(您已经得到了它)。请注意,最后的距离可能在所有比较之后计算 :
公共静态双GetDist(双ax、双ay、双bx、,
双乘,双x,双y){
如果((ax-bx)*(x-bx)+(ay-by)*(y-by)如果x=0,y=30
和bx=0,by=30
,为什么预期结果30
?看起来点在直线上(与直线的端点在b处相同)所以结果应该是0
。或者我误解了something@RufusL很抱歉,在编写示例输入时出错。请立即修复。
public static double GetDist(double ax, double ay, double bx,
double by, double x, double y) {
if ((ax-bx)*(x-bx)+(ay-by)*(y-by) <= 0)
return Math.Sqrt((x - bx) * (x - bx) + (y - by) * (y - by));
if ((bx-ax)*(x-ax)+(by-ay)*(y-ay) <= 0)
return Math.Sqrt((x - ax) * (x - ax) + (y - ay) * (y - ay));
return Math.Abs((by - ay)*x - (bx - ax)*y + bx*ay - by*ax) /
Math.Sqrt((ay - by) * (ay - by) + (ax - bx) * (ax - bx));
}
public static void Main()
{
Console.WriteLine(GetDist(0, 2, 2, 0, 0, 0));
Console.WriteLine(GetDist(0, 2, 2, 0, 0, 3));
}
1.41421356237309
1