判断一个点是否在多边形内,射线法,电子围栏
程序员文章站
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;
}
上一篇: 如何判断一个点是否在多边形内?C++实现
下一篇: 苹果12删除输入法记忆的方法