2010-12-14 63 views
3

可能重复:
Shortest distance between a point and a line segment如何计算C,C#/ .NET 2.0或Java中所有情况下点和线段之间的最短2D距离?

我正在寻找一种方法来计算在所有情况下的最小距离。的解决方案,我发现的问题是:与图形的概念图

  1. 解显示点总是在从垂直线段所以它的“线段的端点之间的”。我的几何技能非常糟糕,所以我无法验证这些解决方案在所有情况下都能正常工作。

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

的2个很好的例子,b和c是

Shortest distance between a point and a line segment

我有2D线段作为双型坐标对(X1,Y1),(X2,Y2 )并指向为双类型坐标(x3,y3)。 C#/ Java/C解决方案都值得赞赏。

谢谢您的回答& BR:马蒂

+2

我数实现在6种不同的语言这里:http://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line-segment – 2010-12-14 10:45:06

+0

@oded:你指哪一部分?它被问及答复了多少次?或者一开始没有“如何计算”?正如我所说的对不良搜索技能的道歉,但如果无法想象'如何计算'到一开始......好吧。你的链接是2帮助人们2互相理解。认为你完美地理解了我。 – 2010-12-14 10:55:02

+0

@tim:非常感谢你! – 2010-12-14 10:55:28

回答

0

如果你有行

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

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

15

也回答了Shortest distance between a point and a line segment,因为它收集所有语言的解决方案。答案也放在这里,因为这个问题具体要求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); 
} 
+4

Err,其中A,B,C点是线端点,哪个是实际奇异点?你应该正确地命名这些变量,并说明为什么我们使用名称而不是数字。 – 2012-12-05 00:16:54

+1

它在评论中。 A和B是线段或线段的顶点,C是有问题的点。一旦你明白了,单字母变量名称可以说是更具可读性。 – Nat 2014-03-30 16:41:45

+0

已验证。你可以使用'System.Windows.Point'和'System.Windows.Vector',这将大大简化代码。 – Gqqnbig 2014-05-14 12:24:19

相关问题