如何计算C,C#/ .NET 2.0或Java中所有情况下点和线段之间的最短2D距离?

可能重复:
点和线段之间的最短距离

我正在寻找一种计算所有情况下最小距离的方法。 我找到的解决方案的问题是:

  1. 带有图形概念图的解决方案显示点始终与线段垂直,因此它“在线段的端点之间”。 我的几何技能太可怕了,所以我无法validation这些解决方案是否适用于所有情况。

  2. 算法解决方案是:使用fortran或其他语言我不完全理解,b:被人们标记为不完整,c:调用未以任何方式描述的方法/函数(被认为是微不足道的)。

2 a,b和c的好例子是

点和线段之间的最短距离

我有2D线段作为双类型坐标对(x1,y1),(x2,y2)和点作为双类型坐标(x3,y3)。 C#/ Java / C解决方案都很受欢迎。

感谢您的回答和BR:Matti

还回答了点和线段之间的最短距离,因为它收集了所有语言的解决方案。 答案也放在这里,因为这个问题特别要求C#解决方案。 这是从http://www.topcoder.com/tc?d1=tutorials&d2=geometry1&module=Static修改的:

//Compute the dot product AB . BC private double DotProduct(double[] pointA, double[] pointB, double[] pointC) { double[] AB = new double[2]; double[] BC = new double[2]; AB[0] = pointB[0] - pointA[0]; AB[1] = pointB[1] - pointA[1]; BC[0] = pointC[0] - pointB[0]; BC[1] = pointC[1] - pointB[1]; double dot = AB[0] * BC[0] + AB[1] * BC[1]; return dot; } //Compute the cross product AB x AC private double CrossProduct(double[] pointA, double[] pointB, double[] pointC) { double[] AB = new double[2]; double[] AC = new double[2]; AB[0] = pointB[0] - pointA[0]; AB[1] = pointB[1] - pointA[1]; AC[0] = pointC[0] - pointA[0]; AC[1] = pointC[1] - pointA[1]; double cross = AB[0] * AC[1] - AB[1] * AC[0]; return cross; } //Compute the distance from A to B double Distance(double[] pointA, double[] pointB) { double d1 = pointA[0] - pointB[0]; double d2 = pointA[1] - pointB[1]; return Math.Sqrt(d1 * d1 + d2 * d2); } //Compute the distance from AB to C //if isSegment is true, AB is a segment, not a line. double LineToPointDistance2D(double[] pointA, double[] pointB, double[] pointC, bool isSegment) { double dist = CrossProduct(pointA, pointB, pointC) / Distance(pointA, pointB); if (isSegment) { double dot1 = DotProduct(pointA, pointB, pointC); if (dot1 > 0) return Distance(pointB, pointC); double dot2 = DotProduct(pointB, pointA, pointC); if (dot2 > 0) return Distance(pointA, pointC); } return Math.Abs(dist); } 

如果你有线

L: A * x + B * y + C = 0

然后,从该线到点(x1, y1)距离是abs(A * x1 + B * y1 + C) / sqrt(A * A + B * B) 。 在你的情况下,如果你有间隔, (xa, ya); (xb, yb) (xa, ya); (xb, yb)你应该找到min( distance(x1, y1, xa, ya), distance(x1, y1, xb, yb))然后看看从(x1, y1)到行L的从属是否在间隔上,然后答案就是它的距离。 否则最少两个距离。