plotboilerplate 1.23.2 → 1.23.3

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.
Files changed (101) hide show
  1. package/dist/index.esm.js +7052 -6754
  2. package/dist/index.esm.js.map +1 -1
  3. package/dist/index.esm.min.js +1 -1
  4. package/dist/index.esm.min.js.map +1 -1
  5. package/dist/plotboilerplate.browser.min.js +1 -1
  6. package/dist/plotboilerplate.browser.min.js.map +1 -1
  7. package/dist/plotboilerplate.js +329 -27
  8. package/dist/plotboilerplate.min.js +1 -1
  9. package/package.json +4 -2
  10. package/src/cjs/PlotBoilerplate.d.ts +4 -2
  11. package/src/cjs/PlotBoilerplate.js +7 -3
  12. package/src/cjs/PlotBoilerplate.js.map +1 -1
  13. package/src/cjs/Polygon.d.ts +107 -4
  14. package/src/cjs/Polygon.js +215 -9
  15. package/src/cjs/Polygon.js.map +1 -1
  16. package/src/cjs/Triangle.d.ts +23 -3
  17. package/src/cjs/Triangle.js +15 -2
  18. package/src/cjs/Triangle.js.map +1 -1
  19. package/src/cjs/VertTuple.d.ts +12 -7
  20. package/src/cjs/VertTuple.js +14 -9
  21. package/src/cjs/VertTuple.js.map +1 -1
  22. package/src/cjs/Vertex.d.ts +2 -1
  23. package/src/cjs/Vertex.js +5 -2
  24. package/src/cjs/Vertex.js.map +1 -1
  25. package/src/cjs/draw.d.ts +1 -0
  26. package/src/cjs/draw.js +2 -1
  27. package/src/cjs/draw.js.map +1 -1
  28. package/src/cjs/drawutilssvg.js +24 -0
  29. package/src/cjs/drawutilssvg.js.map +1 -1
  30. package/src/cjs/geomutils.d.ts +32 -1
  31. package/src/cjs/geomutils.js +47 -1
  32. package/src/cjs/geomutils.js.map +1 -1
  33. package/src/cjs/utils/algorithms/PolygonInset.d.ts +184 -0
  34. package/src/cjs/utils/algorithms/PolygonInset.js +431 -0
  35. package/src/cjs/utils/algorithms/PolygonInset.js.map +1 -0
  36. package/src/cjs/utils/algorithms/clearDuplicateVertices.d.ts +5 -4
  37. package/src/cjs/utils/algorithms/clearDuplicateVertices.js +6 -3
  38. package/src/cjs/utils/algorithms/clearDuplicateVertices.js.map +1 -1
  39. package/src/cjs/utils/algorithms/findPolygonSelfIntersections.d.ts +2 -1
  40. package/src/cjs/utils/algorithms/findPolygonSelfIntersections.js +3 -3
  41. package/src/cjs/utils/algorithms/findPolygonSelfIntersections.js.map +1 -1
  42. package/src/cjs/utils/algorithms/splitPolygonToNonIntersecting.d.ts +3 -2
  43. package/src/cjs/utils/algorithms/splitPolygonToNonIntersecting.js +11 -9
  44. package/src/cjs/utils/algorithms/splitPolygonToNonIntersecting.js.map +1 -1
  45. package/src/cjs/utils/detectDarkMode.js.map +1 -1
  46. package/src/cjs/utils/dom/guiSizeToggler.d.ts +2 -1
  47. package/src/cjs/utils/dom/guiSizeToggler.js +5 -3
  48. package/src/cjs/utils/dom/guiSizeToggler.js.map +1 -1
  49. package/src/esm/PlotBoilerplate.d.ts +4 -2
  50. package/src/esm/PlotBoilerplate.js +7 -3
  51. package/src/esm/PlotBoilerplate.js.map +1 -1
  52. package/src/esm/Polygon.d.ts +107 -4
  53. package/src/esm/Polygon.js +214 -9
  54. package/src/esm/Polygon.js.map +1 -1
  55. package/src/esm/Triangle.d.ts +23 -3
  56. package/src/esm/Triangle.js +15 -2
  57. package/src/esm/Triangle.js.map +1 -1
  58. package/src/esm/VertTuple.d.ts +12 -7
  59. package/src/esm/VertTuple.js +14 -9
  60. package/src/esm/VertTuple.js.map +1 -1
  61. package/src/esm/Vertex.d.ts +2 -1
  62. package/src/esm/Vertex.js +5 -2
  63. package/src/esm/Vertex.js.map +1 -1
  64. package/src/esm/draw.d.ts +1 -0
  65. package/src/esm/draw.js +2 -1
  66. package/src/esm/draw.js.map +1 -1
  67. package/src/esm/drawutilssvg.js +24 -0
  68. package/src/esm/drawutilssvg.js.map +1 -1
  69. package/src/esm/geomutils.d.ts +32 -1
  70. package/src/esm/geomutils.js +47 -1
  71. package/src/esm/geomutils.js.map +1 -1
  72. package/src/esm/utils/algorithms/PolygonInset.d.ts +184 -0
  73. package/src/esm/utils/algorithms/PolygonInset.js +424 -0
  74. package/src/esm/utils/algorithms/PolygonInset.js.map +1 -0
  75. package/src/esm/utils/algorithms/clearDuplicateVertices.d.ts +5 -4
  76. package/src/esm/utils/algorithms/clearDuplicateVertices.js +6 -3
  77. package/src/esm/utils/algorithms/clearDuplicateVertices.js.map +1 -1
  78. package/src/esm/utils/algorithms/findPolygonSelfIntersections.d.ts +2 -1
  79. package/src/esm/utils/algorithms/findPolygonSelfIntersections.js +3 -3
  80. package/src/esm/utils/algorithms/findPolygonSelfIntersections.js.map +1 -1
  81. package/src/esm/utils/algorithms/splitPolygonToNonIntersecting.d.ts +3 -2
  82. package/src/esm/utils/algorithms/splitPolygonToNonIntersecting.js +11 -9
  83. package/src/esm/utils/algorithms/splitPolygonToNonIntersecting.js.map +1 -1
  84. package/src/esm/utils/detectDarkMode.js.map +1 -1
  85. package/src/esm/utils/dom/guiSizeToggler.d.ts +2 -1
  86. package/src/esm/utils/dom/guiSizeToggler.js +4 -2
  87. package/src/esm/utils/dom/guiSizeToggler.js.map +1 -1
  88. package/src/ts/PlotBoilerplate.ts +7 -3
  89. package/src/ts/Polygon.ts +230 -9
  90. package/src/ts/Triangle.ts +18 -4
  91. package/src/ts/VertTuple.ts +15 -10
  92. package/src/ts/Vertex.ts +5 -2
  93. package/src/ts/draw.ts +2 -1
  94. package/src/ts/drawutilssvg.ts +29 -0
  95. package/src/ts/geomutils.ts +49 -1
  96. package/src/ts/utils/algorithms/PolygonInset.ts +529 -0
  97. package/src/ts/utils/algorithms/clearDuplicateVertices.ts +11 -8
  98. package/src/ts/utils/algorithms/findPolygonSelfIntersections.ts +25 -26
  99. package/src/ts/utils/algorithms/splitPolygonToNonIntersecting.ts +92 -99
  100. package/src/ts/utils/detectDarkMode.ts +1 -3
  101. package/src/ts/utils/dom/guiSizeToggler.ts +4 -2
