UNPKG

fabric

Version:

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

1 lines 19.5 kB
{"version":3,"file":"Intersection.mjs","sources":["../../src/Intersection.ts"],"sourcesContent":["import { Point } from './Point';\nimport { createVector } from './util/misc/vectors';\n\n/* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n\nexport type IntersectionType = 'Intersection' | 'Coincident' | 'Parallel';\n\nexport class Intersection {\n declare points: Point[];\n\n declare status?: IntersectionType;\n\n constructor(status?: IntersectionType) {\n this.status = status;\n this.points = [];\n }\n\n /**\n * Used to verify if a point is alredy in the collection\n * @param {Point} point\n * @returns {boolean}\n */\n private includes(point: Point): boolean {\n return this.points.some((p) => p.eq(point));\n }\n\n /**\n * Appends points of intersection\n * @param {...Point[]} points\n * @return {Intersection} thisArg\n * @chainable\n */\n private append(...points: Point[]): Intersection {\n this.points = this.points.concat(\n points.filter((point) => {\n return !this.includes(point);\n }),\n );\n return this;\n }\n\n /**\n * check if point T is on the segment or line defined between A and B\n *\n * @param {Point} T the point we are checking for\n * @param {Point} A one extremity of the segment\n * @param {Point} B the other extremity of the segment\n * @param [infinite] if true checks if `T` is on the line defined by `A` and `B`\n * @returns true if `T` is contained\n */\n static isPointContained(T: Point, A: Point, B: Point, infinite = false) {\n if (A.eq(B)) {\n // Edge case: the segment is a point, we check for coincidence,\n // infinite param has no meaning because there are infinite lines to consider\n return T.eq(A);\n } else if (A.x === B.x) {\n // Edge case: horizontal line.\n // we first check if T.x has the same value, and then if T.y is contained between A.y and B.y\n return (\n T.x === A.x &&\n (infinite || (T.y >= Math.min(A.y, B.y) && T.y <= Math.max(A.y, B.y)))\n );\n } else if (A.y === B.y) {\n // Edge case: vertical line.\n // we first check if T.y has the same value, and then if T.x is contained between A.x and B.x\n return (\n T.y === A.y &&\n (infinite || (T.x >= Math.min(A.x, B.x) && T.x <= Math.max(A.x, B.x)))\n );\n } else {\n // Generic case: sloped line.\n // we check that AT has the same slope as AB\n // for the segment case we need both the vectors to have the same direction and for AT to be lte AB in size\n // for the infinite case we check the absolute value of the slope, since direction is meaningless\n const AB = createVector(A, B);\n const AT = createVector(A, T);\n const s = AT.divide(AB);\n return infinite\n ? Math.abs(s.x) === Math.abs(s.y)\n : s.x === s.y && s.x >= 0 && s.x <= 1;\n }\n }\n\n /**\n * Use the ray casting algorithm to determine if {@link Point} is in the polygon defined by [points]{@link Point}\n * @see https://en.wikipedia.org/wiki/Point_in_polygon\n * @param point\n * @param points polygon points\n * @returns\n */\n static isPointInPolygon(point: Point, points: Point[]) {\n const other = new Point(point).setX(\n Math.min(point.x - 1, ...points.map((p) => p.x)),\n );\n let hits = 0;\n for (let index = 0; index < points.length; index++) {\n const inter = this.intersectSegmentSegment(\n // polygon side\n points[index],\n points[(index + 1) % points.length],\n // ray\n point,\n other,\n );\n if (inter.includes(point)) {\n // point is on the polygon side\n return true;\n }\n hits += Number(inter.status === 'Intersection');\n }\n return hits % 2 === 1;\n }\n\n /**\n * Checks if a line intersects another\n * @see {@link https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection line intersection}\n * @see {@link https://en.wikipedia.org/wiki/Cramer%27s_rule Cramer's rule}\n * @static\n * @param {Point} a1\n * @param {Point} a2\n * @param {Point} b1\n * @param {Point} b2\n * @param {boolean} [aInfinite=true] check segment intersection by passing `false`\n * @param {boolean} [bInfinite=true] check segment intersection by passing `false`\n * @return {Intersection}\n */\n static intersectLineLine(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n aInfinite = true,\n bInfinite = true,\n ): Intersection {\n const a2xa1x = a2.x - a1.x,\n a2ya1y = a2.y - a1.y,\n b2xb1x = b2.x - b1.x,\n b2yb1y = b2.y - b1.y,\n a1xb1x = a1.x - b1.x,\n a1yb1y = a1.y - b1.y,\n uaT = b2xb1x * a1yb1y - b2yb1y * a1xb1x,\n ubT = a2xa1x * a1yb1y - a2ya1y * a1xb1x,\n uB = b2yb1y * a2xa1x - b2xb1x * a2ya1y;\n if (uB !== 0) {\n const ua = uaT / uB,\n ub = ubT / uB;\n if (\n (aInfinite || (0 <= ua && ua <= 1)) &&\n (bInfinite || (0 <= ub && ub <= 1))\n ) {\n return new Intersection('Intersection').append(\n new Point(a1.x + ua * a2xa1x, a1.y + ua * a2ya1y),\n );\n } else {\n return new Intersection();\n }\n } else {\n if (uaT === 0 || ubT === 0) {\n const segmentsCoincide =\n aInfinite ||\n bInfinite ||\n Intersection.isPointContained(a1, b1, b2) ||\n Intersection.isPointContained(a2, b1, b2) ||\n Intersection.isPointContained(b1, a1, a2) ||\n Intersection.isPointContained(b2, a1, a2);\n return new Intersection(segmentsCoincide ? 'Coincident' : undefined);\n } else {\n return new Intersection('Parallel');\n }\n }\n }\n\n /**\n * Checks if a segment intersects a line\n * @see {@link intersectLineLine} for line intersection\n * @static\n * @param {Point} s1 boundary point of segment\n * @param {Point} s2 other boundary point of segment\n * @param {Point} l1 point on line\n * @param {Point} l2 other point on line\n * @return {Intersection}\n */\n static intersectSegmentLine(\n s1: Point,\n s2: Point,\n l1: Point,\n l2: Point,\n ): Intersection {\n return Intersection.intersectLineLine(s1, s2, l1, l2, false, true);\n }\n\n /**\n * Checks if a segment intersects another\n * @see {@link intersectLineLine} for line intersection\n * @static\n * @param {Point} a1 boundary point of segment\n * @param {Point} a2 other boundary point of segment\n * @param {Point} b1 boundary point of segment\n * @param {Point} b2 other boundary point of segment\n * @return {Intersection}\n */\n static intersectSegmentSegment(\n a1: Point,\n a2: Point,\n b1: Point,\n b2: Point,\n ): Intersection {\n return Intersection.intersectLineLine(a1, a2, b1, b2, false, false);\n }\n\n /**\n * Checks if line intersects polygon\n *\n * @todo account for stroke\n *\n * @static\n * @see {@link intersectSegmentPolygon} for segment intersection\n * @param {Point} a1 point on line\n * @param {Point} a2 other point on line\n * @param {Point[]} points polygon points\n * @param {boolean} [infinite=true] check segment intersection by passing `false`\n * @return {Intersection}\n */\n static intersectLinePolygon(\n a1: Point,\n a2: Point,\n points: Point[],\n infinite = true,\n ): Intersection {\n const result = new Intersection();\n const length = points.length;\n\n for (let i = 0, b1, b2, inter; i < length; i++) {\n b1 = points[i];\n b2 = points[(i + 1) % length];\n inter = Intersection.intersectLineLine(a1, a2, b1, b2, infinite, false);\n if (inter.status === 'Coincident') {\n return inter;\n }\n result.append(...inter.points);\n }\n\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n\n return result;\n }\n\n /**\n * Checks if segment intersects polygon\n * @static\n * @see {@link intersectLinePolygon} for line intersection\n * @param {Point} a1 boundary point of segment\n * @param {Point} a2 other boundary point of segment\n * @param {Point[]} points polygon points\n * @return {Intersection}\n */\n static intersectSegmentPolygon(\n a1: Point,\n a2: Point,\n points: Point[],\n ): Intersection {\n return Intersection.intersectLinePolygon(a1, a2, points, false);\n }\n\n /**\n * Checks if polygon intersects another polygon\n *\n * @todo account for stroke\n *\n * @static\n * @param {Point[]} points1\n * @param {Point[]} points2\n * @return {Intersection}\n */\n static intersectPolygonPolygon(\n points1: Point[],\n points2: Point[],\n ): Intersection {\n const result = new Intersection(),\n length = points1.length;\n const coincidences: Intersection[] = [];\n\n for (let i = 0; i < length; i++) {\n const a1 = points1[i],\n a2 = points1[(i + 1) % length],\n inter = Intersection.intersectSegmentPolygon(a1, a2, points2);\n if (inter.status === 'Coincident') {\n coincidences.push(inter);\n result.append(a1, a2);\n } else {\n result.append(...inter.points);\n }\n }\n\n if (coincidences.length > 0 && coincidences.length === points1.length) {\n return new Intersection('Coincident');\n } else if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n\n return result;\n }\n\n /**\n * Checks if polygon intersects rectangle\n * @static\n * @see {@link intersectPolygonPolygon} for polygon intersection\n * @param {Point[]} points polygon points\n * @param {Point} r1 top left point of rect\n * @param {Point} r2 bottom right point of rect\n * @return {Intersection}\n */\n static intersectPolygonRectangle(\n points: Point[],\n r1: Point,\n r2: Point,\n ): Intersection {\n const min = r1.min(r2),\n max = r1.max(r2),\n topRight = new Point(max.x, min.y),\n bottomLeft = new Point(min.x, max.y);\n\n return Intersection.intersectPolygonPolygon(points, [\n min,\n topRight,\n max,\n bottomLeft,\n ]);\n }\n}\n"],"names":["Intersection","constructor","status","points","includes","point","some","p","eq","append","_len","arguments","length","Array","_key","concat","filter","isPointContained","T","A","B","infinite","undefined","x","y","Math","min","max","AB","createVector","AT","s","divide","abs","isPointInPolygon","other","Point","setX","map","hits","index","inter","intersectSegmentSegment","Number","intersectLineLine","a1","a2","b1","b2","aInfinite","bInfinite","a2xa1x","a2ya1y","b2xb1x","b2yb1y","a1xb1x","a1yb1y","uaT","ubT","uB","ua","ub","segmentsCoincide","intersectSegmentLine","s1","s2","l1","l2","intersectLinePolygon","result","i","intersectSegmentPolygon","intersectPolygonPolygon","points1","points2","coincidences","push","intersectPolygonRectangle","r1","r2","topRight","bottomLeft"],"mappings":"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"}