tess-extrude 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tess-extrude.es.js","sources":["../src/input/fromPoints.ts","../src/input/fromSVG.ts","../src/polygon/prepare.ts","../src/polygon/subdivide.ts","../node_modules/poly2tri/src/xy.js","../node_modules/poly2tri/src/pointerror.js","../node_modules/poly2tri/src/point.js","../node_modules/poly2tri/src/triangle.js","../node_modules/poly2tri/src/assert.js","../node_modules/poly2tri/src/advancingfront.js","../node_modules/poly2tri/src/utils.js","../node_modules/poly2tri/src/sweep.js","../node_modules/poly2tri/src/sweepcontext.js","../node_modules/poly2tri/src/poly2tri.js","../src/math/geometry.ts","../src/tessellation/steiner.ts","../src/math/prng.ts","../src/tessellation/triangulate.ts","../src/geometry/caps.ts","../src/geometry/sides.ts","../src/geometry/buildGeometry.ts","../src/extrude.ts","../src/polygon/simplify.ts"],"sourcesContent":["import type { Point2D } from '../types.js';\n\n/**\n * Validate that the input is a finite, usable point array.\n * Returns the array as-is on success, or null if validation fails.\n */\nexport function validatePoints(points: Point2D[]): Point2D[] | null {\n if (!Array.isArray(points) || points.length < 3) return null;\n for (const p of points) {\n if (\n typeof p.x !== 'number' ||\n typeof p.y !== 'number' ||\n !isFinite(p.x) ||\n !isFinite(p.y)\n ) {\n return null;\n }\n }\n return points;\n}\n","import { SVGLoader } from 'three/examples/jsm/loaders/SVGLoader.js';\nimport type { Vector2 } from 'three';\nimport type { Point2D } from '../types.js';\n\n/**\n * Parse a base64-encoded SVG (with or without data URI prefix) into an array\n * of 2D contour point arrays — one per SVG shape.\n *\n * Requires a browser environment (SVGLoader uses DOMParser internally).\n */\nexport function fromSVG(data: string): Point2D[][] {\n let svgString: string;\n\n if (data.startsWith('data:')) {\n const commaIdx = data.indexOf(',');\n svgString = atob(commaIdx >= 0 ? data.slice(commaIdx + 1) : data);\n } else {\n svgString = atob(data);\n }\n\n const loader = new SVGLoader();\n const svgData = loader.parse(svgString);\n const contours: Point2D[][] = [];\n\n for (const path of svgData.paths) {\n const shapes = SVGLoader.createShapes(path);\n for (const shape of shapes) {\n const pts = shape.getPoints();\n if (pts.length >= 3) {\n contours.push(pts.map((p: Vector2) => ({ x: p.x, y: p.y })));\n }\n }\n }\n\n return contours;\n}\n","import type { Point2D } from '../types.js';\n\n/** Remove consecutive near-duplicate points (including last≈first wrap). */\nexport function deduplicatePoints(points: Point2D[], eps = 0.5): Point2D[] {\n if (points.length === 0) return [];\n const epsSq = eps * eps;\n const result: Point2D[] = [points[0]!];\n\n for (let i = 1; i < points.length; i++) {\n const prev = result[result.length - 1]!;\n const cur = points[i]!;\n const dx = cur.x - prev.x;\n const dy = cur.y - prev.y;\n if (dx * dx + dy * dy > epsSq) {\n result.push(cur);\n }\n }\n\n // Remove last point if it is too close to the first\n if (result.length > 1) {\n const first = result[0]!;\n const last = result[result.length - 1]!;\n const dx = last.x - first.x;\n const dy = last.y - first.y;\n if (dx * dx + dy * dy <= epsSq) {\n result.pop();\n }\n }\n\n return result;\n}\n\n/**\n * Ensure the polygon winding is counter-clockwise (positive signed area via\n * the shoelace formula). poly2tri requires CCW contours.\n */\nexport function ensureCCW(points: Point2D[]): Point2D[] {\n let area = 0;\n for (let i = 0; i < points.length; i++) {\n const j = (i + 1) % points.length;\n area += points[i]!.x * points[j]!.y;\n area -= points[j]!.x * points[i]!.y;\n }\n // area/2 < 0 means CW → reverse\n if (area < 0) {\n return [...points].reverse();\n }\n return points;\n}\n\n/** Translate points so their centroid is at the origin. */\nexport function centerPoints(points: Point2D[]): Point2D[] {\n let cx = 0;\n let cy = 0;\n for (const p of points) {\n cx += p.x;\n cy += p.y;\n }\n cx /= points.length;\n cy /= points.length;\n return points.map((p) => ({ x: p.x - cx, y: p.y - cy }));\n}\n","import type { Point2D } from '../types.js';\n\n/**\n * Subdivide each boundary edge into `subdivisions` equal segments.\n * Returns a pre-allocated flat array of the new boundary points.\n */\nexport function subdivideBoundary(points: Point2D[], subdivisions: number): Point2D[] {\n if (subdivisions <= 1) return [...points];\n\n const n = points.length;\n const result = new Array<Point2D>(n * subdivisions);\n\n for (let i = 0; i < n; i++) {\n const a = points[i]!;\n const b = points[(i + 1) % n]!;\n for (let s = 0; s < subdivisions; s++) {\n const t = s / subdivisions;\n result[i * subdivisions + s] = {\n x: a.x + (b.x - a.x) * t,\n y: a.y + (b.y - a.y) * t,\n };\n }\n }\n\n return result;\n}\n","/*\n * Poly2Tri Copyright (c) 2009-2014, Poly2Tri Contributors\n * http://code.google.com/p/poly2tri/\n * \n * poly2tri.js (JavaScript port) (c) 2009-2014, Poly2Tri Contributors\n * https://github.com/r3mi/poly2tri.js\n * \n * All rights reserved.\n * \n * Distributed under the 3-clause BSD License, see LICENSE.txt\n */\n\n\"use strict\";\n\n/**\n * The following functions operate on \"Point\" or any \"Point like\" object with {x,y},\n * as defined by the {@link XY} type\n * ([duck typing]{@link http://en.wikipedia.org/wiki/Duck_typing}).\n * @module\n * @private\n */\n\n/**\n * poly2tri.js supports using custom point class instead of {@linkcode Point}.\n * Any \"Point like\" object with <code>{x, y}</code> attributes is supported\n * to initialize the SweepContext polylines and points\n * ([duck typing]{@link http://en.wikipedia.org/wiki/Duck_typing}).\n *\n * poly2tri.js might add extra fields to the point objects when computing the\n * triangulation : they are prefixed with <code>_p2t_</code> to avoid collisions\n * with fields in the custom class.\n *\n * @example\n * var contour = [{x:100, y:100}, {x:100, y:300}, {x:300, y:300}, {x:300, y:100}];\n * var swctx = new poly2tri.SweepContext(contour);\n *\n * @typedef {Object} XY\n * @property {number} x - x coordinate\n * @property {number} y - y coordinate\n */\n\n\n/**\n * Point pretty printing : prints x and y coordinates.\n * @example\n * xy.toStringBase({x:5, y:42})\n * // → \"(5;42)\"\n * @protected\n * @param {!XY} p - point object with {x,y}\n * @returns {string} <code>\"(x;y)\"</code>\n */\nfunction toStringBase(p) {\n return (\"(\" + p.x + \";\" + p.y + \")\");\n}\n\n/**\n * Point pretty printing. Delegates to the point's custom \"toString()\" method if exists,\n * else simply prints x and y coordinates.\n * @example\n * xy.toString({x:5, y:42})\n * // → \"(5;42)\"\n * @example\n * xy.toString({x:5,y:42,toString:function() {return this.x+\":\"+this.y;}})\n * // → \"5:42\"\n * @param {!XY} p - point object with {x,y}\n * @returns {string} <code>\"(x;y)\"</code>\n */\nfunction toString(p) {\n // Try a custom toString first, and fallback to own implementation if none\n var s = p.toString();\n return (s === '[object Object]' ? toStringBase(p) : s);\n}\n\n\n/**\n * Compare two points component-wise. Ordered by y axis first, then x axis.\n * @param {!XY} a - point object with {x,y}\n * @param {!XY} b - point object with {x,y}\n * @return {number} <code>&lt; 0</code> if <code>a &lt; b</code>,\n * <code>&gt; 0</code> if <code>a &gt; b</code>, \n * <code>0</code> otherwise.\n */\nfunction compare(a, b) {\n if (a.y === b.y) {\n return a.x - b.x;\n } else {\n return a.y - b.y;\n }\n}\n\n/**\n * Test two Point objects for equality.\n * @param {!XY} a - point object with {x,y}\n * @param {!XY} b - point object with {x,y}\n * @return {boolean} <code>True</code> if <code>a == b</code>, <code>false</code> otherwise.\n */\nfunction equals(a, b) {\n return a.x === b.x && a.y === b.y;\n}\n\n\nmodule.exports = {\n toString: toString,\n toStringBase: toStringBase,\n compare: compare,\n equals: equals\n};\n","/*\n * Poly2Tri Copyright (c) 2009-2014, Poly2Tri Contributors\n * http://code.google.com/p/poly2tri/\n * \n * poly2tri.js (JavaScript port) (c) 2009-2014, Poly2Tri Contributors\n * https://github.com/r3mi/poly2tri.js\n * \n * All rights reserved.\n * \n * Distributed under the 3-clause BSD License, see LICENSE.txt\n */\n\n\"use strict\";\n\n/*\n * Class added in the JavaScript version (was not present in the c++ version)\n */\n\nvar xy = require('./xy');\n\n/**\n * Custom exception class to indicate invalid Point values\n * @constructor\n * @public\n * @extends Error\n * @struct\n * @param {string=} message - error message\n * @param {Array.<XY>=} points - invalid points\n */\nvar PointError = function(message, points) {\n this.name = \"PointError\";\n /**\n * Invalid points\n * @public\n * @type {Array.<XY>}\n */\n this.points = points = points || [];\n /**\n * Error message\n * @public\n * @type {string}\n */\n this.message = message || \"Invalid Points!\";\n for (var i = 0; i < points.length; i++) {\n this.message += \" \" + xy.toString(points[i]);\n }\n};\nPointError.prototype = new Error();\nPointError.prototype.constructor = PointError;\n\n\nmodule.exports = PointError;\n","/*\n * Poly2Tri Copyright (c) 2009-2014, Poly2Tri Contributors\n * http://code.google.com/p/poly2tri/\n * \n * poly2tri.js (JavaScript port) (c) 2009-2014, Poly2Tri Contributors\n * https://github.com/r3mi/poly2tri.js\n * \n * All rights reserved.\n * \n * Distributed under the 3-clause BSD License, see LICENSE.txt\n */\n\n\"use strict\";\n\n\n/*\n * Note\n * ====\n * the structure of this JavaScript version of poly2tri intentionally follows\n * as closely as possible the structure of the reference C++ version, to make it \n * easier to keep the 2 versions in sync.\n */\n\nvar xy = require('./xy');\n\n// ------------------------------------------------------------------------Point\n/**\n * Construct a point\n * @example\n * var point = new poly2tri.Point(150, 150);\n * @public\n * @constructor\n * @struct\n * @param {number=} x coordinate (0 if undefined)\n * @param {number=} y coordinate (0 if undefined)\n */\nvar Point = function(x, y) {\n /**\n * @type {number}\n * @expose\n */\n this.x = +x || 0;\n /**\n * @type {number}\n * @expose\n */\n this.y = +y || 0;\n\n // All extra fields added to Point are prefixed with _p2t_\n // to avoid collisions if custom Point class is used.\n\n /**\n * The edges this point constitutes an upper ending point\n * @private\n * @type {Array.<Edge>}\n */\n this._p2t_edge_list = null;\n};\n\n/**\n * For pretty printing\n * @example\n * \"p=\" + new poly2tri.Point(5,42)\n * // → \"p=(5;42)\"\n * @returns {string} <code>\"(x;y)\"</code>\n */\nPoint.prototype.toString = function() {\n return xy.toStringBase(this);\n};\n\n/**\n * JSON output, only coordinates\n * @example\n * JSON.stringify(new poly2tri.Point(1,2))\n * // → '{\"x\":1,\"y\":2}'\n */\nPoint.prototype.toJSON = function() {\n return { x: this.x, y: this.y };\n};\n\n/**\n * Creates a copy of this Point object.\n * @return {Point} new cloned point\n */\nPoint.prototype.clone = function() {\n return new Point(this.x, this.y);\n};\n\n/**\n * Set this Point instance to the origo. <code>(0; 0)</code>\n * @return {Point} this (for chaining)\n */\nPoint.prototype.set_zero = function() {\n this.x = 0.0;\n this.y = 0.0;\n return this; // for chaining\n};\n\n/**\n * Set the coordinates of this instance.\n * @param {number} x coordinate\n * @param {number} y coordinate\n * @return {Point} this (for chaining)\n */\nPoint.prototype.set = function(x, y) {\n this.x = +x || 0;\n this.y = +y || 0;\n return this; // for chaining\n};\n\n/**\n * Negate this Point instance. (component-wise)\n * @return {Point} this (for chaining)\n */\nPoint.prototype.negate = function() {\n this.x = -this.x;\n this.y = -this.y;\n return this; // for chaining\n};\n\n/**\n * Add another Point object to this instance. (component-wise)\n * @param {!Point} n - Point object.\n * @return {Point} this (for chaining)\n */\nPoint.prototype.add = function(n) {\n this.x += n.x;\n this.y += n.y;\n return this; // for chaining\n};\n\n/**\n * Subtract this Point instance with another point given. (component-wise)\n * @param {!Point} n - Point object.\n * @return {Point} this (for chaining)\n */\nPoint.prototype.sub = function(n) {\n this.x -= n.x;\n this.y -= n.y;\n return this; // for chaining\n};\n\n/**\n * Multiply this Point instance by a scalar. (component-wise)\n * @param {number} s scalar.\n * @return {Point} this (for chaining)\n */\nPoint.prototype.mul = function(s) {\n this.x *= s;\n this.y *= s;\n return this; // for chaining\n};\n\n/**\n * Return the distance of this Point instance from the origo.\n * @return {number} distance\n */\nPoint.prototype.length = function() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n};\n\n/**\n * Normalize this Point instance (as a vector).\n * @return {number} The original distance of this instance from the origo.\n */\nPoint.prototype.normalize = function() {\n var len = this.length();\n this.x /= len;\n this.y /= len;\n return len;\n};\n\n/**\n * Test this Point object with another for equality.\n * @param {!XY} p - any \"Point like\" object with {x,y}\n * @return {boolean} <code>true</code> if same x and y coordinates, <code>false</code> otherwise.\n */\nPoint.prototype.equals = function(p) {\n return this.x === p.x && this.y === p.y;\n};\n\n\n// -----------------------------------------------------Point (\"static\" methods)\n\n/**\n * Negate a point component-wise and return the result as a new Point object.\n * @param {!XY} p - any \"Point like\" object with {x,y}\n * @return {Point} the resulting Point object.\n */\nPoint.negate = function(p) {\n return new Point(-p.x, -p.y);\n};\n\n/**\n * Add two points component-wise and return the result as a new Point object.\n * @param {!XY} a - any \"Point like\" object with {x,y}\n * @param {!XY} b - any \"Point like\" object with {x,y}\n * @return {Point} the resulting Point object.\n */\nPoint.add = function(a, b) {\n return new Point(a.x + b.x, a.y + b.y);\n};\n\n/**\n * Subtract two points component-wise and return the result as a new Point object.\n * @param {!XY} a - any \"Point like\" object with {x,y}\n * @param {!XY} b - any \"Point like\" object with {x,y}\n * @return {Point} the resulting Point object.\n */\nPoint.sub = function(a, b) {\n return new Point(a.x - b.x, a.y - b.y);\n};\n\n/**\n * Multiply a point by a scalar and return the result as a new Point object.\n * @param {number} s - the scalar\n * @param {!XY} p - any \"Point like\" object with {x,y}\n * @return {Point} the resulting Point object.\n */\nPoint.mul = function(s, p) {\n return new Point(s * p.x, s * p.y);\n};\n\n/**\n * Perform the cross product on either two points (this produces a scalar)\n * or a point and a scalar (this produces a point).\n * This function requires two parameters, either may be a Point object or a\n * number.\n * @param {XY|number} a - Point object or scalar.\n * @param {XY|number} b - Point object or scalar.\n * @return {Point|number} a Point object or a number, depending on the parameters.\n */\nPoint.cross = function(a, b) {\n if (typeof(a) === 'number') {\n if (typeof(b) === 'number') {\n return a * b;\n } else {\n return new Point(-a * b.y, a * b.x);\n }\n } else {\n if (typeof(b) === 'number') {\n return new Point(b * a.y, -b * a.x);\n } else {\n return a.x * b.y - a.y * b.x;\n }\n }\n};\n\n\n// -----------------------------------------------------------------\"Point-Like\"\n/*\n * The following functions operate on \"Point\" or any \"Point like\" object \n * with {x,y} (duck typing).\n */\n\nPoint.toString = xy.toString;\nPoint.compare = xy.compare;\nPoint.cmp = xy.compare; // backward compatibility\nPoint.equals = xy.equals;\n\n/**\n * Peform the dot product on two vectors.\n * @public\n * @param {!XY} a - any \"Point like\" object with {x,y}\n * @param {!XY} b - any \"Point like\" object with {x,y}\n * @return {number} The dot product\n */\nPoint.dot = function(a, b) {\n return a.x * b.x + a.y * b.y;\n};\n\n\n// ---------------------------------------------------------Exports (public API)\n\nmodule.exports = Point;\n","/*\n * Poly2Tri Copyright (c) 2009-2014, Poly2Tri Contributors\n * http://code.google.com/p/poly2tri/\n * \n * poly2tri.js (JavaScript port) (c) 2009-2014, Poly2Tri Contributors\n * https://github.com/r3mi/poly2tri.js\n *\n * All rights reserved.\n * \n * Distributed under the 3-clause BSD License, see LICENSE.txt\n */\n\n/* jshint maxcomplexity:10 */\n\n\"use strict\";\n\n\n/*\n * Note\n * ====\n * the structure of this JavaScript version of poly2tri intentionally follows\n * as closely as possible the structure of the reference C++ version, to make it \n * easier to keep the 2 versions in sync.\n */\n\nvar xy = require(\"./xy\");\n\n\n// ---------------------------------------------------------------------Triangle\n/**\n * Triangle class.<br>\n * Triangle-based data structures are known to have better performance than\n * quad-edge structures.\n * See: J. Shewchuk, \"Triangle: Engineering a 2D Quality Mesh Generator and\n * Delaunay Triangulator\", \"Triangulations in CGAL\"\n *\n * @constructor\n * @struct\n * @param {!XY} pa point object with {x,y}\n * @param {!XY} pb point object with {x,y}\n * @param {!XY} pc point object with {x,y}\n */\nvar Triangle = function(a, b, c) {\n /**\n * Triangle points\n * @private\n * @type {Array.<XY>}\n */\n this.points_ = [a, b, c];\n\n /**\n * Neighbor list\n * @private\n * @type {Array.<Triangle>}\n */\n this.neighbors_ = [null, null, null];\n\n /**\n * Has this triangle been marked as an interior triangle?\n * @private\n * @type {boolean}\n */\n this.interior_ = false;\n\n /**\n * Flags to determine if an edge is a Constrained edge\n * @private\n * @type {Array.<boolean>}\n */\n this.constrained_edge = [false, false, false];\n\n /**\n * Flags to determine if an edge is a Delauney edge\n * @private\n * @type {Array.<boolean>}\n */\n this.delaunay_edge = [false, false, false];\n};\n\nvar p2s = xy.toString;\n/**\n * For pretty printing ex. <code>\"[(5;42)(10;20)(21;30)]\"</code>.\n * @public\n * @return {string}\n */\nTriangle.prototype.toString = function() {\n return (\"[\" + p2s(this.points_[0]) + p2s(this.points_[1]) + p2s(this.points_[2]) + \"]\");\n};\n\n/**\n * Get one vertice of the triangle.\n * The output triangles of a triangulation have vertices which are references\n * to the initial input points (not copies): any custom fields in the\n * initial points can be retrieved in the output triangles.\n * @example\n * var contour = [{x:100, y:100, id:1}, {x:100, y:300, id:2}, {x:300, y:300, id:3}];\n * var swctx = new poly2tri.SweepContext(contour);\n * swctx.triangulate();\n * var triangles = swctx.getTriangles();\n * typeof triangles[0].getPoint(0).id\n * // → \"number\"\n * @param {number} index - vertice index: 0, 1 or 2\n * @public\n * @returns {XY}\n */\nTriangle.prototype.getPoint = function(index) {\n return this.points_[index];\n};\n\n/**\n * For backward compatibility\n * @function\n * @deprecated use {@linkcode Triangle#getPoint} instead\n */\nTriangle.prototype.GetPoint = Triangle.prototype.getPoint;\n\n/**\n * Get all 3 vertices of the triangle as an array\n * @public\n * @return {Array.<XY>}\n */\n// Method added in the JavaScript version (was not present in the c++ version)\nTriangle.prototype.getPoints = function() {\n return this.points_;\n};\n\n/**\n * @private\n * @param {number} index\n * @returns {?Triangle}\n */\nTriangle.prototype.getNeighbor = function(index) {\n return this.neighbors_[index];\n};\n\n/**\n * Test if this Triangle contains the Point object given as parameter as one of its vertices.\n * Only point references are compared, not values.\n * @public\n * @param {XY} point - point object with {x,y}\n * @return {boolean} <code>True</code> if the Point object is of the Triangle's vertices,\n * <code>false</code> otherwise.\n */\nTriangle.prototype.containsPoint = function(point) {\n var points = this.points_;\n // Here we are comparing point references, not values\n return (point === points[0] || point === points[1] || point === points[2]);\n};\n\n/**\n * Test if this Triangle contains the Edge object given as parameter as its\n * bounding edges. Only point references are compared, not values.\n * @private\n * @param {Edge} edge\n * @return {boolean} <code>True</code> if the Edge object is of the Triangle's bounding\n * edges, <code>false</code> otherwise.\n */\nTriangle.prototype.containsEdge = function(edge) {\n return this.containsPoint(edge.p) && this.containsPoint(edge.q);\n};\n\n/**\n * Test if this Triangle contains the two Point objects given as parameters among its vertices.\n * Only point references are compared, not values.\n * @param {XY} p1 - point object with {x,y}\n * @param {XY} p2 - point object with {x,y}\n * @return {boolean}\n */\nTriangle.prototype.containsPoints = function(p1, p2) {\n return this.containsPoint(p1) && this.containsPoint(p2);\n};\n\n/**\n * Has this triangle been marked as an interior triangle?\n * @returns {boolean}\n */\nTriangle.prototype.isInterior = function() {\n return this.interior_;\n};\n\n/**\n * Mark this triangle as an interior triangle\n * @private\n * @param {boolean} interior\n * @returns {Triangle} this\n */\nTriangle.prototype.setInterior = function(interior) {\n this.interior_ = interior;\n return this;\n};\n\n/**\n * Update neighbor pointers.\n * @private\n * @param {XY} p1 - point object with {x,y}\n * @param {XY} p2 - point object with {x,y}\n * @param {Triangle} t Triangle object.\n * @throws {Error} if can't find objects\n */\nTriangle.prototype.markNeighborPointers = function(p1, p2, t) {\n var points = this.points_;\n // Here we are comparing point references, not values\n if ((p1 === points[2] && p2 === points[1]) || (p1 === points[1] && p2 === points[2])) {\n this.neighbors_[0] = t;\n } else if ((p1 === points[0] && p2 === points[2]) || (p1 === points[2] && p2 === points[0])) {\n this.neighbors_[1] = t;\n } else if ((p1 === points[0] && p2 === points[1]) || (p1 === points[1] && p2 === points[0])) {\n this.neighbors_[2] = t;\n } else {\n throw new Error('poly2tri Invalid Triangle.markNeighborPointers() call');\n }\n};\n\n/**\n * Exhaustive search to update neighbor pointers\n * @private\n * @param {!Triangle} t\n */\nTriangle.prototype.markNeighbor = function(t) {\n var points = this.points_;\n if (t.containsPoints(points[1], points[2])) {\n this.neighbors_[0] = t;\n t.markNeighborPointers(points[1], points[2], this);\n } else if (t.containsPoints(points[0], points[2])) {\n this.neighbors_[1] = t;\n t.markNeighborPointers(points[0], points[2], this);\n } else if (t.containsPoints(points[0], points[1])) {\n this.neighbors_[2] = t;\n t.markNeighborPointers(points[0], points[1], this);\n }\n};\n\n\nTriangle.prototype.clearNeighbors = function() {\n this.neighbors_[0] = null;\n this.neighbors_[1] = null;\n this.neighbors_[2] = null;\n};\n\nTriangle.prototype.clearDelaunayEdges = function() {\n this.delaunay_edge[0] = false;\n this.delaunay_edge[1] = false;\n this.delaunay_edge[2] = false;\n};\n\n/**\n * Returns the point clockwise to the given point.\n * @private\n * @param {XY} p - point object with {x,y}\n */\nTriangle.prototype.pointCW = function(p) {\n var points = this.points_;\n // Here we are comparing point references, not values\n if (p === points[0]) {\n return points[2];\n } else if (p === points[1]) {\n return points[0];\n } else if (p === points[2]) {\n return points[1];\n } else {\n return null;\n }\n};\n\n/**\n * Returns the point counter-clockwise to the given point.\n * @private\n * @param {XY} p - point object with {x,y}\n */\nTriangle.prototype.pointCCW = function(p) {\n var points = this.points_;\n // Here we are comparing point references, not values\n if (p === points[0]) {\n return points[1];\n } else if (p === points[1]) {\n return points[2];\n } else if (p === points[2]) {\n return points[0];\n } else {\n return null;\n }\n};\n\n/**\n * Returns the neighbor clockwise to given point.\n * @private\n * @param {XY} p - point object with {x,y}\n */\nTriangle.prototype.neighborCW = function(p) {\n // Here we are comparing point references, not values\n if (p === this.points_[0]) {\n return this.neighbors_[1];\n } else if (p === this.points_[1]) {\n return this.neighbors_[2];\n } else {\n return this.neighbors_[0];\n }\n};\n\n/**\n * Returns the neighbor counter-clockwise to given point.\n * @private\n * @param {XY} p - point object with {x,y}\n */\nTriangle.prototype.neighborCCW = function(p) {\n // Here we are comparing point references, not values\n if (p === this.points_[0]) {\n return this.neighbors_[2];\n } else if (p === this.points_[1]) {\n return this.neighbors_[0];\n } else {\n return this.neighbors_[1];\n }\n};\n\nTriangle.prototype.getConstrainedEdgeCW = function(p) {\n // Here we are comparing point references, not values\n if (p === this.points_[0]) {\n return this.constrained_edge[1];\n } else if (p === this.points_[1]) {\n return this.constrained_edge[2];\n } else {\n return this.constrained_edge[0];\n }\n};\n\nTriangle.prototype.getConstrainedEdgeCCW = function(p) {\n // Here we are comparing point references, not values\n if (p === this.points_[0]) {\n return this.constrained_edge[2];\n } else if (p === this.points_[1]) {\n return this.constrained_edge[0];\n } else {\n return this.constrained_edge[1];\n }\n};\n\n// Additional check from Java version (see issue #88)\nTriangle.prototype.getConstrainedEdgeAcross = function(p) {\n // Here we are comparing point references, not values\n if (p === this.points_[0]) {\n return this.constrained_edge[0];\n } else if (p === this.points_[1]) {\n return this.constrained_edge[1];\n } else {\n return this.constrained_edge[2];\n }\n};\n\nTriangle.prototype.setConstrainedEdgeCW = function(p, ce) {\n // Here we are comparing point references, not values\n if (p === this.points_[0]) {\n this.constrained_edge[1] = ce;\n } else if (p === this.points_[1]) {\n this.constrained_edge[2] = ce;\n } else {\n this.constrained_edge[0] = ce;\n }\n};\n\nTriangle.prototype.setConstrainedEdgeCCW = function(p, ce) {\n // Here we are comparing point references, not values\n if (p === this.points_[0]) {\n this.constrained_edge[2] = ce;\n } else if (p === this.points_[1]) {\n this.constrained_edge[0] = ce;\n } else {\n this.constrained_edge[1] = ce;\n }\n};\n\nTriangle.prototype.getDelaunayEdgeCW = function(p) {\n // Here we are comparing point references, not values\n if (p === this.points_[0]) {\n return this.delaunay_edge[1];\n } else if (p === this.points_[1]) {\n return this.delaunay_edge[2];\n } else {\n return this.delaunay_edge[0];\n }\n};\n\nTriangle.prototype.getDelaunayEdgeCCW = function(p) {\n // Here we are comparing point references, not values\n if (p === this.points_[0]) {\n return this.delaunay_edge[2];\n } else if (p === this.points_[1]) {\n return this.delaunay_edge[0];\n } else {\n return this.delaunay_edge[1];\n }\n};\n\nTriangle.prototype.setDelaunayEdgeCW = function(p, e) {\n // Here we are comparing point references, not values\n if (p === this.points_[0]) {\n this.delaunay_edge[1] = e;\n } else if (p === this.points_[1]) {\n this.delaunay_edge[2] = e;\n } else {\n this.delaunay_edge[0] = e;\n }\n};\n\nTriangle.prototype.setDelaunayEdgeCCW = function(p, e) {\n // Here we are comparing point references, not values\n if (p === this.points_[0]) {\n this.delaunay_edge[2] = e;\n } else if (p === this.points_[1]) {\n this.delaunay_edge[0] = e;\n } else {\n this.delaunay_edge[1] = e;\n }\n};\n\n/**\n * The neighbor across to given point.\n * @private\n * @param {XY} p - point object with {x,y}\n * @returns {Triangle}\n */\nTriangle.prototype.neighborAcross = function(p) {\n // Here we are comparing point references, not values\n if (p === this.points_[0]) {\n return this.neighbors_[0];\n } else if (p === this.points_[1]) {\n return this.neighbors_[1];\n } else {\n return this.neighbors_[2];\n }\n};\n\n/**\n * @private\n * @param {!Triangle} t Triangle object.\n * @param {XY} p - point object with {x,y}\n */\nTriangle.prototype.oppositePoint = function(t, p) {\n var cw = t.pointCW(p);\n return this.pointCW(cw);\n};\n\n/**\n * Legalize triangle by rotating clockwise around oPoint\n * @private\n * @param {XY} opoint - point object with {x,y}\n * @param {XY} npoint - point object with {x,y}\n * @throws {Error} if oPoint can not be found\n */\nTriangle.prototype.legalize = function(opoint, npoint) {\n var points = this.points_;\n // Here we are comparing point references, not values\n if (opoint === points[0]) {\n points[1] = points[0];\n points[0] = points[2];\n points[2] = npoint;\n } else if (opoint === points[1]) {\n points[2] = points[1];\n points[1] = points[0];\n points[0] = npoint;\n } else if (opoint === points[2]) {\n points[0] = points[2];\n points[2] = points[1];\n points[1] = npoint;\n } else {\n throw new Error('poly2tri Invalid Triangle.legalize() call');\n }\n};\n\n/**\n * Returns the index of a point in the triangle. \n * The point *must* be a reference to one of the triangle's vertices.\n * @private\n * @param {XY} p - point object with {x,y}\n * @returns {number} index 0, 1 or 2\n * @throws {Error} if p can not be found\n */\nTriangle.prototype.index = function(p) {\n var points = this.points_;\n // Here we are comparing point references, not values\n if (p === points[0]) {\n return 0;\n } else if (p === points[1]) {\n return 1;\n } else if (p === points[2]) {\n return 2;\n } else {\n throw new Error('poly2tri Invalid Triangle.index() call');\n }\n};\n\n/**\n * @private\n * @param {XY} p1 - point object with {x,y}\n * @param {XY} p2 - point object with {x,y}\n * @return {number} index 0, 1 or 2, or -1 if errror\n */\nTriangle.prototype.edgeIndex = function(p1, p2) {\n var points = this.points_;\n // Here we are comparing point references, not values\n if (p1 === points[0]) {\n if (p2 === points[1]) {\n return 2;\n } else if (p2 === points[2]) {\n return 1;\n }\n } else if (p1 === points[1]) {\n if (p2 === points[2]) {\n return 0;\n } else if (p2 === points[0]) {\n return 2;\n }\n } else if (p1 === points[2]) {\n if (p2 === points[0]) {\n return 1;\n } else if (p2 === points[1]) {\n return 0;\n }\n }\n return -1;\n};\n\n/**\n * Mark an edge of this triangle as constrained.\n * @private\n * @param {number} index - edge index\n */\nTriangle.prototype.markConstrainedEdgeByIndex = function(index) {\n this.constrained_edge[index] = true;\n};\n/**\n * Mark an edge of this triangle as constrained.\n * @private\n * @param {Edge} edge instance\n */\nTriangle.prototype.markConstrainedEdgeByEdge = function(edge) {\n this.markConstrainedEdgeByPoints(edge.p, edge.q);\n};\n/**\n * Mark an edge of this triangle as constrained.\n * This method takes two Point instances defining the edge of the triangle.\n * @private\n * @param {XY} p - point object with {x,y}\n * @param {XY} q - point object with {x,y}\n */\nTriangle.prototype.markConstrainedEdgeByPoints = function(p, q) {\n var points = this.points_;\n // Here we are comparing point references, not values \n if ((q === points[0] && p === points[1]) || (q === points[1] && p === points[0])) {\n this.constrained_edge[2] = true;\n } else if ((q === points[0] && p === points[2]) || (q === points[2] && p === points[0])) {\n this.constrained_edge[1] = true;\n } else if ((q === points[1] && p === points[2]) || (q === points[2] && p === points[1])) {\n this.constrained_edge[0] = true;\n }\n};\n\n\n// ---------------------------------------------------------Exports (public API)\n\nmodule.exports = Triangle;\n","/*\n * Poly2Tri Copyright (c) 2009-2014, Poly2Tri Contributors\n * http://code.google.com/p/poly2tri/\n *\n * poly2tri.js (JavaScript port) (c) 2009-2014, Poly2Tri Contributors\n * https://github.com/r3mi/poly2tri.js\n *\n * All rights reserved.\n *\n * Distributed under the 3-clause BSD License, see LICENSE.txt\n */\n\n\"use strict\";\n\n/*\n * Function added in the JavaScript version (was not present in the c++ version)\n */\n\n/**\n * assert and throw an exception.\n *\n * @private\n * @param {boolean} condition the condition which is asserted\n * @param {string} message the message which is display is condition is falsy\n */\nfunction assert(condition, message) {\n if (!condition) {\n throw new Error(message || \"Assert Failed\");\n }\n}\nmodule.exports = assert;\n\n\n","/*\n * Poly2Tri Copyright (c) 2009-2014, Poly2Tri Contributors\n * http://code.google.com/p/poly2tri/\n * \n * poly2tri.js (JavaScript port) (c) 2009-2014, Poly2Tri Contributors\n * https://github.com/r3mi/poly2tri.js\n * \n * All rights reserved.\n * \n * Distributed under the 3-clause BSD License, see LICENSE.txt\n */\n\n/* jshint maxcomplexity:11 */\n\n\"use strict\";\n\n\n/*\n * Note\n * ====\n * the structure of this JavaScript version of poly2tri intentionally follows\n * as closely as possible the structure of the reference C++ version, to make it \n * easier to keep the 2 versions in sync.\n */\n\n\n// -------------------------------------------------------------------------Node\n\n/**\n * Advancing front node\n * @constructor\n * @private\n * @struct\n * @param {!XY} p - Point\n * @param {Triangle=} t triangle (optional)\n */\nvar Node = function(p, t) {\n /** @type {XY} */\n this.point = p;\n\n /** @type {Triangle|null} */\n this.triangle = t || null;\n\n /** @type {Node|null} */\n this.next = null;\n /** @type {Node|null} */\n this.prev = null;\n\n /** @type {number} */\n this.value = p.x;\n};\n\n// ---------------------------------------------------------------AdvancingFront\n/**\n * @constructor\n * @private\n * @struct\n * @param {Node} head\n * @param {Node} tail\n */\nvar AdvancingFront = function(head, tail) {\n /** @type {Node} */\n this.head_ = head;\n /** @type {Node} */\n this.tail_ = tail;\n /** @type {Node} */\n this.search_node_ = head;\n};\n\n/** @return {Node} */\nAdvancingFront.prototype.head = function() {\n return this.head_;\n};\n\n/** @param {Node} node */\nAdvancingFront.prototype.setHead = function(node) {\n this.head_ = node;\n};\n\n/** @return {Node} */\nAdvancingFront.prototype.tail = function() {\n return this.tail_;\n};\n\n/** @param {Node} node */\nAdvancingFront.prototype.setTail = function(node) {\n this.tail_ = node;\n};\n\n/** @return {Node} */\nAdvancingFront.prototype.search = function() {\n return this.search_node_;\n};\n\n/** @param {Node} node */\nAdvancingFront.prototype.setSearch = function(node) {\n this.search_node_ = node;\n};\n\n/** @return {Node} */\nAdvancingFront.prototype.findSearchNode = function(/*x*/) {\n // TODO: implement BST index\n return this.search_node_;\n};\n\n/**\n * @param {number} x value\n * @return {Node}\n */\nAdvancingFront.prototype.locateNode = function(x) {\n var node = this.search_node_;\n\n /* jshint boss:true */\n if (x < node.value) {\n while (node = node.prev) {\n if (x >= node.value) {\n this.search_node_ = node;\n return node;\n }\n }\n } else {\n while (node = node.next) {\n if (x < node.value) {\n this.search_node_ = node.prev;\n return node.prev;\n }\n }\n }\n return null;\n};\n\n/**\n * @param {!XY} point - Point\n * @return {Node}\n */\nAdvancingFront.prototype.locatePoint = function(point) {\n var px = point.x;\n var node = this.findSearchNode(px);\n var nx = node.point.x;\n\n if (px === nx) {\n // Here we are comparing point references, not values\n if (point !== node.point) {\n // We might have two nodes with same x value for a short time\n if (point === node.prev.point) {\n node = node.prev;\n } else if (point === node.next.point) {\n node = node.next;\n } else {\n throw new Error('poly2tri Invalid AdvancingFront.locatePoint() call');\n }\n }\n } else if (px < nx) {\n /* jshint boss:true */\n while (node = node.prev) {\n if (point === node.point) {\n break;\n }\n }\n } else {\n while (node = node.next) {\n if (point === node.point) {\n break;\n }\n }\n }\n\n if (node) {\n this.search_node_ = node;\n }\n return node;\n};\n\n\n// ----------------------------------------------------------------------Exports\n\nmodule.exports = AdvancingFront;\nmodule.exports.Node = Node;\n\n","/*\n * Poly2Tri Copyright (c) 2009-2014, Poly2Tri Contributors\n * http://code.google.com/p/poly2tri/\n * \n * poly2tri.js (JavaScript port) (c) 2009-2014, Poly2Tri Contributors\n * https://github.com/r3mi/poly2tri.js\n * \n * All rights reserved.\n * \n * Distributed under the 3-clause BSD License, see LICENSE.txt\n */\n\n\"use strict\";\n\n/**\n * Precision to detect repeated or collinear points\n * @private\n * @const {number}\n * @default\n */\nvar EPSILON = 1e-12;\nexports.EPSILON = EPSILON;\n\n/**\n * @private\n * @enum {number}\n * @readonly\n */\nvar Orientation = {\n \"CW\": 1,\n \"CCW\": -1,\n \"COLLINEAR\": 0\n};\nexports.Orientation = Orientation;\n\n\n/**\n * Formula to calculate signed area<br>\n * Positive if CCW<br>\n * Negative if CW<br>\n * 0 if collinear<br>\n * <pre>\n * A[P1,P2,P3] = (x1*y2 - y1*x2) + (x2*y3 - y2*x3) + (x3*y1 - y3*x1)\n * = (x1-x3)*(y2-y3) - (y1-y3)*(x2-x3)\n * </pre>\n *\n * @private\n * @param {!XY} pa point object with {x,y}\n * @param {!XY} pb point object with {x,y}\n * @param {!XY} pc point object with {x,y}\n * @return {Orientation}\n */\nfunction orient2d(pa, pb, pc) {\n var detleft = (pa.x - pc.x) * (pb.y - pc.y);\n var detright = (pa.y - pc.y) * (pb.x - pc.x);\n var val = detleft - detright;\n if (val > -(EPSILON) && val < (EPSILON)) {\n return Orientation.COLLINEAR;\n } else if (val > 0) {\n return Orientation.CCW;\n } else {\n return Orientation.CW;\n }\n}\nexports.orient2d = orient2d;\n\n\n/**\n *\n * @private\n * @param {!XY} pa point object with {x,y}\n * @param {!XY} pb point object with {x,y}\n * @param {!XY} pc point object with {x,y}\n * @param {!XY} pd point object with {x,y}\n * @return {boolean}\n */\nfunction inScanArea(pa, pb, pc, pd) {\n var oadb = (pa.x - pb.x) * (pd.y - pb.y) - (pd.x - pb.x) * (pa.y - pb.y);\n if (oadb >= -EPSILON) {\n return false;\n }\n\n var oadc = (pa.x - pc.x) * (pd.y - pc.y) - (pd.x - pc.x) * (pa.y - pc.y);\n if (oadc <= EPSILON) {\n return false;\n }\n return true;\n}\nexports.inScanArea = inScanArea;\n\n\n/**\n * Check if the angle between (pa,pb) and (pa,pc) is obtuse i.e. (angle > π/2 || angle < -π/2)\n *\n * @private\n * @param {!XY} pa point object with {x,y}\n * @param {!XY} pb point object with {x,y}\n * @param {!XY} pc point object with {x,y}\n * @return {boolean} true if angle is obtuse\n */\nfunction isAngleObtuse(pa, pb, pc) {\n var ax = pb.x - pa.x;\n var ay = pb.y - pa.y;\n var bx = pc.x - pa.x;\n var by = pc.y - pa.y;\n return (ax * bx + ay * by) < 0;\n}\nexports.isAngleObtuse = isAngleObtuse;\n\n","/*\n * Poly2Tri Copyright (c) 2009-2014, Poly2Tri Contributors\n * http://code.google.com/p/poly2tri/\n * \n * poly2tri.js (JavaScript port) (c) 2009-2014, Poly2Tri Contributors\n * https://github.com/r3mi/poly2tri.js\n * \n * All rights reserved.\n * \n * Distributed under the 3-clause BSD License, see LICENSE.txt\n */\n\n/* jshint latedef:nofunc, maxcomplexity:9 */\n\n\"use strict\";\n\n/**\n * This 'Sweep' module is present in order to keep this JavaScript version\n * as close as possible to the reference C++ version, even though almost all\n * functions could be declared as methods on the {@linkcode module:sweepcontext~SweepContext} object.\n * @module\n * @private\n */\n\n/*\n * Note\n * ====\n * the structure of this JavaScript version of poly2tri intentionally follows\n * as closely as possible the structure of the reference C++ version, to make it \n * easier to keep the 2 versions in sync.\n */\n\nvar assert = require('./assert');\nvar PointError = require('./pointerror');\nvar Triangle = require('./triangle');\nvar Node = require('./advancingfront').Node;\n\n\n// ------------------------------------------------------------------------utils\n\nvar utils = require('./utils');\n\n/** @const */\nvar EPSILON = utils.EPSILON;\n\n/** @const */\nvar Orientation = utils.Orientation;\n/** @const */\nvar orient2d = utils.orient2d;\n/** @const */\nvar inScanArea = utils.inScanArea;\n/** @const */\nvar isAngleObtuse = utils.isAngleObtuse;\n\n\n// ------------------------------------------------------------------------Sweep\n\n/**\n * Triangulate the polygon with holes and Steiner points.\n * Do this AFTER you've added the polyline, holes, and Steiner points\n * @private\n * @param {!SweepContext} tcx - SweepContext object\n */\nfunction triangulate(tcx) {\n tcx.initTriangulation();\n tcx.createAdvancingFront();\n // Sweep points; build mesh\n sweepPoints(tcx);\n // Clean up\n finalizationPolygon(tcx);\n}\n\n/**\n * Start sweeping the Y-sorted point set from bottom to top\n * @param {!SweepContext} tcx - SweepContext object\n */\nfunction sweepPoints(tcx) {\n var i, len = tcx.pointCount();\n for (i = 1; i < len; ++i) {\n var point = tcx.getPoint(i);\n var node = pointEvent(tcx, point);\n var edges = point._p2t_edge_list;\n for (var j = 0; edges && j < edges.length; ++j) {\n edgeEventByEdge(tcx, edges[j], node);\n }\n }\n}\n\n/**\n * @param {!SweepContext} tcx - SweepContext object\n */\nfunction finalizationPolygon(tcx) {\n // Get an Internal triangle to start with\n var t = tcx.front().head().next.triangle;\n var p = tcx.front().head().next.point;\n while (!t.getConstrainedEdgeCW(p)) {\n t = t.neighborCCW(p);\n }\n\n // Collect interior triangles constrained by edges\n tcx.meshClean(t);\n}\n\n/**\n * Find closes node to the left of the new point and\n * create a new triangle. If needed new holes and basins\n * will be filled to.\n * @param {!SweepContext} tcx - SweepContext object\n * @param {!XY} point Point\n */\nfunction pointEvent(tcx, point) {\n var node = tcx.locateNode(point);\n var new_node = newFrontTriangle(tcx, point, node);\n\n // Only need to check +epsilon since point never have smaller\n // x value than node due to how we fetch nodes from the front\n if (point.x <= node.point.x + (EPSILON)) {\n fill(tcx, node);\n }\n\n //tcx.AddNode(new_node);\n\n fillAdvancingFront(tcx, new_node);\n return new_node;\n}\n\nfunction edgeEventByEdge(tcx, edge, node) {\n tcx.edge_event.constrained_edge = edge;\n tcx.edge_event.right = (edge.p.x > edge.q.x);\n\n if (isEdgeSideOfTriangle(node.triangle, edge.p, edge.q)) {\n return;\n }\n\n // For now we will do all needed filling\n // TODO: integrate with flip process might give some better performance\n // but for now this avoid the issue with cases that needs both flips and fills\n fillEdgeEvent(tcx, edge, node);\n edgeEventByPoints(tcx, edge.p, edge.q, node.triangle, edge.q);\n}\n\nfunction edgeEventByPoints(tcx, ep, eq, triangle, point) {\n if (isEdgeSideOfTriangle(triangle, ep, eq)) {\n return;\n }\n\n var p1 = triangle.pointCCW(point);\n var o1 = orient2d(eq, p1, ep);\n if (o1 === Orientation.COLLINEAR) {\n // TODO integrate here changes from C++ version\n // (C++ repo revision 09880a869095 dated March 8, 2011)\n throw new PointError('poly2tri EdgeEvent: Collinear not supported!', [eq, p1, ep]);\n }\n\n var p2 = triangle.pointCW(point);\n var o2 = orient2d(eq, p2, ep);\n if (o2 === Orientation.COLLINEAR) {\n // TODO integrate here changes from C++ version\n // (C++ repo revision 09880a869095 dated March 8, 2011)\n throw new PointError('poly2tri EdgeEvent: Collinear not supported!', [eq, p2, ep]);\n }\n\n if (o1 === o2) {\n // Need to decide if we are rotating CW or CCW to get to a triangle\n // that will cross edge\n if (o1 === Orientation.CW) {\n triangle = triangle.neighborCCW(point);\n } else {\n triangle = triangle.neighborCW(point);\n }\n edgeEventByPoints(tcx, ep, eq, triangle, point);\n } else {\n // This triangle crosses constraint so lets flippin start!\n flipEdgeEvent(tcx, ep, eq, triangle, point);\n }\n}\n\nfunction isEdgeSideOfTriangle(triangle, ep, eq) {\n var index = triangle.edgeIndex(ep, eq);\n if (index !== -1) {\n triangle.markConstrainedEdgeByIndex(index);\n var t = triangle.getNeighbor(index);\n if (t) {\n t.markConstrainedEdgeByPoints(ep, eq);\n }\n return true;\n }\n return false;\n}\n\n/**\n * Creates a new front triangle and legalize it\n * @param {!SweepContext} tcx - SweepContext object\n */\nfunction newFrontTriangle(tcx, point, node) {\n var triangle = new Triangle(point, node.point, node.next.point);\n\n triangle.markNeighbor(node.triangle);\n tcx.addToMap(triangle);\n\n var new_node = new Node(point);\n new_node.next = node.next;\n new_node.prev = node;\n node.next.prev = new_node;\n node.next = new_node;\n\n if (!legalize(tcx, triangle)) {\n tcx.mapTriangleToNodes(triangle);\n }\n\n return new_node;\n}\n\n/**\n * Adds a triangle to the advancing front to fill a hole.\n * @param {!SweepContext} tcx - SweepContext object\n * @param node - middle node, that is the bottom of the hole\n */\nfunction fill(tcx, node) {\n var triangle = new Triangle(node.prev.point, node.point, node.next.point);\n\n // TODO: should copy the constrained_edge value from neighbor triangles\n // for now constrained_edge values are copied during the legalize\n triangle.markNeighbor(node.prev.triangle);\n triangle.markNeighbor(node.triangle);\n\n tcx.addToMap(triangle);\n\n // Update the advancing front\n node.prev.next = node.next;\n node.next.prev = node.prev;\n\n\n // If it was legalized the triangle has already been mapped\n if (!legalize(tcx, triangle)) {\n tcx.mapTriangleToNodes(triangle);\n }\n\n //tcx.removeNode(node);\n}\n\n/**\n * Fills holes in the Advancing Front\n * @param {!SweepContext} tcx - SweepContext object\n */\nfunction fillAdvancingFront(tcx, n) {\n // Fill right holes\n var node = n.next;\n while (node.next) {\n // TODO integrate here changes from C++ version\n // (C++ repo revision acf81f1f1764 dated April 7, 2012)\n if (isAngleObtuse(node.point, node.next.point, node.prev.point)) {\n break;\n }\n fill(tcx, node);\n node = node.next;\n }\n\n // Fill left holes\n node = n.prev;\n while (node.prev) {\n // TODO integrate here changes from C++ version\n // (C++ repo revision acf81f1f1764 dated April 7, 2012)\n if (isAngleObtuse(node.point, node.next.point, node.prev.point)) {\n break;\n }\n fill(tcx, node);\n node = node.prev;\n }\n\n // Fill right basins\n if (n.next && n.next.next) {\n if (isBasinAngleRight(n)) {\n fillBasin(tcx, n);\n }\n }\n}\n\n/**\n * The basin angle is decided against the horizontal line [1,0].\n * @param {Node} node\n * @return {boolean} true if angle < 3*π/4\n */\nfunction isBasinAngleRight(node) {\n var ax = node.point.x - node.next.next.point.x;\n var ay = node.point.y - node.next.next.point.y;\n assert(ay >= 0, \"unordered y\");\n return (ax >= 0 || Math.abs(ax) < ay);\n}\n\n/**\n * Returns true if triangle was legalized\n * @param {!SweepContext} tcx - SweepContext object\n * @return {boolean}\n */\nfunction legalize(tcx, t) {\n // To legalize a triangle we start by finding if any of the three edges\n // violate the Delaunay condition\n for (var i = 0; i < 3; ++i) {\n if (t.delaunay_edge[i]) {\n continue;\n }\n var ot = t.getNeighbor(i);\n if (ot) {\n var p = t.getPoint(i);\n var op = ot.oppositePoint(t, p);\n var oi = ot.index(op);\n\n // If this is a Constrained Edge or a Delaunay Edge(only during recursive legalization)\n // then we should not try to legalize\n if (ot.constrained_edge[oi] || ot.delaunay_edge[oi]) {\n t.constrained_edge[i] = ot.constrained_edge[oi];\n continue;\n }\n\n var inside = inCircle(p, t.pointCCW(p), t.pointCW(p), op);\n if (inside) {\n // Lets mark this shared edge as Delaunay\n t.delaunay_edge[i] = true;\n ot.delaunay_edge[oi] = true;\n\n // Lets rotate shared edge one vertex CW to legalize it\n rotateTrianglePair(t, p, ot, op);\n\n // We now got one valid Delaunay Edge shared by two triangles\n // This gives us 4 new edges to check for Delaunay\n\n // Make sure that triangle to node mapping is done only one time for a specific triangle\n var not_legalized = !legalize(tcx, t);\n if (not_legalized) {\n tcx.mapTriangleToNodes(t);\n }\n\n not_legalized = !legalize(tcx, ot);\n if (not_legalized) {\n tcx.mapTriangleToNodes(ot);\n }\n // Reset the Delaunay edges, since they only are valid Delaunay edges\n // until we add a new triangle or point.\n // XXX: need to think about this. Can these edges be tried after we\n // return to previous recursive level?\n t.delaunay_edge[i] = false;\n ot.delaunay_edge[oi] = false;\n\n // If triangle have been legalized no need to check the other edges since\n // the recursive legalization will handles those so we can end here.\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * <b>Requirement</b>:<br>\n * 1. a,b and c form a triangle.<br>\n * 2. a and d is know to be on opposite side of bc<br>\n * <pre>\n * a\n * +\n * / \\\n * / \\\n * b/ \\c\n * +-------+\n * / d \\\n * / \\\n * </pre>\n * <b>Fact</b>: d has to be in area B to have a chance to be inside the circle formed by\n * a,b and c<br>\n * d is outside B if orient2d(a,b,d) or orient2d(c,a,d) is CW<br>\n * This preknowledge gives us a way to optimize the incircle test\n * @param pa - triangle point, opposite d\n * @param pb - triangle point\n * @param pc - triangle point\n * @param pd - point opposite a\n * @return {boolean} true if d is inside circle, false if on circle edge\n */\nfunction inCircle(pa, pb, pc, pd) {\n var adx = pa.x - pd.x;\n var ady = pa.y - pd.y;\n var bdx = pb.x - pd.x;\n var bdy = pb.y - pd.y;\n\n var adxbdy = adx * bdy;\n var bdxady = bdx * ady;\n var oabd = adxbdy - bdxady;\n if (oabd <= 0) {\n return false;\n }\n\n var cdx = pc.x - pd.x;\n var cdy = pc.y - pd.y;\n\n var cdxady = cdx * ady;\n var adxcdy = adx * cdy;\n var ocad = cdxady - adxcdy;\n if (ocad <= 0) {\n return false;\n }\n\n var bdxcdy = bdx * cdy;\n var cdxbdy = cdx * bdy;\n\n var alift = adx * adx + ady * ady;\n var blift = bdx * bdx + bdy * bdy;\n var clift = cdx * cdx + cdy * cdy;\n\n var det = alift * (bdxcdy - cdxbdy) + blift * ocad + clift * oabd;\n return det > 0;\n}\n\n/**\n * Rotates a triangle pair one vertex CW\n *<pre>\n * n2 n2\n * P +-----+ P +-----+\n * | t /| |\\ t |\n * | / | | \\ |\n * n1| / |n3 n1| \\ |n3\n * | / | after CW | \\ |\n * |/ oT | | oT \\|\n * +-----+ oP +-----+\n * n4 n4\n * </pre>\n */\nfunction rotateTrianglePair(t, p, ot, op) {\n var n1, n2, n3, n4;\n n1 = t.neighborCCW(p);\n n2 = t.neighborCW(p);\n n3 = ot.neighborCCW(op);\n n4 = ot.neighborCW(op);\n\n var ce1, ce2, ce3, ce4;\n ce1 = t.getConstrainedEdgeCCW(p);\n ce2 = t.getConstrainedEdgeCW(p);\n ce3 = ot.getConstrainedEdgeCCW(op);\n ce4 = ot.getConstrainedEdgeCW(op);\n\n var de1, de2, de3, de4;\n de1 = t.getDelaunayEdgeCCW(p);\n de2 = t.getDelaunayEdgeCW(p);\n de3 = ot.getDelaunayEdgeCCW(op);\n de4 = ot.getDelaunayEdgeCW(op);\n\n t.legalize(p, op);\n ot.legalize(op, p);\n\n // Remap delaunay_edge\n ot.setDelaunayEdgeCCW(p, de1);\n t.setDelaunayEdgeCW(p, de2);\n t.setDelaunayEdgeCCW(op, de3);\n ot.setDelaunayEdgeCW(op, de4);\n\n // Remap constrained_edge\n ot.setConstrainedEdgeCCW(p, ce1);\n t.setConstrainedEdgeCW(p, ce2);\n t.setConstrainedEdgeCCW(op, ce3);\n ot.setConstrainedEdgeCW(op, ce4);\n\n // Remap neighbors\n // XXX: might optimize the markNeighbor by keeping track of\n // what side should be assigned to what neighbor after the\n // rotation. Now mark neighbor does lots of testing to find\n // the right side.\n t.clearNeighbors();\n ot.clearNeighbors();\n if (n1) {\n ot.markNeighbor(n1);\n }\n if (n2) {\n t.markNeighbor(n2);\n }\n if (n3) {\n t.markNeighbor(n3);\n }\n if (n4) {\n ot.markNeighbor(n4);\n }\n t.markNeighbor(ot);\n}\n\n/**\n * Fills a basin that has formed on the Advancing Front to the right\n * of given node.<br>\n * First we decide a left,bottom and right node that forms the\n * boundaries of the basin. Then we do a reqursive fill.\n *\n * @param {!SweepContext} tcx - SweepContext object\n * @param node - starting node, this or next node will be left node\n */\nfunction fillBasin(tcx, node) {\n if (orient2d(node.point, node.next.point, node.next.next.point) === Orientation.CCW) {\n tcx.basin.left_node = node.next.next;\n } else {\n tcx.basin.left_node = node.next;\n }\n\n // Find the bottom and right node\n tcx.basin.bottom_node = tcx.basin.left_node;\n while (tcx.basin.bottom_node.next && tcx.basin.bottom_node.point.y >= tcx.basin.bottom_node.next.point.y) {\n tcx.basin.bottom_node = tcx.basin.bottom_node.next;\n }\n if (tcx.basin.bottom_node === tcx.basin.left_node) {\n // No valid basin\n return;\n }\n\n tcx.basin.right_node = tcx.basin.bottom_node;\n while (tcx.basin.right_node.next && tcx.basin.right_node.point.y < tcx.basin.right_node.next.point.y) {\n tcx.basin.right_node = tcx.basin.right_node.next;\n }\n if (tcx.basin.right_node === tcx.basin.bottom_node) {\n // No valid basins\n return;\n }\n\n tcx.basin.width = tcx.basin.right_node.point.x - tcx.basin.left_node.point.x;\n tcx.basin.left_highest = tcx.basin.left_node.point.y > tcx.basin.right_node.point.y;\n\n fillBasinReq(tcx, tcx.basin.bottom_node);\n}\n\n/**\n * Recursive algorithm to fill a Basin with triangles\n *\n * @param {!SweepContext} tcx - SweepContext object\n * @param node - bottom_node\n */\nfunction fillBasinReq(tcx, node) {\n // if shallow stop filling\n if (isShallow(tcx, node)) {\n return;\n }\n\n fill(tcx, node);\n\n var o;\n if (node.prev === tcx.basin.left_node && node.next === tcx.basin.right_node) {\n return;\n } else if (node.prev === tcx.basin.left_node) {\n o = orient2d(node.point, node.next.point, node.next.next.point);\n if (o === Orientation.CW) {\n return;\n }\n node = node.next;\n } else if (node.next === tcx.basin.right_node) {\n o = orient2d(node.point, node.prev.point, node.prev.prev.point);\n if (o === Orientation.CCW) {\n return;\n }\n node = node.prev;\n } else {\n // Continue with the neighbor node with lowest Y value\n if (node.prev.point.y < node.next.point.y) {\n node = node.prev;\n } else {\n node = node.next;\n }\n }\n\n fillBasinReq(tcx, node);\n}\n\nfunction isShallow(tcx, node) {\n var height;\n if (tcx.basin.left_highest) {\n height = tcx.basin.left_node.point.y - node.point.y;\n } else {\n height = tcx.basin.right_node.point.y - node.point.y;\n }\n\n // if shallow stop filling\n if (tcx.basin.width > height) {\n return true;\n }\n return false;\n}\n\nfunction fillEdgeEvent(tcx, edge, node) {\n if (tcx.edge_event.right) {\n fillRightAboveEdgeEvent(tcx, edge, node);\n } else {\n fillLeftAboveEdgeEvent(tcx, edge, node);\n }\n}\n\nfunction fillRightAboveEdgeEvent(tcx, edge, node) {\n while (node.next.point.x < edge.p.x) {\n // Check if next node is below the edge\n if (orient2d(edge.q, node.next.point, edge.p) === Orientation.CCW) {\n fillRightBelowEdgeEvent(tcx, edge, node);\n } else {\n node = node.next;\n }\n }\n}\n\nfunction fillRightBelowEdgeEvent(tcx, edge, node) {\n if (node.point.x < edge.p.x) {\n if (orient2d(node.point, node.next.point, node.next.next.point) === Orientation.CCW) {\n // Concave\n fillRightConcaveEdgeEvent(tcx, edge, node);\n } else {\n // Convex\n fillRightConvexEdgeEvent(tcx, edge, node);\n // Retry this one\n fillRightBelowEdgeEvent(tcx, edge, node);\n }\n }\n}\n\nfunction fillRightConcaveEdgeEvent(tcx, edge, node) {\n fill(tcx, node.next);\n if (node.next.point !== edge.p) {\n // Next above or below edge?\n if (orient2d(edge.q, node.next.point, edge.p) === Orientation.CCW) {\n // Below\n if (orient2d(node.point, node.next.point, node.next.next.point) === Orientation.CCW) {\n // Next is concave\n fillRightConcaveEdgeEvent(tcx, edge, node);\n } else {\n // Next is convex\n /* jshint noempty:false */\n }\n }\n }\n}\n\nfunction fillRightConvexEdgeEvent(tcx, edge, node) {\n // Next concave or convex?\n if (orient2d(node.next.point, node.next.next.point, node.next.next.next.point) === Orientation.CCW) {\n // Concave\n fillRightConcaveEdgeEvent(tcx, edge, node.next);\n } else {\n // Convex\n // Next above or below edge?\n if (orient2d(edge.q, node.next.next.point, edge.p) === Orientation.CCW) {\n // Below\n fillRightConvexEdgeEvent(tcx, edge, node.next);\n } else {\n // Above\n /* jshint noempty:false */\n }\n }\n}\n\nfunction fillLeftAboveEdgeEvent(tcx, edge, node) {\n while (node.prev.point.x > edge.p.x) {\n // Check if next node is below the edge\n if (orient2d(edge.q, node.prev.point, edge.p) === Orientation.CW) {\n fillLeftBelowEdgeEvent(tcx, edge, node);\n } else {\n node = node.prev;\n }\n }\n}\n\nfunction fillLeftBelowEdgeEvent(tcx, edge, node) {\n if (node.point.x > edge.p.x) {\n if (orient2d(node.point, node.prev.point, node.prev.prev.point) === Orientation.CW) {\n // Concave\n fillLeftConcaveEdgeEvent(tcx, edge, node);\n } else {\n // Convex\n fillLeftConvexEdgeEvent(tcx, edge, node);\n // Retry this one\n fillLeftBelowEdgeEvent(tcx, edge, node);\n }\n }\n}\n\nfunction fillLeftConvexEdgeEvent(tcx, edge, node) {\n // Next concave or convex?\n if (orient2d(node.prev.point, node.prev.prev.point, node.prev.prev.prev.point) === Orientation.CW) {\n // Concave\n fillLeftConcaveEdgeEvent(tcx, edge, node.prev);\n } else {\n // Convex\n // Next above or below edge?\n if (orient2d(edge.q, node.prev.prev.point, edge.p) === Orientation.CW) {\n // Below\n fillLeftConvexEdgeEvent(tcx, edge, node.prev);\n } else {\n // Above\n /* jshint noempty:false */\n }\n }\n}\n\nfunction fillLeftConcaveEdgeEvent(tcx, edge, node) {\n fill(tcx, node.prev);\n if (node.prev.point !== edge.p) {\n // Next above or below edge?\n if (orient2d(edge.q, node.prev.point, edge.p) === Orientation.CW) {\n // Below\n if (orient2d(node.point, node.prev.point, node.prev.prev.point) === Orientation.CW) {\n // Next is concave\n fillLeftConcaveEdgeEvent(tcx, edge, node);\n } else {\n // Next is convex\n /* jshint noempty:false */\n }\n }\n }\n}\n\nfunction flipEdgeEvent(tcx, ep, eq, t, p) {\n var ot = t.neighborAcross(p);\n assert(ot, \"FLIP failed due to missing triangle!\");\n\n var op = ot.oppositePoint(t, p);\n\n // Additional check from Java version (see issue #88)\n if (t.getConstrainedEdgeAcross(p)) {\n var index = t.index(p);\n throw new PointError(\"poly2tri Intersecting Constraints\",\n [p, op, t.getPoint((index + 1) % 3), t.getPoint((index + 2) % 3)]);\n }\n\n if (inScanArea(p, t.pointCCW(p), t.pointCW(p), op)) {\n // Lets rotate shared edge one vertex CW\n rotateTrianglePair(t, p, ot, op);\n tcx.mapTriangleToNodes(t);\n tcx.mapTriangleToNodes(ot);\n\n // XXX: in the original C++ code for the next 2 lines, we are\n // comparing point values (and not pointers). In this JavaScript\n // code, we are comparing point references (pointers). This works\n // because we can't have 2 different points with the same values.\n // But to be really equivalent, we should use \"Point.equals\" here.\n if (p === eq && op === ep) {\n if (eq === tcx.edge_event.constrained_edge.q && ep === tcx.edge_event.constrained_edge.p) {\n t.markConstrainedEdgeByPoints(ep, eq);\n ot.markConstrainedEdgeByPoints(ep, eq);\n legalize(tcx, t);\n legalize(tcx, ot);\n } else {\n // XXX: I think one of the triangles should be legalized here?\n /* jshint noempty:false */\n }\n } else {\n var o = orient2d(eq, op, ep);\n t = nextFlipTriangle(tcx, o, t, ot, p, op);\n flipEdgeEvent(tcx, ep, eq, t, p);\n }\n } else {\n var newP = nextFlipPoint(ep, eq, ot, op);\n flipScanEdgeEvent(tcx, ep, eq, t, ot, newP);\n edgeEventByPoints(tcx, ep, eq, t, p);\n }\n}\n\n/**\n * After a flip we have two triangles and know that only one will still be\n * intersecting the edge. So decide which to contiune with and legalize the other\n *\n * @param {!SweepContext} tcx - SweepContext object\n * @param o - should be the result of an orient2d( eq, op, ep )\n * @param t - triangle 1\n * @param ot - triangle 2\n * @param p - a point shared by both triangles\n * @param op - another point shared by both triangles\n * @return returns the triangle still intersecting the edge\n */\nfunction nextFlipTriangle(tcx, o, t, ot, p, op) {\n var edge_index;\n if (o === Orientation.CCW) {\n // ot is not crossing edge after flip\n edge_index = ot.edgeIndex(p, op);\n ot.delaunay_edge[edge_index] = true;\n legalize(tcx, ot);\n ot.clearDelaunayEdges();\n return t;\n }\n\n // t is not crossing edge after flip\n edge_index = t.edgeIndex(p, op);\n\n t.delaunay_edge[edge_index] = true;\n legalize(tcx, t);\n t.clearDelaunayEdges();\n return ot;\n}\n\n/**\n * When we need to traverse from one triangle to the next we need\n * the point in current triangle that is the opposite point to the next\n * triangle.\n */\nfunction nextFlipPoint(ep, eq, ot, op) {\n var o2d = orient2d(eq, op, ep);\n if (o2d === Orientation.CW) {\n // Right\n return ot.pointCCW(op);\n } else if (o2d === Orientation.CCW) {\n // Left\n return ot.pointCW(op);\n } else {\n throw new PointError(\"poly2tri [Unsupported] nextFlipPoint: opposing point on constrained edge!\", [eq, op, ep]);\n }\n}\n\n/**\n * Scan part of the FlipScan algorithm<br>\n * When a triangle pair isn't flippable we will scan for the next\n * point that is inside the flip triangle scan area. When found\n * we generate a new flipEdgeEvent\n *\n * @param {!SweepContext} tcx - SweepContext object\n * @param ep - last point on the edge we are traversing\n * @param eq - first point on the edge we are traversing\n * @param {!Triangle} flip_triangle - the current triangle sharing the point eq with edge\n * @param t\n * @param p\n */\nfunction flipScanEdgeEvent(tcx, ep, eq, flip_triangle, t, p) {\n var ot = t.neighborAcross(p);\n assert(ot, \"FLIP failed due to missing triangle\");\n\n var op = ot.oppositePoint(t, p);\n\n if (inScanArea(eq, flip_triangle.pointCCW(eq), flip_triangle.pointCW(eq), op)) {\n // flip with new edge op.eq\n flipEdgeEvent(tcx, eq, op, ot, op);\n } else {\n var newP = nextFlipPoint(ep, eq, ot, op);\n flipScanEdgeEvent(tcx, ep, eq, flip_triangle, ot, newP);\n }\n}\n\n\n// ----------------------------------------------------------------------Exports\n\nexports.triangulate = triangulate;\n","/*\n * Poly2Tri Copyright (c) 2009-2014, Poly2Tri Contributors\n * http://code.google.com/p/poly2tri/\n * \n * poly2tri.js (JavaScript port) (c) 2009-2014, Poly2Tri Contributors\n * https://github.com/r3mi/poly2tri.js\n * \n * All rights reserved.\n * \n * Distributed under the 3-clause BSD License, see LICENSE.txt\n */\n\n/* jshint maxcomplexity:6 */\n\n\"use strict\";\n\n\n/*\n * Note\n * ====\n * the structure of this JavaScript version of poly2tri intentionally follows\n * as closely as possible the structure of the reference C++ version, to make it \n * easier to keep the 2 versions in sync.\n */\n\nvar PointError = require('./pointerror');\nvar Point = require('./point');\nvar Triangle = require('./triangle');\nvar sweep = require('./sweep');\nvar AdvancingFront = require('./advancingfront');\nvar Node = AdvancingFront.Node;\n\n\n// ------------------------------------------------------------------------utils\n\n/**\n * Initial triangle factor, seed triangle will extend 30% of\n * PointSet width to both left and right.\n * @private\n * @const\n */\nvar kAlpha = 0.3;\n\n\n// -------------------------------------------------------------------------Edge\n/**\n * Represents a simple polygon's edge\n * @constructor\n * @struct\n * @private\n * @param {Point} p1\n * @param {Point} p2\n * @throw {PointError} if p1 is same as p2\n */\nvar Edge = function(p1, p2) {\n this.p = p1;\n this.q = p2;\n\n if (p1.y > p2.y) {\n this.q = p1;\n this.p = p2;\n } else if (p1.y === p2.y) {\n if (p1.x > p2.x) {\n this.q = p1;\n this.p = p2;\n } else if (p1.x === p2.x) {\n throw new PointError('poly2tri Invalid Edge constructor: repeated points!', [p1]);\n }\n }\n\n if (!this.q._p2t_edge_list) {\n this.q._p2t_edge_list = [];\n }\n this.q._p2t_edge_list.push(this);\n};\n\n\n// ------------------------------------------------------------------------Basin\n/**\n * @constructor\n * @struct\n * @private\n */\nvar Basin = function() {\n /** @type {Node} */\n this.left_node = null;\n /** @type {Node} */\n this.bottom_node = null;\n /** @type {Node} */\n this.right_node = null;\n /** @type {number} */\n this.width = 0.0;\n /** @type {boolean} */\n this.left_highest = false;\n};\n\nBasin.prototype.clear = function() {\n this.left_node = null;\n this.bottom_node = null;\n this.right_node = null;\n this.width = 0.0;\n this.left_highest = false;\n};\n\n// --------------------------------------------------------------------EdgeEvent\n/**\n * @constructor\n * @struct\n * @private\n */\nvar EdgeEvent = function() {\n /** @type {Edge} */\n this.constrained_edge = null;\n /** @type {boolean} */\n this.right = false;\n};\n\n// ----------------------------------------------------SweepContext (public API)\n/**\n * SweepContext constructor option\n * @typedef {Object} SweepContextOptions\n * @property {boolean=} cloneArrays - if <code>true</code>, do a shallow copy of the Array parameters\n * (contour, holes). Points inside arrays are never copied.\n * Default is <code>false</code> : keep a reference to the array arguments,\n * who will be modified in place.\n */\n/**\n * Constructor for the triangulation context.\n * It accepts a simple polyline (with non repeating points), \n * which defines the constrained edges.\n *\n * @example\n * var contour = [\n * new poly2tri.Point(100, 100),\n * new poly2tri.Point(100, 300),\n * new poly2tri.Point(300, 300),\n * new poly2tri.Point(300, 100)\n * ];\n * var swctx = new poly2tri.SweepContext(contour, {cloneArrays: true});\n * @example\n * var contour = [{x:100, y:100}, {x:100, y:300}, {x:300, y:300}, {x:300, y:100}];\n * var swctx = new poly2tri.SweepContext(contour, {cloneArrays: true});\n * @constructor\n * @public\n * @struct\n * @param {Array.<XY>} contour - array of point objects. The points can be either {@linkcode Point} instances,\n * or any \"Point like\" custom class with <code>{x, y}</code> attributes.\n * @param {SweepContextOptions=} options - constructor options\n */\nvar SweepContext = function(contour, options) {\n options = options || {};\n this.triangles_ = [];\n this.map_ = [];\n this.points_ = (options.cloneArrays ? contour.slice(0) : contour);\n this.edge_list = [];\n\n // Bounding box of all points. Computed at the start of the triangulation, \n // it is stored in case it is needed by the caller.\n this.pmin_ = this.pmax_ = null;\n\n /**\n * Advancing front\n * @private\n * @type {AdvancingFront}\n */\n this.front_ = null;\n\n /**\n * head point used with advancing front\n * @private\n * @type {Point}\n */\n this.head_ = null;\n\n /**\n * tail point used with advancing front\n * @private\n * @type {Point}\n */\n this.tail_ = null;\n\n /**\n * @private\n * @type {Node}\n */\n this.af_head_ = null;\n /**\n * @private\n * @type {Node}\n */\n this.af_middle_ = null;\n /**\n * @private\n * @type {Node}\n */\n this.af_tail_ = null;\n\n this.basin = new Basin();\n this.edge_event = new EdgeEvent();\n\n this.initEdges(this.points_);\n};\n\n\n/**\n * Add a hole to the constraints\n * @example\n * var swctx = new poly2tri.SweepContext(contour);\n * var hole = [\n * new poly2tri.Point(200, 200),\n * new poly2tri.Point(200, 250),\n * new poly2tri.Point(250, 250)\n * ];\n * swctx.addHole(hole);\n * @example\n * var swctx = new poly2tri.SweepContext(contour);\n * swctx.addHole([{x:200, y:200}, {x:200, y:250}, {x:250, y:250}]);\n * @public\n * @param {Array.<XY>} polyline - array of \"Point like\" objects with {x,y}\n */\nSweepContext.prototype.addHole = function(polyline) {\n this.initEdges(polyline);\n var i, len = polyline.length;\n for (i = 0; i < len; i++) {\n this.points_.push(polyline[i]);\n }\n return this; // for chaining\n};\n\n/**\n * For backward compatibility\n * @function\n * @deprecated use {@linkcode SweepContext#addHole} instead\n */\nSweepContext.prototype.AddHole = SweepContext.prototype.addHole;\n\n\n/**\n * Add several holes to the constraints\n * @example\n * var swctx = new poly2tri.SweepContext(contour);\n * var holes = [\n * [ new poly2tri.Point(200, 200), new poly2tri.Point(200, 250), new poly2tri.Point(250, 250) ],\n * [ new poly2tri.Point(300, 300), new poly2tri.Point(300, 350), new poly2tri.Point(350, 350) ]\n * ];\n * swctx.addHoles(holes);\n * @example\n * var swctx = new poly2tri.SweepContext(contour);\n * var holes = [\n * [{x:200, y:200}, {x:200, y:250}, {x:250, y:250}],\n * [{x:300, y:300}, {x:300, y:350}, {x:350, y:350}]\n * ];\n * swctx.addHoles(holes);\n * @public\n * @param {Array.<Array.<XY>>} holes - array of array of \"Point like\" objects with {x,y}\n */\n// Method added in the JavaScript version (was not present in the c++ version)\nSweepContext.prototype.addHoles = function(holes) {\n var i, len = holes.length;\n for (i = 0; i < len; i++) {\n this.initEdges(holes[i]);\n }\n this.points_ = this.points_.concat.apply(this.points_, holes);\n return this; // for chaining\n};\n\n\n/**\n * Add a Steiner point to the constraints\n * @example\n * var swctx = new poly2tri.SweepContext(contour);\n * var point = new poly2tri.Point(150, 150);\n * swctx.addPoint(point);\n * @example\n * var swctx = new poly2tri.SweepContext(contour);\n * swctx.addPoint({x:150, y:150});\n * @public\n * @param {XY} point - any \"Point like\" object with {x,y}\n */\nSweepContext.prototype.addPoint = function(point) {\n this.points_.push(point);\n return this; // for chaining\n};\n\n/**\n * For backward compatibility\n * @function\n * @deprecated use {@linkcode SweepContext#addPoint} instead\n */\nSweepContext.prototype.AddPoint = SweepContext.prototype.addPoint;\n\n\n/**\n * Add several Steiner points to the constraints\n * @example\n * var swctx = new poly2tri.SweepContext(contour);\n * var points = [\n * new poly2tri.Point(150, 150),\n * new poly2tri.Point(200, 250),\n * new poly2tri.Point(250, 250)\n * ];\n * swctx.addPoints(points);\n * @example\n * var swctx = new poly2tri.SweepContext(contour);\n * swctx.addPoints([{x:150, y:150}, {x:200, y:250}, {x:250, y:250}]);\n * @public\n * @param {Array.<XY>} points - array of \"Point like\" object with {x,y}\n */\n// Method added in the JavaScript version (was not present in the c++ version)\nSweepContext.prototype.addPoints = function(points) {\n this.points_ = this.points_.concat(points);\n return this; // for chaining\n};\n\n\n/**\n * Triangulate the polygon with holes and Steiner points.\n * Do this AFTER you've added the polyline, holes, and Steiner points\n * @example\n * var swctx = new poly2tri.SweepContext(contour);\n * swctx.triangulate();\n * var triangles = swctx.getTriangles();\n * @public\n */\n// Shortcut method for sweep.triangulate(SweepContext).\n// Method added in the JavaScript version (was not present in the c++ version)\nSweepContext.prototype.triangulate = function() {\n sweep.triangulate(this);\n return this; // for chaining\n};\n\n\n/**\n * Get the bounding box of the provided constraints (contour, holes and \n * Steinter points). Warning : these values are not available if the triangulation \n * has not been done yet.\n * @public\n * @returns {{min:Point,max:Point}} object with 'min' and 'max' Point\n */\n// Method added in the JavaScript version (was not present in the c++ version)\nSweepContext.prototype.getBoundingBox = function() {\n return {min: this.pmin_, max: this.pmax_};\n};\n\n/**\n * Get result of triangulation.\n * The output triangles have vertices which are references\n * to the initial input points (not copies): any custom fields in the\n * initial points can be retrieved in the output triangles.\n * @example\n * var swctx = new poly2tri.SweepContext(contour);\n * swctx.triangulate();\n * var triangles = swctx.getTriangles();\n * @example\n * var contour = [{x:100, y:100, id:1}, {x:100, y:300, id:2}, {x:300, y:300, id:3}];\n * var swctx = new poly2tri.SweepContext(contour);\n * swctx.triangulate();\n * var triangles = swctx.getTriangles();\n * typeof triangles[0].getPoint(0).id\n * // → \"number\"\n * @public\n * @returns {array<Triangle>} array of triangles\n */\nSweepContext.prototype.getTriangles = function() {\n return this.triangles_;\n};\n\n/**\n * For backward compatibility\n * @function\n * @deprecated use {@linkcode SweepContext#getTriangles} instead\n */\nSweepContext.prototype.GetTriangles = SweepContext.prototype.getTriangles;\n\n\n// ---------------------------------------------------SweepContext (private API)\n\n/** @private */\nSweepContext.prototype.front = function() {\n return this.front_;\n};\n\n/** @private */\nSweepContext.prototype.pointCount = function() {\n return this.points_.length;\n};\n\n/** @private */\nSweepContext.prototype.head = function() {\n return this.head_;\n};\n\n/** @private */\nSweepContext.prototype.setHead = function(p1) {\n this.head_ = p1;\n};\n\n/** @private */\nSweepContext.prototype.tail = function() {\n return this.tail_;\n};\n\n/** @private */\nSweepContext.prototype.setTail = function(p1) {\n this.tail_ = p1;\n};\n\n/** @private */\nSweepContext.prototype.getMap = function() {\n return this.map_;\n};\n\n/** @private */\nSweepContext.prototype.initTriangulation = function() {\n var xmax = this.points_[0].x;\n var xmin = this.points_[0].x;\n var ymax = this.points_[0].y;\n var ymin = this.points_[0].y;\n\n // Calculate bounds\n var i, len = this.points_.length;\n for (i = 1; i < len; i++) {\n var p = this.points_[i];\n /* jshint expr:true */\n (p.x > xmax) && (xmax = p.x);\n (p.x < xmin) && (xmin = p.x);\n (p.y > ymax) && (ymax = p.y);\n (p.y < ymin) && (ymin = p.y);\n }\n this.pmin_ = new Point(xmin, ymin);\n this.pmax_ = new Point(xmax, ymax);\n\n var dx = kAlpha * (xmax - xmin);\n var dy = kAlpha * (ymax - ymin);\n this.head_ = new Point(xmax + dx, ymin - dy);\n this.tail_ = new Point(xmin - dx, ymin - dy);\n\n // Sort points along y-axis\n this.points_.sort(Point.compare);\n};\n\n/** @private */\nSweepContext.prototype.initEdges = function(polyline) {\n var i, len = polyline.length;\n for (i = 0; i < len; ++i) {\n this.edge_list.push(new Edge(polyline[i], polyline[(i + 1) % len]));\n }\n};\n\n/** @private */\nSweepContext.prototype.getPoint = function(index) {\n return this.points_[index];\n};\n\n/** @private */\nSweepContext.prototype.addToMap = function(triangle) {\n this.map_.push(triangle);\n};\n\n/** @private */\nSweepContext.prototype.locateNode = function(point) {\n return this.front_.locateNode(point.x);\n};\n\n/** @private */\nSweepContext.prototype.createAdvancingFront = function() {\n var head;\n var middle;\n var tail;\n // Initial triangle\n var triangle = new Triangle(this.points_[0], this.tail_, this.head_);\n\n this.map_.push(triangle);\n\n head = new Node(triangle.getPoint(1), triangle);\n middle = new Node(triangle.getPoint(0), triangle);\n tail = new Node(triangle.getPoint(2));\n\n this.front_ = new AdvancingFront(head, tail);\n\n head.next = middle;\n middle.next = tail;\n middle.prev = head;\n tail.prev = middle;\n};\n\n/** @private */\nSweepContext.prototype.removeNode = function(node) {\n // do nothing\n /* jshint unused:false */\n};\n\n/** @private */\nSweepContext.prototype.mapTriangleToNodes = function(t) {\n for (var i = 0; i < 3; ++i) {\n if (!t.getNeighbor(i)) {\n var n = this.front_.locatePoint(t.pointCW(t.getPoint(i)));\n if (n) {\n n.triangle = t;\n }\n }\n }\n};\n\n/** @private */\nSweepContext.prototype.removeFromMap = function(triangle) {\n var i, map = this.map_, len = map.length;\n for (i = 0; i < len; i++) {\n if (map[i] === triangle) {\n map.splice(i, 1);\n break;\n }\n }\n};\n\n/**\n * Do a depth first traversal to collect triangles\n * @private\n * @param {Triangle} triangle start\n */\nSweepContext.prototype.meshClean = function(triangle) {\n // New implementation avoids recursive calls and use a loop instead.\n // Cf. issues # 57, 65 and 69.\n var triangles = [triangle], t, i;\n /* jshint boss:true */\n while (t = triangles.pop()) {\n if (!t.isInterior()) {\n t.setInterior(true);\n this.triangles_.push(t);\n for (i = 0; i < 3; i++) {\n if (!t.constrained_edge[i]) {\n triangles.push(t.getNeighbor(i));\n }\n }\n }\n }\n};\n\n// ----------------------------------------------------------------------Exports\n\nmodule.exports = SweepContext;\n","/*\n * Poly2Tri Copyright (c) 2009-2014, Poly2Tri Contributors\n * http://code.google.com/p/poly2tri/\n * \n * poly2tri.js (JavaScript port) (c) 2009-2014, Poly2Tri Contributors\n * https://github.com/r3mi/poly2tri.js\n *\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n * * Neither the name of Poly2Tri nor the names of its contributors may be\n * used to endorse or promote products derived from this software without specific\n * prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n\"use strict\";\n\n/**\n * Public API for poly2tri.js\n * @module poly2tri\n */\n\n\n/**\n * If you are not using a module system (e.g. CommonJS, RequireJS), you can access this library\n * as a global variable <code>poly2tri</code> i.e. <code>window.poly2tri</code> in a browser.\n * @name poly2tri\n * @global\n * @public\n * @type {module:poly2tri}\n */\nvar previousPoly2tri = global.poly2tri;\n/**\n * For Browser + &lt;script&gt; :\n * reverts the {@linkcode poly2tri} global object to its previous value,\n * and returns a reference to the instance called.\n *\n * @example\n * var p = poly2tri.noConflict();\n * @public\n * @return {module:poly2tri} instance called\n */\n// (this feature is not automatically provided by browserify).\nexports.noConflict = function() {\n global.poly2tri = previousPoly2tri;\n return exports;\n};\n\n/**\n * poly2tri library version\n * @public\n * @const {string}\n */\nexports.VERSION = require('../dist/version.json').version;\n\n/**\n * Exports the {@linkcode PointError} class.\n * @public\n * @typedef {PointError} module:poly2tri.PointError\n * @function\n */\nexports.PointError = require('./pointerror');\n/**\n * Exports the {@linkcode Point} class.\n * @public\n * @typedef {Point} module:poly2tri.Point\n * @function\n */\nexports.Point = require('./point');\n/**\n * Exports the {@linkcode Triangle} class.\n * @public\n * @typedef {Triangle} module:poly2tri.Triangle\n * @function\n */\nexports.Triangle = require('./triangle');\n/**\n * Exports the {@linkcode SweepContext} class.\n * @public\n * @typedef {SweepContext} module:poly2tri.SweepContext\n * @function\n */\nexports.SweepContext = require('./sweepcontext');\n\n\n// Backward compatibility\nvar sweep = require('./sweep');\n/**\n * @function\n * @deprecated use {@linkcode SweepContext#triangulate} instead\n */\nexports.triangulate = sweep.triangulate;\n/**\n * @deprecated use {@linkcode SweepContext#triangulate} instead\n * @property {function} Triangulate - use {@linkcode SweepContext#triangulate} instead\n */\nexports.sweep = {Triangulate: sweep.triangulate};\n","import type { Point2D } from '../types.js';\n\n/** Ray-casting point-in-polygon test. */\nexport function pointInPolygon(px: number, py: number, polygon: Point2D[]): boolean {\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const xi = polygon[i]!.x;\n const yi = polygon[i]!.y;\n const xj = polygon[j]!.x;\n const yj = polygon[j]!.y;\n if ((yi > py) !== (yj > py) && px < ((xj - xi) * (py - yi)) / (yj - yi) + xi) {\n inside = !inside;\n }\n }\n return inside;\n}\n\n/** Minimum distance from point (px, py) to segment [a, b]. */\nexport function distToSegment(px: number, py: number, a: Point2D, b: Point2D): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - a.x, py - a.y);\n const t = Math.max(0, Math.min(1, ((px - a.x) * dx + (py - a.y) * dy) / lenSq));\n return Math.hypot(px - (a.x + t * dx), py - (a.y + t * dy));\n}\n","import type { Point2D, Bounds } from '../types.js';\nimport { pointInPolygon, distToSegment } from '../math/geometry.js';\n\n/**\n * Generate interior Steiner points on a regular grid to improve cap\n * triangulation quality. Uses a seeded PRNG to add tiny jitter, keeping\n * output deterministic for the same input polygon.\n */\nexport function generateSteinerPoints(\n polygon: Point2D[],\n density: number,\n bounds: Bounds,\n rand: () => number,\n): Point2D[] {\n const { minX, minY, maxX, maxY } = bounds;\n const maxDim = Math.max(maxX - minX, maxY - minY);\n const spacing = maxDim / (density + 1);\n const margin = spacing * 0.5;\n const steiners: Point2D[] = [];\n\n for (let x = minX + margin; x < maxX - margin * 0.5; x += spacing) {\n for (let y = minY + margin; y < maxY - margin * 0.5; y += spacing) {\n if (!pointInPolygon(x, y, polygon)) continue;\n\n let tooClose = false;\n for (let i = 0; i < polygon.length; i++) {\n const j = (i + 1) % polygon.length;\n if (distToSegment(x, y, polygon[i]!, polygon[j]!) < spacing * 0.15) {\n tooClose = true;\n break;\n }\n }\n\n if (!tooClose) {\n const jx = (rand() - 0.5) * spacing * 0.05;\n const jy = (rand() - 0.5) * spacing * 0.05;\n steiners.push({ x: x + jx, y: y + jy });\n }\n }\n }\n\n return steiners;\n}\n","/**\n * Mulberry32 — fast seeded pseudo-random number generator.\n * Returns a function that produces floats in [0, 1).\n */\nexport function mulberry32(seed: number): () => number {\n let s = seed | 0;\n return function (): number {\n s = (s + 0x6d2b79f5) | 0;\n let t = Math.imul(s ^ (s >>> 15), 1 | s);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n","import * as poly2tri from 'poly2tri';\nimport type { Point2D, Bounds } from '../types.js';\nimport { generateSteinerPoints } from './steiner.js';\nimport { mulberry32 } from '../math/prng.js';\n\n/**\n * Triangulate a CCW boundary polygon into cap triangles using poly2tri.\n * Optionally adds interior Steiner points to improve mesh quality.\n *\n * Falls back to no Steiner points on failure, returns null on total failure.\n */\nexport function triangulateCap(\n boundaryPoints: Point2D[],\n density: number,\n bounds: Bounds,\n): poly2tri.Triangle[] | null {\n // Seed derived from polygon dimensions for deterministic jitter\n const seed = Math.round(\n Math.abs(bounds.maxX - bounds.minX) * 1000 + Math.abs(bounds.maxY - bounds.minY) * 1000,\n );\n const rand = mulberry32(seed);\n\n const attempt = (withSteiners: boolean): poly2tri.Triangle[] | null => {\n try {\n // Fresh Point objects per attempt so poly2tri state is clean\n const contour = boundaryPoints.map((p) => new poly2tri.Point(p.x, p.y));\n const swctx = new poly2tri.SweepContext(contour);\n\n if (withSteiners && density > 1) {\n const steiners = generateSteinerPoints(boundaryPoints, density, bounds, rand);\n for (const s of steiners) {\n swctx.addPoint(new poly2tri.Point(s.x, s.y));\n }\n }\n\n swctx.triangulate();\n const tris = swctx.getTriangles();\n // Drop reference so SweepContext can be GC'd\n return tris;\n } catch {\n return null;\n }\n };\n\n let tris = attempt(true);\n if (tris === null) {\n console.warn('poly2tri: triangulation failed, retrying without Steiner points');\n tris = attempt(false);\n if (tris === null) {\n console.error('poly2tri: triangulation failed completely');\n }\n }\n return tris;\n}\n","import type * as poly2tri from 'poly2tri';\n\n/**\n * Write one cap face (front or back) directly into pre-allocated typed arrays.\n *\n * Uses object-identity Map keyed on poly2tri.Point references to avoid string\n * allocations. The same Point objects are shared across adjacent triangles, so\n * identity-based deduplication is exact and allocation-free.\n *\n * @returns Number of unique vertices written (always equals cap unique-point count).\n */\nexport function writeCap(\n positions: Float32Array,\n normals: Float32Array,\n indices: Uint16Array | Uint32Array,\n vertOffset: number,\n idxOffset: number,\n capTriangles: poly2tri.Triangle[],\n z: number,\n normalZ: number,\n reverseWinding: boolean,\n): number {\n const vertMap = new Map<poly2tri.Point, number>();\n let localVert = 0;\n let ii = idxOffset;\n\n for (const tri of capTriangles) {\n const pts = tri.getPoints();\n const vi0 = getOrAdd(pts[0], z, normalZ, positions, normals, vertOffset, vertMap, () => localVert++);\n const vi1 = getOrAdd(pts[1], z, normalZ, positions, normals, vertOffset, vertMap, () => localVert++);\n const vi2 = getOrAdd(pts[2], z, normalZ, positions, normals, vertOffset, vertMap, () => localVert++);\n\n if (reverseWinding) {\n indices[ii++] = vi0;\n indices[ii++] = vi2;\n indices[ii++] = vi1;\n } else {\n indices[ii++] = vi0;\n indices[ii++] = vi1;\n indices[ii++] = vi2;\n }\n }\n\n return localVert;\n}\n\nfunction getOrAdd(\n pt: poly2tri.Point,\n z: number,\n normalZ: number,\n positions: Float32Array,\n normals: Float32Array,\n vertOffset: number,\n map: Map<poly2tri.Point, number>,\n nextIdx: () => number,\n): number {\n let idx = map.get(pt);\n if (idx !== undefined) return idx;\n\n idx = vertOffset + nextIdx();\n const base = idx * 3;\n positions[base] = pt.x;\n positions[base + 1] = pt.y;\n positions[base + 2] = z;\n normals[base] = 0;\n normals[base + 1] = 0;\n normals[base + 2] = normalZ;\n map.set(pt, idx);\n return idx;\n}\n","import type { Point2D } from '../types.js';\n\n/**\n * Write side-wall quads directly into pre-allocated typed arrays.\n * Each boundary edge gets one quad per depth segment with flat per-face normals.\n */\nexport function writeSides(\n positions: Float32Array,\n normals: Float32Array,\n indices: Uint16Array | Uint32Array,\n vertOffset: number,\n idxOffset: number,\n boundaryPoints: Point2D[],\n frontZ: number,\n backZ: number,\n depthSegs: number,\n): void {\n const n = boundaryPoints.length;\n let vi = vertOffset;\n let ii = idxOffset;\n\n for (let i = 0; i < n; i++) {\n const a = boundaryPoints[i]!;\n const b = boundaryPoints[(i + 1) % n]!;\n\n const edgeDx = b.x - a.x;\n const edgeDy = b.y - a.y;\n const edgeLen = Math.hypot(edgeDx, edgeDy);\n const nx = edgeLen > 0 ? edgeDy / edgeLen : 0;\n const ny = edgeLen > 0 ? -edgeDx / edgeLen : 0;\n\n for (let j = 0; j < depthSegs; j++) {\n const z0 = frontZ + (backZ - frontZ) * (j / depthSegs);\n const z1 = frontZ + (backZ - frontZ) * ((j + 1) / depthSegs);\n\n // Quad vertices: (a,z0) (b,z0) (b,z1) (a,z1)\n const v0 = vi++;\n positions[v0 * 3] = a.x;\n positions[v0 * 3 + 1] = a.y;\n positions[v0 * 3 + 2] = z0;\n normals[v0 * 3] = nx;\n normals[v0 * 3 + 1] = ny;\n normals[v0 * 3 + 2] = 0;\n\n const v1 = vi++;\n positions[v1 * 3] = b.x;\n positions[v1 * 3 + 1] = b.y;\n positions[v1 * 3 + 2] = z0;\n normals[v1 * 3] = nx;\n normals[v1 * 3 + 1] = ny;\n normals[v1 * 3 + 2] = 0;\n\n const v2 = vi++;\n positions[v2 * 3] = b.x;\n positions[v2 * 3 + 1] = b.y;\n positions[v2 * 3 + 2] = z1;\n normals[v2 * 3] = nx;\n normals[v2 * 3 + 1] = ny;\n normals[v2 * 3 + 2] = 0;\n\n const v3 = vi++;\n positions[v3 * 3] = a.x;\n positions[v3 * 3 + 1] = a.y;\n positions[v3 * 3 + 2] = z1;\n normals[v3 * 3] = nx;\n normals[v3 * 3 + 1] = ny;\n normals[v3 * 3 + 2] = 0;\n\n indices[ii++] = v0;\n indices[ii++] = v1;\n indices[ii++] = v2;\n indices[ii++] = v0;\n indices[ii++] = v2;\n indices[ii++] = v3;\n }\n }\n}\n","import * as THREE from 'three';\nimport type * as poly2tri from 'poly2tri';\nimport type { Point2D, Bounds } from '../types.js';\nimport { writeCap } from './caps.js';\nimport { writeSides } from './sides.js';\n\n/** Compute axis-aligned bounding box for a set of points. */\nexport function computeBounds(points: Point2D[]): Bounds {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const p of points) {\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n return { minX, minY, maxX, maxY };\n}\n\n/**\n * Assemble a THREE.BufferGeometry from pre-computed tessellation data.\n *\n * Sizes all typed arrays upfront using exact counts:\n * - Unique cap verts counted via object-identity Set before first write\n * - Side verts: nBoundary × depthSegs × 4 (4 verts per quad)\n * - Uses Uint16Array for indices when totalVerts ≤ 65535, Uint32Array otherwise\n */\nexport function buildGeometry(\n subdividedPts: Point2D[],\n capTriangles: poly2tri.Triangle[],\n depth: number,\n depthSegs: number,\n): THREE.BufferGeometry {\n const nCapTris = capTriangles.length;\n const nBoundary = subdividedPts.length;\n\n // Count unique cap vertices using object-identity (no string allocations)\n const uniqueCapPoints = new Set<poly2tri.Point>();\n for (const tri of capTriangles) {\n const pts = tri.getPoints();\n uniqueCapPoints.add(pts[0]);\n uniqueCapPoints.add(pts[1]);\n uniqueCapPoints.add(pts[2]);\n }\n const nUniqueCapVerts = uniqueCapPoints.size;\n uniqueCapPoints.clear(); // release for GC\n\n const nSideVerts = nBoundary * depthSegs * 4;\n const totalVerts = nUniqueCapVerts * 2 + nSideVerts;\n const totalIndices = nCapTris * 6 + nBoundary * depthSegs * 6;\n\n const positions = new Float32Array(totalVerts * 3);\n const normals = new Float32Array(totalVerts * 3);\n const indices =\n totalVerts <= 65535\n ? new Uint16Array(totalIndices)\n : new Uint32Array(totalIndices);\n\n const frontZ = -depth / 2;\n const backZ = depth / 2;\n\n // Front cap — reversed winding so normal faces −Z\n const frontVertsWritten = writeCap(\n positions,\n normals,\n indices,\n 0,\n 0,\n capTriangles,\n frontZ,\n -1,\n true,\n );\n\n // Back cap — normal winding, normal faces +Z\n writeCap(\n positions,\n normals,\n indices,\n frontVertsWritten,\n nCapTris * 3,\n capTriangles,\n backZ,\n 1,\n false,\n );\n\n // Side walls\n writeSides(\n positions,\n normals,\n indices,\n nUniqueCapVerts * 2,\n nCapTris * 6,\n subdividedPts,\n frontZ,\n backZ,\n depthSegs,\n );\n\n const geo = new THREE.BufferGeometry();\n geo.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n geo.setAttribute('normal', new THREE.BufferAttribute(normals, 3));\n geo.setIndex(new THREE.BufferAttribute(indices, 1));\n\n return geo;\n}\n","import * as THREE from 'three';\nimport type { ExtrudeInput, ExtrudeOptions, Point2D } from './types.js';\nimport { validatePoints } from './input/fromPoints.js';\nimport { fromSVG } from './input/fromSVG.js';\nimport { deduplicatePoints, ensureCCW, centerPoints } from './polygon/prepare.js';\nimport { subdivideBoundary } from './polygon/subdivide.js';\nimport { triangulateCap } from './tessellation/triangulate.js';\nimport { computeBounds, buildGeometry } from './geometry/buildGeometry.js';\n\nconst DEFAULTS: ExtrudeOptions = {\n depth: 20,\n depthSegments: 4,\n capDensity: 5,\n edgeSubdivisions: 2,\n};\n\n/**\n * Build a THREE.BufferGeometry from a prepared point array.\n * Returns null for degenerate input or triangulation failure.\n */\nfunction buildExtrudedGeometry(\n rawPoints: Point2D[],\n opts: ExtrudeOptions,\n): THREE.BufferGeometry | null {\n const { depth, depthSegments, capDensity, edgeSubdivisions } = opts;\n\n let pts = deduplicatePoints(rawPoints, 0.5);\n if (pts.length < 3) return null;\n\n pts = ensureCCW(pts);\n pts = centerPoints(pts);\n\n const subdividedPts = subdivideBoundary(pts, edgeSubdivisions);\n const bounds = computeBounds(subdividedPts);\n\n const capTriangles = triangulateCap(subdividedPts, capDensity, bounds);\n if (!capTriangles || capTriangles.length === 0) return null;\n\n return buildGeometry(subdividedPts, capTriangles, depth, depthSegments);\n}\n\n/**\n * Extrude a 2D shape into a THREE.BufferGeometry.\n *\n * Accepts raw polygon points or a base64-encoded SVG.\n * Returns `null` (never throws) on degenerate input or triangulation failure.\n */\nexport function extrude(\n input: ExtrudeInput,\n options?: Partial<ExtrudeOptions>,\n): THREE.BufferGeometry | null {\n const opts: ExtrudeOptions = { ...DEFAULTS, ...options };\n\n if (input.type === 'points') {\n const pts = validatePoints(input.points);\n if (!pts) return null;\n return buildExtrudedGeometry(pts, opts);\n }\n\n // SVG path — requires browser environment\n let contours: Point2D[][];\n try {\n contours = fromSVG(input.data);\n } catch (e) {\n console.error('tess-extrude: SVG parsing failed', e);\n return null;\n }\n\n if (contours.length === 0) return null;\n\n const geometries: THREE.BufferGeometry[] = [];\n for (const contour of contours) {\n const geo = buildExtrudedGeometry(contour, opts);\n if (geo) geometries.push(geo);\n }\n\n if (geometries.length === 0) return null;\n if (geometries.length === 1) return geometries[0]!;\n\n // Merge multiple SVG paths into one geometry\n return mergeGeometries(geometries);\n}\n\n/** Minimal geometry merge — concatenates position/normal/index buffers. */\nfunction mergeGeometries(geos: THREE.BufferGeometry[]): THREE.BufferGeometry {\n let totalVerts = 0;\n let totalIndices = 0;\n\n for (const g of geos) {\n const pos = g.getAttribute('position') as THREE.BufferAttribute;\n totalVerts += pos.count;\n const idx = g.index;\n if (idx) totalIndices += idx.count;\n }\n\n const positions = new Float32Array(totalVerts * 3);\n const normals = new Float32Array(totalVerts * 3);\n const indices =\n totalVerts <= 65535 ? new Uint16Array(totalIndices) : new Uint32Array(totalIndices);\n\n let vOff = 0;\n let iOff = 0;\n\n for (const g of geos) {\n const pos = (g.getAttribute('position') as THREE.BufferAttribute).array as Float32Array;\n const nor = (g.getAttribute('normal') as THREE.BufferAttribute).array as Float32Array;\n const idx = g.index;\n\n positions.set(pos, vOff * 3);\n normals.set(nor, vOff * 3);\n\n if (idx) {\n const idxArr = idx.array;\n for (let i = 0; i < idxArr.length; i++) {\n indices[iOff + i] = (idxArr[i] as number) + vOff;\n }\n iOff += idxArr.length;\n }\n\n vOff += pos.length / 3;\n g.dispose();\n }\n\n const merged = new THREE.BufferGeometry();\n merged.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n merged.setAttribute('normal', new THREE.BufferAttribute(normals, 3));\n merged.setIndex(new THREE.BufferAttribute(indices, 1));\n return merged;\n}\n","import type { Point2D } from '../types.js';\n\nfunction perpendicularDist(p: Point2D, a: Point2D, b: Point2D): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(p.x - a.x, p.y - a.y);\n const t = Math.max(0, Math.min(1, ((p.x - a.x) * dx + (p.y - a.y) * dy) / lenSq));\n return Math.hypot(p.x - (a.x + t * dx), p.y - (a.y + t * dy));\n}\n\n/**\n * Iterative Douglas-Peucker simplification.\n * Avoids recursion and array slicing for better performance on large inputs.\n */\nexport function simplifyPath(points: Point2D[], tolerance: number): Point2D[] {\n if (points.length <= 2) return points.slice();\n\n const keep = new Uint8Array(points.length);\n keep[0] = 1;\n keep[points.length - 1] = 1;\n\n const stack: Array<[number, number]> = [[0, points.length - 1]];\n\n while (stack.length > 0) {\n const range = stack.pop()!;\n const start = range[0];\n const end = range[1];\n\n if (end - start <= 1) continue;\n\n const first = points[start]!;\n const last = points[end]!;\n let maxDist = 0;\n let maxIdx = start;\n\n for (let i = start + 1; i < end; i++) {\n const d = perpendicularDist(points[i]!, first, last);\n if (d > maxDist) {\n maxDist = d;\n maxIdx = i;\n }\n }\n\n if (maxDist > tolerance) {\n keep[maxIdx] = 1;\n stack.push([start, maxIdx]);\n stack.push([maxIdx, end]);\n }\n }\n\n const result: Point2D[] = [];\n for (let i = 0; i < points.length; i++) {\n if (keep[i]) result.push(points[i]!);\n }\n return result;\n}\n"],"names":["xy","require$$0","PointError","Point","Triangle","point","assert","Node","AdvancingFront","advancingfrontModule","EPSILON","utils","Orientation","orient2d","inScanArea","isAngleObtuse","require$$1","require$$2","require$$3","require$$4","triangle","sweep","global","exports","require$$5","poly2tri.Point","poly2tri.SweepContext","tris"],"mappings":"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","x_google_ignoreList":[4,5,6,7,8,9,10,11,12,13]}