Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 求点与线段之间的最短距离_C#_Geometry_Distance_Euclidean Distance - Fatal编程技术网

C# 求点与线段之间的最短距离

C# 求点与线段之间的最短距离,c#,geometry,distance,euclidean-distance,C#,Geometry,Distance,Euclidean Distance,我需要找到点和线段之间的最短距离(点定义为xy,线定义为使用端点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)

我需要找到点和线段之间的最短距离(点定义为xy,线定义为使用端点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;
    }
}
公共静态双GetDist(双ax、双ay、双bx、双by、双x、双y)
{
双垂线=数学绝对值((by-ay)*x-(bx-ax)*y+bx*ay-by*ax)/
数学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));
双θ=Math.Atan(dist1);
双θ=Math.Atan(dist2);
双角度=数学绝对值(θ2-θ1);
如果(角度>数学PI)
角度=2*Math.PI-角度;
如果(角度=至_bxby)
返回_bxby;
其他的
返回_axay;
}
}
当它不工作时的示例:

x=0,y=30

ax=-30,ay=0

bx=30,by=0


预期结果是30。相反,我的程序返回42.4264。

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

但是你不需要做三角计算。只需找到babp向量的标量积和abap向量的标量积

如果第一个为负(角度abp为钝角),则获取到b终点的距离。如果第二个为负值,则获取到a终点的距离

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

:

公共静态双GetDist(双ax、双ay、双bx、,
双乘,双x,双y){

如果((ax-bx)*(x-bx)+(ay-by)*(y-by)如果
x=0,y=30
bx=0,by=30
,为什么预期结果
30
?看起来点在直线上(与直线的端点在b处相同)所以结果应该是
0
。或者我误解了something@RufusL很抱歉,在编写示例输入时出错。请立即修复。
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