- 凸多边形
- 将点的坐标转换为x,y范围在[-1,1]的区间内
- 通过vec2.subtract()方法将旧点与新点变成首尾相连的向量(如下图)
- 通过vec2.cross()方法按序依次计算两个向量的外积([v0,v1],[v1,v2],[v2,v3]…),如果v1和v2叉乘的z值大于零,则表明newpoint在原先多边形的内部,否则位于外部
- 新增的顶点的两条边和多边形其他边是否相交(同样使用向量的叉乘来计算)
const isCross = (p1, p2, p3, p4) => {
const v1 = vec2.subtract(vec2.create(), p4, p3)
const v2 = vec2.subtract(vec2.create(), p1, p3)
const v3 = vec2.subtract(vec2.create(), p2, p3)
const z1 = vec2.cross(vec3.create(), v1, v2)[2]
const z2 = vec2.cross(vec3.create(), v1, v3)[2]
return z1 * z2 <= 0
}
const checkSimple = (newPoint) => {
const len = points.length
if(len >= 3) {
const lastPoint = points[len - 1]
const firstPoint = points[0]
for(let i = 1; i < len; i++) {
const p1 = points[i - 1]
const p2 = points[i]
if(p2 !== lastPoint && isCross(p1, p2, lastPoint, newPoint) && isCross(lastPoint, newPoint, p1, p2)) {
}
if(p1 !== firstPoint && isCross(p1, p2, newPoint, firstPoint) && isCross(newPoint, firstPoint, p1, p2)) {
}
}
}
}