当前位置:   article > 正文

判断点与多边形的最小距离_c++ 点到多边形的最短距离

c++ 点到多边形的最短距离

基本原理是逐条边判断与待检测点的距离

实体类

  1. public class Point{
  2. /**
  3. * x轴坐标
  4. */
  5. double x;
  6. /**
  7. * y轴坐标
  8. */
  9. double y;
  10. public Point setPoint(Point point){
  11. this.x = point.getX();
  12. this.y = point.getY();
  13. return this;
  14. }
  15. public Point() {
  16. }
  17. public Point(Float[] point){
  18. this.x = point[0];
  19. this.y = point[1];
  20. }
  21. public Point(Double[] point) {
  22. this.x = point[0];
  23. this.y = point[1];
  24. }
  25. public Point(double x, double y) {
  26. this.x = x;
  27. this.y = y;
  28. }
  29. public double getX() {
  30. return x;
  31. }
  32. public void setX(double x) {
  33. this.x = x;
  34. }
  35. public double getY() {
  36. return y;
  37. }
  38. public void setY(double y) {
  39. this.y = y;
  40. }
  41. }

工具类

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class GeometryUtil {
  4.     /**
  5.      * 获取点与直线之间的距离
  6.      * @param p 点
  7.      * @param a 直线上一点
  8.      * @param b 直线上一点
  9.      * @return
  10.      */
  11.     public static double pointToLineDist(Point p,Point a,Point b) {
  12.         double ABx = b.x - a.x;
  13.         double ABy = b.y - a.y;
  14.         double APx = p.x - a.x;
  15.         double APy = p.y - a.y;
  16.         double AB_AP = ABx * APx + ABy * APy;
  17.         double distAB2 = ABx * ABx + ABy * ABy;
  18.         double Dx = a.x, Dy = a.y;
  19.         if (distAB2 != 0) {
  20.             double t = AB_AP / distAB2;
  21.             if (t >= 1) {
  22.                 Dx = b.x;
  23.                 Dy = b.y;
  24.             } else if (t > 0) {
  25.                 Dx = a.x + ABx * t;
  26.                 Dy = a.y + ABy * t;
  27.             } else {
  28.                 Dx = a.x;
  29.                 Dy = a.y;
  30.             }
  31.         }
  32.         double PDx = Dx - p.x, PDy = Dy - p.y;
  33.         return Math.sqrt(PDx * PDx + PDy * PDy);
  34.     }
  35.     /**
  36.      * 获取点与多边形之间最近距离
  37.      * @param point
  38.      * @param points
  39.      * @return 0.0 :点位于多边形内部  >0.0 : 点与多边形之间的最近距离
  40.      */
  41.     public static double pintoToPolygonMinDist(Point point, List<Point> points) {
  42.         double dist = Double.MAX_VALUE;
  43.         int N = points.size();
  44.         for (int i = 0, j = N - 1; i < N; j = i++) {
  45.             dist = Math.min(dist, pointToLineDist(point, points.get(i), points.get(j)));
  46.         }
  47.         return dist;
  48.     }
  49. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/562749
推荐阅读
相关标签
  

闽ICP备14008679号