我的功能实现历程:
1.使用graham算法实现:判断点是否在正多边形围栏内(通过率100%,不足之处:无法判断点是否在不规则多边形内)
2.射线法(graham算法举一反三):判断测试点是否在不规则多边形围栏内(通过率100%)
这里只提供核心算法:
point数据结构:{x:1,y:2}
polygon数据结构:[{x:1,y:2},......]
// 判断点是否在多边形内(射线法)
function pointInPolygon(point, polygon) {
const x = point.x, y = point.y;
let inside = false;
for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
const xi = polygon[i].x, yi = polygon[i].y;
const xj = polygon[j].x, yj = polygon[j].y;
// 检查射线与边的交点
//yi>y!==yj>y 如果测试点在边的中间则为true,否则为false
//x<(xj-xi)*(y-yi)/(yj-yi)+xi 计算测试点与边的交点,判断测试点是否在边的左侧
const intersect = ((yi > y) !== (yj > y))
&& (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
if (intersect) inside = !inside;
}
return inside;
}
graham算法的功能实现思路(只适用与正多边形):多边形我们可以拆成很多条边,然后依次判断这个测试点与边是否构成凸包,如果都构成凸包则可以说明点在多边形内(简单点就是测试点是否都在边的左侧或者右侧(这个左右得根据逆时针:左或者顺时针:右来判断))
射线法实现思路:测试点向右的射线与多边形相交的点的数量为奇数,则在多边形内,否则不在,这个时候可以利用graham算法中的叉积之差来判断点是否在边的左右。在左侧则射线与边相交,在右则不相交。最终得到测试点的射线与多边形相交的点数,然后就可以判断了,nice。