判断多边形是否线线相交(多边形碰撞)

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}])

点的顺序要和绘画顺序一致

备注:

只针对相交的判断,没有判断包含关系

posted @ 2022-06-22 10:36  瑞瑞大人  阅读(413)  评论(0编辑  收藏  举报