@@ -0,0 +1,431 @@
1
+ "use strict";
2
+ /**
3
+ * Calculate the inset of any non-self-overlapping polygon.
4
+ *
5
+ * The polygon may be
6
+ * - convex or non-convex
7
+ * - self-intersecting
8
+ *
9
+ * The algorithms will
10
+ * - first construct a general offset polygon which may be corrupt due to ouf-of-bounds or in illegal-area problems.
11
+ * - then dissect the possibly self-intersecting inset polygon into separate simple polygons.
12
+ * - then detect for each if it's out of bounds or in some illegal area.
13
+ * - keeping only the valid ones.
14
+ *
15
+ * @required sutherlandHodgman
16
+ * @required splitPolygonToNonIntersecting
17
+ *
18
+ * @author Ikaros Kappler
19
+ * @date 2024-11-04 Ported the script to a class.
20
+ * @modified 2024-12-02 Ported to Typescript.
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.PolygonInset = void 0;
24
+ var Line_1 = require("../../Line");
25
+ var Polygon_1 = require("../../Polygon");
26
+ var Vector_1 = require("../../Vector");
27
+ var splitPolygonToNonIntersecting_1 = require("./splitPolygonToNonIntersecting");
28
+ var sutherlandHodgman_1 = require("./sutherlandHodgman");
29
+ var PolygonInset = /** @class */ (function () {
30
+ /**
31
+ * Constructs a new PolygonInset instance with the underlying given polygon to work with.
32
+ *
33
+ * Please note that the algorithm will reverse the vertex order if the given polygon
34
+ * is not clockwise.
35
+ *
36
+ * @param {Polygon} polygon - The polygon to calculate the offset for.
37
+ */
38
+ function PolygonInset(polygon) {
39
+ /**
40
+ * The original polygon as a sequence of line objects. This is easier to use than a list of points.
41
+ */
42
+ this.originalPolygonLines = [];
43
+ /**
44
+ * The simple inset lines, directly generated by offsetting the original polygon lines by the given amount.
45
+ */
46
+ this.insetLines = [];
47
+ /**
48
+ * The cropped inset lines that makes up the first direct iteration of the inset polygon.
49
+ * This one will probably be self-intersecting.
50
+ */
51
+ this.insetPolygonLines = [];
52
+ /**
53
+ * The inset polygon split up into simple non-self-intersecting polygons.
54
+ * Represented as a list of vertex-lists. Each sub-list represents a single polygon.
55
+ */
56
+ this.splitPolygons = [];
57
+ this.polygon = polygon;
58
+ }
59
+ /**
60
+ * This is the main method.
61
+ *
62
+ * Call this with the required option params to compute your desired offset polygon(s).
63
+ *
64
+ * @param {number} options.innerPolygonOffset - The offset to use. Should be a positive number. Correct result for negative numbers are not guaranteed.
65
+ * @param {number?} options.maxPolygonSplitDepth - (default is the number of polygon.vertices) The maximum amount of recursive stepts to simplify the complex first iteration of the offset polygon.
66
+ * @param {number?} options.intersectionEpsilon - (default is 1.0) The epsilon to use for detecting overlapping polygons. This indicates a tolerance value, because directly adjecent polygons may have a little arithmetic intersection area.
67
+ * @returns {Array<Array<Vertex>>} A list of vertex-lists, each one representing a simple polygon from the offset-polygons.
68
+ */
69
+ PolygonInset.prototype.computeOutputPolygons = function (options) {
70
+ var _a;
71
+ // No offset implies: no change.
72
+ if (options.innerPolygonOffset === 0) {
73
+ return [this.polygon.vertices]; // No change
74
+ }
75
+ // This algorithm only works with polygon in clockwise vertex order.
76
+ // If the polygon is not clockwise: revert.
77
+ PolygonInset._assertPolygonIsClockwise(this.polygon.vertices);
78
+ // The potential result polygons might overlap with other parts. These are not part of the desired
79
+ // result set and need to be filtered out.
80
+ // Define an intersection-epsilon: minimal critical overlaps might result of rounding errors and
81
+ // don't represent real overlaps.
82
+ var intersectionEpsilon = options.intersectionEpsilon;
83
+ // This will create a deep clone
84
+ this.optimizedPolygon = this.polygon.clone();
85
+ // In case the potential result polygons are self intersecting we need to split them apart later.
86
+ // Using the initial vertex number as the upper split limit should be safe here.
87
+ var maxPolygonSplitDepth = (_a = options === null || options === void 0 ? void 0 : options.maxPolygonSplitDepth) !== null && _a !== void 0 ? _a : this.optimizedPolygon.vertices.length;
88
+ // For calculations of initial inset rectagles we need the original polygon's lines.
89
+ this.originalPolygonLines = this.optimizedPolygon.getEdges();
90
+ this._collectInsetLines(this.originalPolygonLines, options.innerPolygonOffset);
91
+ this._collectInsetPolygonLines(this.insetLines);
92
+ this.insetRectanglePolygons = this._collectRectangularPolygonInsets(this.originalPolygonLines, this.insetLines);
93
+ // Optimize inset polygon AND the insetRectanglePolygons?
94
+ if (options.removeEars) {
95
+ // console.log("Remove ears");
96
+ // This will modify both params!
97
+ PolygonInset._optimizeInsetPolygon(this.optimizedPolygon, this.insetRectanglePolygons);
98
+ }
99
+ // Create a naive first inset polygon for later optimization.
100
+ this.insetPolygon = PolygonInset.convertToBasicInsetPolygon(this.insetPolygonLines);
101
+ // // Optimize inset polygon AND the insetRectanglePolygons!
102
+ // if (options.removeEars) {
103
+ // // This will modify both params!
104
+ // PolygonInset._optimizeInsetPolygon(this.insetPolygon, this.insetRectanglePolygons);
105
+ // }
106
+ // The resulting polygon will likely intersect itself multiple times.
107
+ // For further calculations split apart into non-self-intersecting.
108
+ this.splitPolygons = (0, splitPolygonToNonIntersecting_1.splitPolygonToNonIntersecting)(this.insetPolygon.vertices, maxPolygonSplitDepth, true); // insideBoundsOnly
109
+ // This method was initially meant to calculate inset-polygons only.
110
+ // But with a simple filter we COULD also create outer offset-polygons.
111
+ // Maybe this is a task for the future
112
+ // console.log("DEBUG", DEBUG);
113
+ // DEBUG("TEST");
114
+ if (options.innerPolygonOffset < 0) {
115
+ // return [this.polygon.vertices]; // No change
116
+ }
117
+ // console.log("splitPolygons.length", this.splitPolygons.length);
118
+ // Assert all polygons are clockwise!
119
+ PolygonInset._assertAllPolygonsAreClockwise(this.splitPolygons);
120
+ this.filteredSplitPolygons = PolygonInset._filterInnerSplitPolygonsByCoverage(this.splitPolygons, this.insetRectanglePolygons, intersectionEpsilon);
121
+ // console.log("[0] filteredSplitPolygons.length", this.filteredSplitPolygons.length);
122
+ this.filteredSplitPolygons = PolygonInset._filterInnerSplitPolygonsByOriginalBounds(this.filteredSplitPolygons, this.polygon);
123
+ // console.log("[1] filteredSplitPolygons.length", this.filteredSplitPolygons.length);
124
+ return this.filteredSplitPolygons;
125
+ };
126
+ /**
127
+ * This method transforms each polygon line into a new line
128
+ * by moving it to the inside direction of the polygon (by the given `insetAmount`).
129
+ *
130
+ * @param {Array<Line>} polygonLines
131
+ * @param {number} insetAmount
132
+ * @return {Array<Line>} The transformed lines. The result array has the same length and order as the input array.
133
+ */
134
+ PolygonInset.prototype._collectInsetLines = function (polygonLines, insetAmount) {
135
+ var insetLines = []; // Array<Line>
136
+ for (var i = 0; i < polygonLines.length; i++) {
137
+ var line = polygonLines[i];
138
+ var perp = new Vector_1.Vector(line.a, line.b).perp();
139
+ var t = insetAmount / perp.length();
140
+ var offsetOnPerp = perp.vertAt(t);
141
+ var diff = line.a.difference(offsetOnPerp);
142
+ // Polygon is is clockwise order.
143
+ // Move line inside polygon
144
+ var movedLine = line.clone();
145
+ movedLine.a.add(diff);
146
+ movedLine.b.add(diff);
147
+ insetLines.push(movedLine);
148
+ }
149
+ this.insetLines = insetLines;
150
+ return insetLines;
151
+ };
152
+ /**
153
+ * For a sequence of inset polygon lines get the inset polygon by detecting
154
+ * useful intersections (by cropping or extending them).
155
+ *
156
+ * The returned lines resemble a new polygon.
157
+ *
158
+ * Please note that the returned polygon can be self-intersecting!
159
+ *
160
+ * @param {Array<Line>} insetLines
161
+ * @returns {Array<Line>} The cropped or exented inset polygon lines.
162
+ */
163
+ PolygonInset.prototype._collectInsetPolygonLines = function (insetLines) {
164
+ if (insetLines.length <= 1) {
165
+ return [];
166
+ }
167
+ var insetPolygonLines = [];
168
+ // Collect first intersection at beginning :)
169
+ var lastInsetLine = insetLines[insetLines.length - 1];
170
+ var firstInsetLine = insetLines[0];
171
+ var lastIntersectionPoint = lastInsetLine.intersection(firstInsetLine); // Must not be null
172
+ for (var i = 0; i < insetLines.length; i++) {
173
+ var insetLine = insetLines[i];
174
+ var nextInsetLine = insetLines[(i + 1) % insetLines.length];
175
+ // Find desired intersection
176
+ var intersection = insetLine.intersection(nextInsetLine);
177
+ if (intersection == null) {
178
+ console.warn("[collectInsetPolygon] WARN intersection line must not be null", i, nextInsetLine);
179
+ }
180
+ else {
181
+ // By construction they MUST have any non-null intersection!
182
+ if (lastIntersectionPoint != null) {
183
+ var resultLine = new Line_1.Line(lastIntersectionPoint, intersection);
184
+ insetPolygonLines.push(resultLine);
185
+ }
186
+ }
187
+ lastIntersectionPoint = intersection;
188
+ }
189
+ // Store intermediate result for later retrieval.
190
+ this.insetPolygonLines = insetPolygonLines;
191
+ return insetPolygonLines;
192
+ };
193
+ /**
194
+ * Converts two lists (same length) of original polygon lines and inset lines (interpreted as
195
+ * pairs) to a list of rectangular polyons.
196
+ *
197
+ * @static
198
+ * @param {Array<Line>} originalPolygonLines
199
+ * @param {Array<Line>} insetLines
200
+ * @returns {Array<Polygon>} A list of rectangular polygons; each returned polyon has exactly four vertices.
201
+ */
202
+ PolygonInset.prototype._collectRectangularPolygonInsets = function (originalPolygonLines, insetLines) {
203
+ // Convert to rectangle polygon
204
+ var insetRectanglePolygons = originalPolygonLines.map(function (polygonLine, index) {
205
+ var rectPolygon = new Polygon_1.Polygon([], false);
206
+ // Add in original order
207
+ rectPolygon.vertices.push(polygonLine.a.clone());
208
+ rectPolygon.vertices.push(polygonLine.b.clone());
209
+ // Add in reverse order
210
+ var insetLine = insetLines[index];
211
+ rectPolygon.vertices.push(insetLine.b.clone());
212
+ rectPolygon.vertices.push(insetLine.a.clone());
213
+ return rectPolygon;
214
+ });
215
+ return insetRectanglePolygons;
216
+ };
217
+ /**
218
+ * Converts a sequence of (hopefully adjacent) lines to a polygon by using all second line vertices `b`.
219
+ *
220
+ * @static
221
+ * @param insetPolygonLines
222
+ * @returns
223
+ */
224
+ PolygonInset.convertToBasicInsetPolygon = function (insetPolygonLines) {
225
+ var insetPolygon = new Polygon_1.Polygon([], false);
226
+ insetPolygonLines.forEach(function (insetLine) {
227
+ insetPolygon.vertices.push(insetLine.a);
228
+ });
229
+ return insetPolygon;
230
+ };
231
+ /**
232
+ * Filter split polygons: only keep those whose vertices are all contained inside the original polygon.
233
+ * Reason: scaling too much will result in excessive translation beyond the opposite bounds of the polygon (like more than 200% of possible insetting).
234
+ *
235
+ * @param {Array<Array<Vertex>>} splitPolygonsVertices
236
+ * @param {Polygon} originalPolygon
237
+ * @return {Array<Array<Vertex>>} The filtered polygon list.
238
+ */
239
+ PolygonInset._filterInnerSplitPolygonsByOriginalBounds = function (splitPolygonsVertices, originalPolygon) {
240
+ return splitPolygonsVertices.filter(function (splitPolyVerts, _splitPolyIndex) {
241
+ return splitPolyVerts.every(function (splitPVert) {
242
+ return originalPolygon.containsVert(splitPVert);
243
+ });
244
+ });
245
+ };
246
+ /**
247
+ * Filter split polygons: only keep those that do not (signifiantly) interset with any rectangles.
248
+ *
249
+ * @static
250
+ * @param {Array<Array<Vertex>>} splitPolygonsVertices
251
+ * @param {Array<Polygon>} insetRectanglePolygons
252
+ * @param {number?=1.0} intersectionEpsilon - (optional, default is 1.0) A epsislon to define a tolerance for checking if two polygons intersect.
253
+ */
254
+ PolygonInset._filterInnerSplitPolygonsByCoverage = function (splitPolygonsVertices, insetRectanglePolygons, intersectionEpsilon) {
255
+ // TEST: Add some jitter
256
+ // splitPolygonsVertices.forEach(split => {
257
+ // split.forEach(vert => {
258
+ // vert.x += (0.5 - Math.random()) * 0.01;
259
+ // vert.y += (0.5 - Math.random()) * 0.01;
260
+ // });
261
+ // });
262
+ splitPolygonsVertices.forEach(function (split, index) {
263
+ var isCW = Polygon_1.Polygon.utils.isClockwise(split);
264
+ if (!isCW) {
265
+ console.warn("------ split is not isClockwise!", index, isCW);
266
+ }
267
+ });
268
+ insetRectanglePolygons.forEach(function (rect, index) {
269
+ var isCW = rect.isClockwise();
270
+ if (!isCW) {
271
+ console.warn("------ rect is not isClockwise!", index, isCW);
272
+ }
273
+ });
274
+ var eps = intersectionEpsilon === undefined || typeof intersectionEpsilon === "undefined" ? 1.0 : intersectionEpsilon;
275
+ return splitPolygonsVertices.filter(function (splitPolyVerts, _splitPolyIndex) {
276
+ var intersectionTestCallback = PolygonInset._hasIntersectionCallback(splitPolyVerts, eps, _splitPolyIndex);
277
+ var intersectsWithAnyRect = insetRectanglePolygons.some(intersectionTestCallback);
278
+ return !intersectsWithAnyRect;
279
+ });
280
+ };
281
+ /**
282
+ * This private method will reverse each polygon's vertex order that's not clockwise.
283
+ *
284
+ * @param {Array<Vertex[]>} polygons
285
+ */
286
+ PolygonInset._assertAllPolygonsAreClockwise = function (polygons) {
287
+ polygons.forEach(function (polygonVerts, _polyIndex) {
288
+ // if (!Polygon.utils.isClockwise(polygonVerts)) {
289
+ // polygonVerts.reverse(); // Attention: this happens in-place (Array.reverse is destructive!)
290
+ // }
291
+ PolygonInset._assertPolygonIsClockwise(polygonVerts);
292
+ });
293
+ };
294
+ /**
295
+ * This private method will revert the vertex order if the polygon is not clockwise.
296
+ *
297
+ * @param {Vertex[]} polygonVerts
298
+ */
299
+ PolygonInset._assertPolygonIsClockwise = function (polygonVerts) {
300
+ if (!Polygon_1.Polygon.utils.isClockwise(polygonVerts)) {
301
+ polygonVerts.reverse(); // Attention: this happens in-place (Array.reverse is destructive!)
302
+ }
303
+ };
304
+ /**
305
+ * Optimize the inset polygon by removing critical `ear` edges.
306
+ * Such an is identified by: the edge itself is completely located inside its neighbours inset rectangle.
307
+ *
308
+ * In this process multiple edges from the ear might be dropped and two adjacent edges get a new
309
+ * common intersection point.
310
+ *
311
+ * Note: this method is not working as expected in all cases and quite experimental.
312
+ *
313
+ * @param insetPolygon
314
+ * @param insetRectangles
315
+ */
316
+ PolygonInset._optimizeInsetPolygon = function (insetPolygon, insetRectangles) {
317
+ // Locate edge that can be removed:
318
+ var earEdgeIndex = -1;
319
+ var maxLimit = insetPolygon.vertices.length;
320
+ var i = 0;
321
+ while (i++ < maxLimit &&
322
+ insetPolygon.vertices.length > 3 &&
323
+ (earEdgeIndex = PolygonInset._locateExcessiveEarEdge(insetPolygon, insetRectangles)) != -1) {
324
+ // console.log("REMOVE EAR EDGE", earEdgeIndex);
325
+ // As this is an ear edge: don't just remove the vertex.
326
+ // i) Remove the vertex and calculate the new intersection point of neighbour edges.
327
+ // ii) Update neightbour rectangles
328
+ var leftEdge = insetPolygon.getEdgeAt(earEdgeIndex - 2);
329
+ var rightEdge = insetPolygon.getEdgeAt(earEdgeIndex + 1);
330
+ var newIntersection = leftEdge.intersection(rightEdge);
331
+ newIntersection && rightEdge.a.set(newIntersection);
332
+ // Update rectangles
333
+ // ...
334
+ insetPolygon.vertices.splice(earEdgeIndex, 1);
335
+ insetRectangles.splice(earEdgeIndex, 1);
336
+ }
337
+ // TODO remove if not -1
338
+ };
339
+ PolygonInset._locateExcessiveEarEdge = function (insetPolygon, insetRectangles) {
340
+ for (var i = 0; i < insetPolygon.vertices.length; i++) {
341
+ var thisEdge = insetPolygon.getEdgeAt(i);
342
+ var leftIndex = i == 0 ? insetPolygon.vertices.length - 1 : i - 1;
343
+ // const rightIndex = i + 1 >= insetPolygon.vertices.length ? 0 : i + 1;
344
+ var leftRect = insetRectangles[leftIndex];
345
+ // const rightRect = insetRectangles[rightIndex];
346
+ var leftRectContainsThisEdge = PolygonInset._rectangleFullyContainsLine(leftRect, thisEdge);
347
+ if (leftRectContainsThisEdge) {
348
+ return i;
349
+ }
350
+ var leftEdge = insetPolygon.getEdgeAt(leftIndex);
351
+ var thisRect = insetRectangles[i];
352
+ var thisRectContainsLeftEdge = PolygonInset._rectangleFullyContainsLine(thisRect, leftEdge);
353
+ if (thisRectContainsLeftEdge) {
354
+ return i; // leftIndex;
355
+ }
356
+ }
357
+ return -1;
358
+ };
359
+ // Pre: rectangle.vertices.length === 4
360
+ PolygonInset._rectangleFullyContainsLine = function (rectangle, edge) {
361
+ var rectWidth = rectangle.getEdgeAt(0).length();
362
+ var rectHeight = rectangle.getEdgeAt(1).length();
363
+ // Both line corners must be at least 1% within the rectangle limits.
364
+ var eps = Math.min(rectWidth, rectHeight) / 100;
365
+ var edgeLen = edge.length();
366
+ var epsPointA = edge.vertAt(0.01); // edgeLen * eps);
367
+ var epsPointB = edge.vertAt(0.99); // 1.0 - edgeLen * eps);
368
+ var centerPoint = edge.vertAt(0.5);
369
+ return rectangle.containsVerts([epsPointA, epsPointB, centerPoint]);
370
+ };
371
+ /**
372
+ * For simplification I'm using a callback generator function here.
373
+ *
374
+ * @param splitPolyVerts
375
+ * @param eps
376
+ * @param _splitPolyIndex
377
+ * @returns {Function} The callback for an `Array.some` parameter.
378
+ */
379
+ PolygonInset._hasIntersectionCallback = function (splitPolyVerts, eps, _splitPolyIndex) {
380
+ return function (rectanglePoly, _rectanglePolyIndex) {
381
+ // const intersectionVerts: XYCoords[] = sutherlandHodgman(splitPolyVerts, rectanglePoly.vertices);
382
+ var intersectionVerts = (0, sutherlandHodgman_1.sutherlandHodgman)(rectanglePoly.vertices, splitPolyVerts);
383
+ // var intersection = GreinerHorman.intersection(sourcePolygon.vertices, clipPolygon.vertices);
384
+ // const uniqueIntersectionVerts = clearDuplicateVertices(intersectionVerts);
385
+ var intersectionAreaSize = Polygon_1.Polygon.utils.area(intersectionVerts);
386
+ if (intersectionAreaSize < 0) {
387
+ console.warn("%cFound a polygon split with negative area. Counterclockwise against all odds?", "color: red; background: black;", // font-size: 30px",
388
+ "intersectionAreaSize", intersectionAreaSize, "_splitPolyIndex", _splitPolyIndex, "_rectanglePolyIndex", _rectanglePolyIndex, "intersectionVerts", intersectionVerts
389
+ // "uniqueIntersectionVerts",
390
+ // uniqueIntersectionVerts
391
+ );
392
+ }
393
+ // if (intersectionAreaSize >= eps) {
394
+ // console.log(
395
+ // "%cFound a polygon split for removal",
396
+ // "color: orange; background: grey;", // font-size: 30px",
397
+ // "intersectionAreaSize",
398
+ // intersectionAreaSize,
399
+ // "_splitPolyIndex",
400
+ // _splitPolyIndex,
401
+ // "_rectanglePolyIndex",
402
+ // _rectanglePolyIndex,
403
+ // "intersectionVerts",
404
+ // intersectionVerts
405
+ // // "uniqueIntersectionVerts",
406
+ // // uniqueIntersectionVerts
407
+ // );
408
+ // }
409
+ // if (intersectionAreaSize < eps) {
410
+ // // console.log("%cHello", "color: green; background: yellow; font-size: 30px");
411
+ // console.log(
412
+ // "Polygon split can be kept. Area is position but below epsilon.",
413
+ // "intersectionAreaSize",
414
+ // intersectionAreaSize,
415
+ // "_splitPolyIndex",
416
+ // _splitPolyIndex,
417
+ // "_rectanglePolyIndex",
418
+ // _rectanglePolyIndex,
419
+ // "intersectionVerts",
420
+ // intersectionVerts
421
+ // // "uniqueIntersectionVerts",
422
+ // // uniqueIntersectionVerts
423
+ // );
424
+ // }
425
+ return intersectionAreaSize >= eps;
426
+ };
427
+ };
428
+ return PolygonInset;
429
+ }());
430
+ exports.PolygonInset = PolygonInset;
431
+ //# sourceMappingURL=PolygonInset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PolygonInset.js","sourceRoot":"","sources":["../../../ts/utils/algorithms/PolygonInset.ts"],"names":[],"mappings":"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"}
@@ -6,16 +6,17 @@
6
6
  * @author Ikaros Kappler
