【问题标题】:Finding shortest distance between a point and a line segment查找点和线段之间的最短距离
【发布时间】:2018-09-23 17:01:06
【问题描述】:

我需要找到点和线段之间的最短距离(点定义为 x y,线使用端点 ax ay 和 bx by 定义)。

我已经编写了一些代码,但它似乎不适用于某些参数。我不确定某处是否只是一些小错误,或者(更有可能)它的工作方式根本上是错误的。

public static double GetDist(double ax, double ay, double bx, double by, double x, double y)
{
    double Perpendicular = Math.Abs((by - ay) * x - (bx - ax) * y + bx * ay - by * ax) /
                           Math.Sqrt((ay - by) * (ay - by) + (ax - bx) * (ax - bx));
    double to_axay = Math.Sqrt((x - ax) * (x - ax) + (y - ay) * (y - ay));
    double to_bxby = Math.Sqrt((x - bx) * (x - bx) + (y - by) * (y - by));

    double dist1 = Math.Sqrt((x - ax) * (x - ax) + (y - ay) * (y - ay));
    double dist2 = Math.Sqrt((bx - ax) * (bx - ax) + (by - ay) * (by - ay));

    double theta1 = Math.Atan(dist1);
    double theta2 = Math.Atan(dist2);

    double angle = Math.Abs(theta2 - theta1);

    if (angle > Math.PI)
        angle = 2 * Math.PI - angle;

    if (angle <= (1 / 2 * Math.PI))
        return Perpendicular;
    else
    {
        if (to_axay >= to_bxby)
            return to_bxby;
        else
            return to_axay;
    }
}

不起作用时的示例:

x=0, y=30

ax=-30, ay=0

bx=30, by=0

预期结果是 30。我的程序改为返回 42.4264。

【问题讨论】:

  • 如果x=0, y=30bx=0, by=30,为什么预期的结果是30?似乎该点在 on 线上(与 b 处的线端点相同),因此结果应该是 0。或者也许我误解了什么
  • @RufusL 抱歉,在编写示例输入时出错。现在修复它们。

标签: c# geometry distance euclidean-distance


【解决方案1】:

您在角度部分有一些错误,因此计算结果是针对其中一个端点 (30*sqrt(2))。 (请注意,您计算距离的 atan,但参数应该是两个距离的比率。此外,这种方法存在 atan 范围等问题。

但您不需要进行三角计算。只需找到 babp 向量的标量积以及 abap 向量的标量积。

如果第一个是负数(角度abp是钝角),获取到b端的距离。如果第二个是负数,则距离 a 结束。

如果两者都是负数,则使用通过叉积计算的距离(您已经得到它)。请注意,可能会在所有比较之后计算最后的距离。

Checked code:

public static double GetDist(double ax, double ay, double bx, 
                             double by, double x, double y)  {
   if ((ax-bx)*(x-bx)+(ay-by)*(y-by) <= 0)
      return Math.Sqrt((x - bx) * (x - bx) + (y - by) * (y - by));

   if ((bx-ax)*(x-ax)+(by-ay)*(y-ay) <= 0)
      return Math.Sqrt((x - ax) * (x - ax) + (y - ay) * (y - ay));

 return Math.Abs((by - ay)*x - (bx - ax)*y + bx*ay - by*ax) /
     Math.Sqrt((ay - by) * (ay - by) + (ax - bx) * (ax - bx));
}

    public static void Main()
    {
        Console.WriteLine(GetDist(0, 2, 2, 0, 0, 0));
        Console.WriteLine(GetDist(0, 2, 2, 0, 0, 3));
    }



1.41421356237309
1

【讨论】:

    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 2018-03-01
    • 2020-08-27
    • 2011-02-18
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多