欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

判断一个点是否在多边形内,射线法,电子围栏

程序员文章站 2022-04-02 21:20:52
...

判断一个点是否在多边形内,射线法,电子围栏 

/**
  * 根据某点坐标判断该坐标是否在某区域坐标范围内
  * @param px 目标点x坐标
  * @param py 目标点y坐标
  * @param polygonXA 目标范围xy坐标集合
  * @return
  */
 public boolean rayCasting(double px, double py, String polygon) {
  boolean flag = false;
  String[] points = polygon.split(",");
  for (int i = 0, j = points.length - 2; i < points.length - 1; j = i, i = i + 2) {
   double sx = Double.parseDouble(points[j]);// 从倒数第二依次读取;
   double sy = Double.parseDouble(points[j + 1]);// 从倒第一依次读取;
   double tx = Double.parseDouble(points[i]);// 从第一个依次读取;
   double ty = Double.parseDouble(points[i + 1]);// 从第二个依次读取;
   // 点与多边形顶点重合
   if ((sx == px && sy == py) || (tx == px && ty == py)) {
    return true;
   }
   // 判断线段两端点是否在射线两侧,射线为y轴;
   if ((sy < py && ty >= py) || (sy >= py && ty < py)) {
    // 线段上与射线 Y 坐标相同的点的 X 坐标
    double x = sx + (py - sy) * ((tx - sx) / (ty - sy));
    // 点在多边形的边上
    if (x == px) {
     return true;
    }
    // 射线穿过多边形的边界
    if (x > px) {
     flag = !flag;
    }
   }
  }
  // 射线穿过多边形边界的次数为奇数时点在多边形内
  return flag;
 }