7
7
  * @date 2021-07-13
8
8
  * @modified 2023-10-28 Refactored and ported to Typescript.
9
- * @version 1.0.0
9
+ * @modified 2024-12-17 Simplified this method to work with generic sub types of XYCoords as well.
10
+ * @version 1.0.1
10
11
  */
11
- import { Vertex } from "../../Vertex";
12
+ import { XYCoords } from "../../interfaces";
12
13
  /**
13
14
  * Filter the array and clear all duplicates.
14
15
  *
15
16
  * The original array is left unchanged. The vertices in the array are not cloned.
16
17
  *
17
- * @param {Vertex[]} vertices
18
+ * @param {XYCoords[]} vertices
18
19
  * @param {number=EPS} epsilon
19
20
  * @return {Vertex[]}
20
21
  */
21
- export declare const clearDuplicateVertices: (vertices: Vertex[], epsilon?: number) => Vertex[];
22
+ export declare const clearDuplicateVertices: <T extends XYCoords>(vertices: T[], epsilon?: number) => T[];
@@ -7,17 +7,19 @@
7
7
  * @author Ikaros Kappler
8
8
  * @date 2021-07-13
9
9
  * @modified 2023-10-28 Refactored and ported to Typescript.
10
- * @version 1.0.0
10
+ * @modified 2024-12-17 Simplified this method to work with generic sub types of XYCoords as well.
11
+ * @version 1.0.1
11
12
  */
