function isInsideClippedPolygon(polygon, mouseX, mouseY) { let c = false; // make sure there are at least 3 visible nodes var countv = 0; for (let k=0; k < polygon.length && countv < 3; k++) { if (polygon[k].visible == true) countv++; } if (countv < 3) return false; // get the first visible node let firstv = null; for (let k=0; k < polygon.length; k++) { if (polygon[k].visible == true) { firstv = k; break; } } // raycast most-recent-visible-node -> next-visible-node const mrv = firstv; for (let i=mrv+1; i < polygon.length; i++) { if (polygon[i].visible == false) continue; let j = mrv; const ix = polygon[i].x; const iy = polygon[i].y; const jx = polygon[j].x; const jy = polygon[j].y; const iySide = (iy > mouseY); const jySide = (jy > mouseY); if (iySide != jySide) { const intersectX = (jx-ix) * (mouseY-iy) / (jy-iy) + ix; if (mouseX < intersectX) c = !c; } mrv = i; } // raycast most-recent-visible-node -> first-visible-node const ix = polygon[firstv].x; const iy = polygon[firstv].y; const jx = polygon[mrv].x; const jy = polygon[mrv].y; const iySide = (iy > mouseY); const jySide = (jy > mouseY); if (iySide != jySide) { const intersectX = (jx-ix) * (mouseY-iy) / (jy-iy) + ix; if (mouseX < intersectX) c = !c; } return c; }