2010-12-14 46 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

相關問題