判断多边形是否线线相交(多边形碰撞)
function lineLine ( a1, a2, b1, b2 ) { // b1->b2向量 与 a1->b1向量的向量积 var ua_t = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x); // a1->a2向量 与 a1->b1向量的向量积 var ub_t = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x); // a1->a2向量 与 b1->b2向量的向量积 var u_b = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y); // u_b == 0时,角度为0或者180 平行或者共线不属于相交 if ( u_b !== 0 ) { var ua = ua_t / u_b; var ub = ub_t / u_b; if ( 0 <= ua && ua <= 1 && 0 <= ub && ub <= 1 ) { return true; } } return false; } export function isPolygonsOverlap(pA, pB) { const pAMaxIndex = pA.length-1 const pBMaxIndex = pA.length-1 for(let i=0; i<pA.length;i++) { for(let j=0; j<pB.length;j++) { const iNextIndex = i === pAMaxIndex ? 0 : i+1 const jNextIndex = j === pBMaxIndex ? 0 : j+1 if(lineLine(pA[i],pA[iNextIndex], pB[j],pB[jNextIndex])){ return true } } } return false }
使用指北:
isPolygonsOverlap([{x:n,y:n},{x:n,y:n},{x:n,y:n},{x:n,y:n}], [{x:n,y:n},{x:n,y:n},{x:n,y:n},{x:n,y:n}])
点的顺序要和绘画顺序一致
备注:
只针对相交的判断,没有判断包含关系