可能重复:
点和线段之间的最短距离
我正在寻找一种在所有情况下计算最小距离的方法.我找到的解决方案的问题是:
带有图形概念图的解决方案显示点始终与线段垂直,因此它"在线段的端点之间".我的几何技能太可怕了,所以我无法验证这些解决方案是否适用于所有情况.
算法解决方案是:使用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)
如果你有线路
长: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)在间隔上,那么答案就是距离就是它。否则两个距离的最小值。
| 归档时间: |
|
| 查看次数: |
35527 次 |
| 最近记录: |