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中情况。

  1. public static (double x, double y, double d, bool retData) GetMinDisPointToABLine(double x, double y, double x1, double y1, double x2, double y2)
  2. {
  3. double reVal = 0.0;
  4. bool retData = false;
  5. double cross = (x2 - x1) * (x - x1) + (y2 - y1) * (y - y1);
  6. if (cross <= 0)
  7. {
  8. //点在x1 侧
  9. reVal = Math.Sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
  10. return (x1, y1, reVal, false);
  11. }
  12. double d2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
  13. if (cross >= d2)
  14. {
  15. //点在x2侧
  16. reVal = Math.Sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));
  17. return (x2, x2, reVal, retData);
  18. }
  19. //点在线段外有垂足
  20. double r = cross / d2;
  21. double px = x1 + (x2 - x1) * r;
  22. double py = y1 + (y2 - y1) * r;
  23. reVal = Math.Sqrt((x - px) * (x - px) + (py - y) * (py - y));
  24. return (px,py,reVal,true);
  25. }
2024-05-29 16:54:26  user 阅读(95) 评论(0) 标签:C#,点到线段的最小距离 分类:C#