C# 求点到线段的最小距离
已知一个线段 坐标起始坐标点为 A点 (x1,x2) ,线段的终止坐标点为B (x2,y2) 线段外的一个点坐标为 C (x,y)
求点 (x,y)到线段的最小距离
点和线段的控件坐标位置有三种情况
1:点到线段组成的直线的垂足在A 的外边 求C点到A点的距离即可
2:点到线段组成的直线的垂足在B的外边 求C点到B点的距离即可
3:点到线段所在的直线的垂足在AB组成的线段中间. 从C点做垂线到线段AB,求垂足 O 计算 OA之间的距离即可.
以下代码是使用C#语言实现的求点到线段之间的最小距离 是线段 不是直线。
如果是AB直线的话,则没有 第1中情况和第2中情况。
public static (double x, double y, double d, bool retData) GetMinDisPointToABLine(double x, double y, double x1, double y1, double x2, double y2)
{
double reVal = 0.0;
bool retData = false;
double cross = (x2 - x1) * (x - x1) + (y2 - y1) * (y - y1);
if (cross <= 0)
{
//点在x1 侧
reVal = Math.Sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
return (x1, y1, reVal, false);
}
double d2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
if (cross >= d2)
{
//点在x2侧
reVal = Math.Sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));
return (x2, x2, reVal, retData);
}
//点在线段外有垂足
double r = cross / d2;
double px = x1 + (x2 - x1) * r;
double py = y1 + (y2 - y1) * r;
reVal = Math.Sqrt((x - px) * (x - px) + (py - y) * (py - y));
return (px,py,reVal,true);
}
很赞哦! (0)