Spaces:
Build error
Build error
| import { intersectLine } from './intersect-line.js'; | |
| export { intersectPolygon }; | |
| /* | |
| * Returns the point ({x, y}) at which the point argument intersects with the | |
| * node argument assuming that it has the shape specified by polygon. | |
| */ | |
| function intersectPolygon(node, polyPoints, point) { | |
| var x1 = node.x; | |
| var y1 = node.y; | |
| var intersections = []; | |
| var minX = Number.POSITIVE_INFINITY; | |
| var minY = Number.POSITIVE_INFINITY; | |
| polyPoints.forEach(function (entry) { | |
| minX = Math.min(minX, entry.x); | |
| minY = Math.min(minY, entry.y); | |
| }); | |
| var left = x1 - node.width / 2 - minX; | |
| var top = y1 - node.height / 2 - minY; | |
| for (var i = 0; i < polyPoints.length; i++) { | |
| var p1 = polyPoints[i]; | |
| var p2 = polyPoints[i < polyPoints.length - 1 ? i + 1 : 0]; | |
| var intersect = intersectLine( | |
| node, | |
| point, | |
| { x: left + p1.x, y: top + p1.y }, | |
| { x: left + p2.x, y: top + p2.y } | |
| ); | |
| if (intersect) { | |
| intersections.push(intersect); | |
| } | |
| } | |
| if (!intersections.length) { | |
| console.log('NO INTERSECTION FOUND, RETURN NODE CENTER', node); | |
| return node; | |
| } | |
| if (intersections.length > 1) { | |
| // More intersections, find the one nearest to edge end point | |
| intersections.sort(function (p, q) { | |
| var pdx = p.x - point.x; | |
| var pdy = p.y - point.y; | |
| var distp = Math.sqrt(pdx * pdx + pdy * pdy); | |
| var qdx = q.x - point.x; | |
| var qdy = q.y - point.y; | |
| var distq = Math.sqrt(qdx * qdx + qdy * qdy); | |
| return distp < distq ? -1 : distp === distq ? 0 : 1; | |
| }); | |
| } | |
| return intersections[0]; | |
| } | |