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

cha*_*r m 3 c# geometry

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

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

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

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

2 a,b和c的好例子是

点与线段之间的最短距离

我将2D线段作为双型坐标对(x1,y1),(x2,y2)并指向双型坐标(x3,y3).C#/ Java/C解决方案都很受欢迎.

感谢您的回答和BR:Matti

cha*_*r m 17

还回答了点和线段之间的最短距离,因为它收集了所有语言的解决方案.答案也放在这里,因为这个问题特别要求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);
} 
Run Code Online (Sandbox Code Playgroud)

  • Err,其中A,B,C点是线端点,它是实际的奇点?你应该正确命名vars,为什么我们使用名字而不是数字. (4认同)

Mih*_*yan 0

如果你有线路

长: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))然后看看从到直线L的垂直是否(x1, y1)在间隔上,那么答案就是距离就是它。否则两个距离的最小值。