12
13
  Object.defineProperty(exports, "__esModule", { value: true });
13
14
  exports.clearDuplicateVertices = void 0;
15
+ var geomutils_1 = require("../../geomutils");
14
16
  var EPS = 0.000001;
15
17
  /**
16
18
  * Filter the array and clear all duplicates.
17
19
  *
18
20
  * The original array is left unchanged. The vertices in the array are not cloned.
19
21
  *
20
- * @param {Vertex[]} vertices
22
+ * @param {XYCoords[]} vertices
21
23
  * @param {number=EPS} epsilon
22
24
  * @return {Vertex[]}
23
25
  */
@@ -35,7 +37,8 @@ var clearDuplicateVertices = function (vertices, epsilon) {
35
37
  };
36
38
  exports.clearDuplicateVertices = clearDuplicateVertices;
37
39
  var isCloseTo = function (vertA, vertB, eps) {
38
- return vertA.distance(vertB) < eps;
40
+ // return vertA.distance(vertB) < eps;
41
+ return geomutils_1.geomutils.dist4(vertA.x, vertA.y, vertB.x, vertB.y) < eps;
39
42
  };
40
43
  var containsElementFrom = function (vertices, vertex, fromIndex, epsilon) {
41
44
  for (var i = fromIndex; i < vertices.length; i++) {
@@ -1 +1 @@
1
- {"version":3,"file":"clearDuplicateVertices.js","sourceRoot":"","sources":["../../../ts/utils/algorithms/clearDuplicateVertices.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAIH,IAAM,GAAG,GAAW,QAAQ,CAAC;AAE7B;;;;;;;;GAQG;AACI,IAAM,sBAAsB,GAAG,UAAC,QAAkB,EAAE,OAAgB;IACzE,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,GAAG,GAAG,CAAC;IAChB,CAAC;IACD,IAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;YAChE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAXW,QAAA,sBAAsB,0BAWjC;AAEF,IAAM,SAAS,GAAG,UAAC,KAAa,EAAE,KAAa,EAAE,GAAW;IAC1D,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AACrC,CAAC,CAAC;AAEF,IAAM,mBAAmB,GAAG,UAAC,QAAuB,EAAE,MAAc,EAAE,SAAiB,EAAE,OAAe;IACtG,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
1
+ {"version":3,"file":"clearDuplicateVertices.js","sourceRoot":"","sources":["../../../ts/utils/algorithms/clearDuplicateVertices.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAEH,6CAA4C;AAG5C,IAAM,GAAG,GAAW,QAAQ,CAAC;AAE7B;;;;;;;;GAQG;AACI,IAAM,sBAAsB,GAAG,UAAqB,QAAa,EAAE,OAAgB;IACxF,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,GAAG,GAAG,CAAC;IAChB,CAAC;IACD,IAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;YAChE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAXW,QAAA,sBAAsB,0BAWjC;AAEF,IAAM,SAAS,GAAG,UAAqB,KAAQ,EAAE,KAAQ,EAAE,GAAW;IACpE,sCAAsC;IACtC,OAAO,qBAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;AACnE,CAAC,CAAC;AAEF,IAAM,mBAAmB,GAAG,UAAqB,QAAkB,EAAE,MAAS,EAAE,SAAiB,EAAE,OAAe;IAChH,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
@@ -5,6 +5,7 @@
5
5
  * @author Ikaros Kappler
6
6
  * @date 2020-12-04
7
7
  * @modified 2020-12-09 Ported from vanilla JS to Typescript.
8
+ * @modified 2024-11-22 Fixed a type error in line 41.
8
9
  */
9
10
  import { Vertex } from "../../Vertex";
10
11
  import { XYCoords } from "../../interfaces";
@@ -15,6 +16,6 @@ import { XYCoords } from "../../interfaces";
15
16
  *
16
17
  * @name findPolygonSelfIntersections
17
18
  * @param {Array<Vertex>} vertices - The vertices that form the polygon.
18
- * @return Array<Vertex>
19
+ * @return {Array<Vertex>}
19
20
  */
20
21
  export declare const findPolygonSelfIntersections: (vertices: Array<XYCoords>) => Array<Vertex>;
@@ -6,6 +6,7 @@
6
6
  * @author Ikaros Kappler
7
7
  * @date 2020-12-04
8
8
  * @modified 2020-12-09 Ported from vanilla JS to Typescript.
9
+ * @modified 2024-11-22 Fixed a type error in line 41.
9
10
  */
10
11
  Object.defineProperty(exports, "__esModule", { value: true });
11
12
  exports.findPolygonSelfIntersections = void 0;
@@ -18,7 +19,7 @@ var Vertex_1 = require("../../Vertex");
18
19
  *
19
20
  * @name findPolygonSelfIntersections
20
21
  * @param {Array<Vertex>} vertices - The vertices that form the polygon.
21
- * @return Array<Vertex>
22
+ * @return {Array<Vertex>}
22
23
  */
23
24
  var findPolygonSelfIntersections = function (vertices) {
24
25
  var pointList = [];
@@ -39,8 +40,7 @@ var findPolygonSelfIntersections = function (vertices) {
39
40
  // The point is undefined if and only if both line are parallel (co-linear).
40
41
  var intersectionPoint = lineA.intersection(lineB);
41
42
  // Check if the intersection point is on both (finite) edges of the polygon.
42
- if (intersectionPoint
43
- && lineA.hasPoint(intersectionPoint) && lineB.hasPoint(intersectionPoint)) {
43
+ if (intersectionPoint && lineA.hasPoint(intersectionPoint) && lineB.hasPoint(intersectionPoint)) {
44
44
  pointList.push(intersectionPoint);
45
45
  }
46
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"findPolygonSelfIntersections.js","sourceRoot":"","sources":["../../../ts/utils/algorithms/findPolygonSelfIntersections.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEH,mCAAkC;AAClC,uCAAsC;AAGtC;;;;;;;;GAQG;AACI,IAAM,4BAA4B,GAAG,UAAE,QAAwB;IAClE,IAAM,SAAS,GAAmB,EAAE,CAAC;IACrC,IAAM,KAAK,GAAU,IAAI,WAAI,CAAE,IAAI,eAAM,EAAE,EAAE,IAAI,eAAM,EAAE,CAAE,CAAC;IAC5D,IAAM,KAAK,GAAU,IAAI,WAAI,CAAE,IAAI,eAAM,EAAE,EAAE,IAAI,eAAM,EAAE,CAAE,CAAC;IAC5D,IAAM,CAAC,GAAY,QAAQ,CAAC,MAAM,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAG,CAAC;QACjC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAE,QAAQ,CAAC,CAAC,CAAC,CAAE,CAAC;QAC3B,KAAK,CAAC,CAAC,CAAC,GAAG,CAAE,QAAQ,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAE,CAAC;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAG,CAAC;YAC1B,wDAAwD;YACxD,aAAa;YACb,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAC,CAAC,IAAI,CAAC,CAAC,IAAE,CAAC,IAAE,CAAC,GAAC,CAAC,IAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAE,CAAC,IAAE,CAAC,GAAC,CAAC,IAAE,CAAC,CAAC;gBACzE,SAAS;YACN,KAAK,CAAC,CAAC,CAAC,GAAG,CAAE,QAAQ,CAAC,CAAC,CAAC,CAAE,CAAC;YAC3B,KAAK,CAAC,CAAC,CAAC,GAAG,CAAE,QAAQ,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAE,CAAC;YAEjC,2DAA2D;YAC3D,4EAA4E;YAC5E,IAAM,iBAAiB,GAAsB,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAEvE,4EAA4E;YAC5E,IAAI,iBAAiB;mBACrB,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAG,CAAC;gBAC7E,SAAS,CAAC,IAAI,CAAE,iBAAiB,CAAE,CAAC;YACjC,CAAC;QACL,CAAC;IACE,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC,CAAC;AA5BW,QAAA,4BAA4B,gCA4BvC"}
1
+ {"version":3,"file":"findPolygonSelfIntersections.js","sourceRoot":"","sources":["../../../ts/utils/algorithms/findPolygonSelfIntersections.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,mCAAkC;AAClC,uCAAsC;AAGtC;;;;;;;;GAQG;AACI,IAAM,4BAA4B,GAAG,UAAC,QAAyB;IACpE,IAAM,SAAS,GAAkB,EAAE,CAAC;IACpC,IAAM,KAAK,GAAS,IAAI,WAAI,CAAC,IAAI,eAAM,EAAE,EAAE,IAAI,eAAM,EAAE,CAAC,CAAC;IACzD,IAAM,KAAK,GAAS,IAAI,WAAI,CAAC,IAAI,eAAM,EAAE,EAAE,IAAI,eAAM,EAAE,CAAC,CAAC;IACzD,IAAM,CAAC,GAAW,QAAQ,CAAC,MAAM,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,wDAAwD;YACxD,aAAa;YACb,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAAE,SAAS;YACrG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACzB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAEnC,2DAA2D;YAC3D,4EAA4E;YAC5E,IAAM,iBAAiB,GAAkB,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAEnE,4EAA4E;YAC5E,IAAI,iBAAiB,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAChG,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AA1BW,QAAA,4BAA4B,gCA0BvC"}
@@ -5,7 +5,8 @@
5
5
  * @author Ikaros Kappler
6
6
  * @date 2020-12-04
7
7
  * @modified 2020-12-07 Ported from vanilla JS to typescript.
8
- * @version 1.0.1
8
+ * @modified 2024-11-22 Added the `insideBoundsOnly` param to the `splitPolygonToNonIntersecting` algorithm.
9
+ * @version 1.1.0
9
10
  */
10
11
  import { Vertex } from "../../Vertex";
11
12
  /**
@@ -24,4 +25,4 @@ import { Vertex } from "../../Vertex";
24
25
  * @param {number=10} maxDepth - Number of max recursive steps (default is 10).
25
26
  * @return {Array<Array<Vertex>>} A sequence of non-self-intersecting sub polygons.
26
27
  */
27
- export declare const splitPolygonToNonIntersecting: (vertices: Array<Vertex>, maxDepth?: number) => Array<Array<Vertex>>;
28
+ export declare const splitPolygonToNonIntersecting: (vertices: Array<Vertex>, maxDepth?: number, insideBoundsOnly?: boolean) => Array<Array<Vertex>>;
@@ -6,7 +6,8 @@
6
6
  * @author Ikaros Kappler
7
7
  * @date 2020-12-04
8
8
  * @modified 2020-12-07 Ported from vanilla JS to typescript.
9
- * @version 1.0.1
9
+ * @modified 2024-11-22 Added the `insideBoundsOnly` param to the `splitPolygonToNonIntersecting` algorithm.
10
+ * @version 1.1.0
10
11
  */
11
12
  Object.defineProperty(exports, "__esModule", { value: true });
12
13
  exports.splitPolygonToNonIntersecting = void 0;
@@ -33,12 +34,12 @@ exports.splitPolygonToNonIntersecting = (function () {
33
34
  * @param {Array<Vertex>} vertices
34
35
  * @param {number=10} maxDepth
35
36
  */
36
- var splitPolygonToNonIntersecting = function (vertices, maxDepth) {
37
+ var splitPolygonToNonIntersecting = function (vertices, maxDepth, insideBoundsOnly) {
37
38
  if (typeof maxDepth === "undefined")
38
39
  maxDepth = 10;
39
- return _splitPolygonToNonIntersecting(vertices, maxDepth);
40
+ return _splitPolygonToNonIntersecting(vertices, maxDepth, insideBoundsOnly);
40
41
  };
41
- var _splitPolygonToNonIntersecting = function (vertices, maxDepth) {
42
+ var _splitPolygonToNonIntersecting = function (vertices, maxDepth, insideBoundsOnly) {
42
43
  if (maxDepth <= 0) {
43
44
  // aborting at max depth
44
45
  return [vertices];
@@ -56,18 +57,19 @@ exports.splitPolygonToNonIntersecting = (function () {
56
57
  for (var b = 0; b < vertices.length; b++) {
57
58
  // Equal edges or neighbour edges intersect by definition.
58
59
  // We ignore them.
59
- if (a == b || a + 1 == b || a == b + 1
60
- || (a == 0 && b + 1 == vertices.length) || (b == 0 && a + 1 == vertices.length))
60
+ if (a == b || a + 1 == b || a == b + 1 || (a == 0 && b + 1 == vertices.length) || (b == 0 && a + 1 == vertices.length))
61
61
  continue;
62
62
  lineB.a.set(vertices[b]);
63
63
  lineB.b.set(vertices[(b + 1) % n]);
64
64
  var intersectionPoint = lineA.intersection(lineB);
65
- if (intersectionPoint && lineA.hasPoint(intersectionPoint) && lineB.hasPoint(intersectionPoint)) {
65
+ if (intersectionPoint &&
66
+ lineA.hasPoint(intersectionPoint, insideBoundsOnly) &&
67
+ lineB.hasPoint(intersectionPoint, insideBoundsOnly)) {
66
68
  // Cut polygon into two here
67
69
  var split = splitPolygonAt(vertices, a, b, intersectionPoint);
68
70
  // Split has 2 elements.
69
- var leftCleaned = _splitPolygonToNonIntersecting(split[0], maxDepth - 1);
70
- var rightCleaned = _splitPolygonToNonIntersecting(split[1], maxDepth - 1);
71
+ var leftCleaned = _splitPolygonToNonIntersecting(split[0], maxDepth - 1, insideBoundsOnly);
72
+ var rightCleaned = _splitPolygonToNonIntersecting(split[1], maxDepth - 1, insideBoundsOnly);
71
73
  return leftCleaned.concat(rightCleaned);
72
74
  }
73
75
  }