@escapace/minimum-perimeter-triangle 0.2.5 → 0.3.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.
package/LICENSE CHANGED
@@ -1,3 +1,4 @@
1
+
1
2
  Mozilla Public License Version 2.0
2
3
  ==================================
3
4
 
@@ -357,7 +358,7 @@ Exhibit A - Source Code Form License Notice
357
358
 
358
359
  This Source Code Form is subject to the terms of the Mozilla Public
359
360
  License, v. 2.0. If a copy of the MPL was not distributed with this
360
- file, You can obtain one at http://mozilla.org/MPL/2.0/.
361
+ file, You can obtain one at https://mozilla.org/MPL/2.0/.
361
362
 
362
363
  If it is not possible or desirable to put the notice in a particular
363
364
  file, then You may include the notice in a location (such as a LICENSE
package/README.md CHANGED
@@ -1,6 +0,0 @@
1
- # @escapace/minimum-perimeter-triangle
2
-
3
- A light adaptation of Victor Ermolaev's
4
- [implementation](https://github.com/vnermolaev/minimal-perimeter-triangle) of an
5
- algorithm that computes the minimum perimeter triangle enclosing a convex
6
- polygon.
@@ -0,0 +1,557 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
+
5
+ // src/line.ts
6
+ var Line = class {
7
+ constructor(start, end) {
8
+ __publicField(this, "delta");
9
+ __publicField(this, "end");
10
+ __publicField(this, "start");
11
+ this.start = start;
12
+ this.end = end;
13
+ this.delta = end.minus(start);
14
+ }
15
+ closestPoint(p) {
16
+ return this.evaluate(this.closestPointParam(p));
17
+ }
18
+ closestPointParam(p) {
19
+ return this.delta.dot(p.minus(this.start)) / this.delta.normSquared;
20
+ }
21
+ distanceToPoint(p) {
22
+ return Math.abs(p.cross(this.delta) - this.start.cross(this.end)) / this.delta.norm;
23
+ }
24
+ evaluate(t) {
25
+ return this.start.plus(this.delta.times(t));
26
+ }
27
+ intersectionParameter(that, error) {
28
+ const d = this.delta.cross(that.delta);
29
+ if (d === 0 || Math.abs(d) < error) {
30
+ return null;
31
+ }
32
+ const dStart = this.start.minus(that.start);
33
+ return that.delta.cross(dStart) / d;
34
+ }
35
+ intersectionPoint(that, error) {
36
+ const t = this.intersectionParameter(that, error);
37
+ return t === null ? null : this.evaluate(t);
38
+ }
39
+ overlaps(that, error) {
40
+ return this.pointOnTop(that.start, error) && this.pointOnTop(that.end, error);
41
+ }
42
+ /**
43
+ * If alpha is less than deviationFromZeroAngle, the 2 lines are
44
+ * considered parallel.
45
+ * _______________________________
46
+ * alpha (/
47
+ * /
48
+ * /
49
+ * /
50
+ */
51
+ parallel(that, deviationFromZeroAngle) {
52
+ const d = Math.abs(this.delta.cross(that.delta));
53
+ return d === 0 || d < this.length * this.length * Math.sin(deviationFromZeroAngle);
54
+ }
55
+ pointOnSide(p, error = 0) {
56
+ const number_ = this.start.cross(this.end) - p.cross(this.delta);
57
+ if (number_ === 0 || Math.abs(number_) / this.delta.norm < error) {
58
+ return 0 /* Top */;
59
+ }
60
+ return number_ > 0 ? 1 /* Left */ : -1 /* Right */;
61
+ }
62
+ pointOnTop(p, error) {
63
+ return this.pointOnSide(p, error) === 0 /* Top */;
64
+ }
65
+ /**
66
+ * Length of a line is the length between its two defining points
67
+ */
68
+ get length() {
69
+ return this.delta.norm;
70
+ }
71
+ };
72
+
73
+ // src/vec2.ts
74
+ var Vec2 = class _Vec2 {
75
+ constructor(x, y) {
76
+ __publicField(this, "_norm");
77
+ __publicField(this, "_normalized");
78
+ __publicField(this, "_normSquared");
79
+ __publicField(this, "_x");
80
+ __publicField(this, "_y");
81
+ this._x = x;
82
+ this._y = y;
83
+ }
84
+ cross(that) {
85
+ return this._x * that._y - this._y * that._x;
86
+ }
87
+ dot(that) {
88
+ return this._x * that._x + this._y * that._y;
89
+ }
90
+ equals(that, error) {
91
+ if (error === 0) {
92
+ return this.x === that.x && this.y === that.y;
93
+ }
94
+ return this.minus(that).normSquared < error * error;
95
+ }
96
+ minus(that) {
97
+ return new _Vec2(this._x - that._x, this._y - that._y);
98
+ }
99
+ normal() {
100
+ return new _Vec2(this._y, -this._x);
101
+ }
102
+ over(s) {
103
+ return new _Vec2(this._x / s, this._y / s);
104
+ }
105
+ plus(that) {
106
+ return new _Vec2(this._x + that._x, this._y + that._y);
107
+ }
108
+ times(s) {
109
+ return new _Vec2(this._x * s, this._y * s);
110
+ }
111
+ toString() {
112
+ return `(${this.x}, ${this.y})`;
113
+ }
114
+ get norm() {
115
+ return this._norm === void 0 ? this._norm = Math.sqrt(this.normSquared) : this._norm;
116
+ }
117
+ get normalized() {
118
+ return this._normalized === void 0 ? this._normalized = this.over(this.norm) : this._normalized;
119
+ }
120
+ get normSquared() {
121
+ return this._normSquared === void 0 ? this._normSquared = this.dot(this) : this._normSquared;
122
+ }
123
+ get x() {
124
+ return this._x;
125
+ }
126
+ get y() {
127
+ return this._y;
128
+ }
129
+ };
130
+
131
+ // src/inscribe.ts
132
+ var Wedge = class _Wedge {
133
+ constructor(leftArm, rightArm, isDegenerate = false) {
134
+ __publicField(this, "isDegenerate");
135
+ __publicField(this, "leftArm");
136
+ __publicField(this, "rightArm");
137
+ this.leftArm = leftArm;
138
+ this.rightArm = rightArm;
139
+ this.isDegenerate = isDegenerate;
140
+ }
141
+ static new(leftArm, rightArm, error) {
142
+ if (leftArm === null || rightArm === null) {
143
+ return null;
144
+ }
145
+ if (error !== 0 && leftArm.overlaps(rightArm, error)) {
146
+ return null;
147
+ }
148
+ const deviationFromZeroAngle = 0.1 / (leftArm.length * rightArm.length);
149
+ if (leftArm.parallel(rightArm, deviationFromZeroAngle)) {
150
+ const middle = new Line(leftArm.evaluate(0.5), rightArm.evaluate(0.5));
151
+ const p = middle.evaluate(0.5);
152
+ const sideLeft = leftArm.pointOnSide(p, error);
153
+ const sideRight = rightArm.pointOnSide(p, error);
154
+ if (sideLeft === 0 /* Top */ || sideRight === 0 /* Top */) {
155
+ throw new Error();
156
+ }
157
+ return sideLeft !== sideRight ? new _Wedge(leftArm, rightArm, true) : new _Wedge(leftArm, new Line(rightArm.end, rightArm.start));
158
+ }
159
+ const tLA = leftArm.intersectionParameter(rightArm, 0);
160
+ const tRA = rightArm.intersectionParameter(leftArm, 0);
161
+ if (tLA === 0.5 || tRA === 0.5) {
162
+ return null;
163
+ }
164
+ const W = leftArm.evaluate(tLA);
165
+ const eLA = tLA < 1 - tLA ? leftArm.end : leftArm.start;
166
+ const eRA = tRA < 1 - tRA ? rightArm.end : rightArm.start;
167
+ return new _Wedge(new Line(W, eLA), new Line(W, eRA));
168
+ }
169
+ fit_Dl(l, error) {
170
+ if (!this.formTriangle(l, error)) {
171
+ return null;
172
+ }
173
+ const A = l.intersectionPoint(this.rightArm, 0);
174
+ const B = l.intersectionPoint(this.leftArm, 0);
175
+ const AB = new Line(A, B);
176
+ const Ap = this.leftArm.closestPoint(A);
177
+ const I = A.plus(Ap).over(2);
178
+ const r = A.minus(Ap).norm / 2;
179
+ const t1 = (AB.delta.cross(A.minus(I)) + r * AB.delta.norm) / AB.delta.cross(this.rightArm.delta);
180
+ const t2 = (AB.delta.cross(A.minus(I)) - r * AB.delta.norm) / AB.delta.cross(this.rightArm.delta);
181
+ const o1 = this.rightArm.delta.times(t1).plus(I);
182
+ const o2 = this.rightArm.delta.times(t2).plus(I);
183
+ return [
184
+ {
185
+ circle: { centre: o1, r },
186
+ tangentParameter: l.closestPointParam(o1)
187
+ },
188
+ {
189
+ circle: { centre: o2, r },
190
+ tangentParameter: l.closestPointParam(o2)
191
+ }
192
+ ];
193
+ }
194
+ fit_Dp(p, error) {
195
+ if (!this.strictlyContains(p, error)) {
196
+ return null;
197
+ }
198
+ const A = this.rightArm.closestPoint(p);
199
+ const Ap = this.leftArm.closestPoint(A);
200
+ const I = A.plus(Ap).over(2);
201
+ const r = A.minus(Ap).norm / 2;
202
+ const a = this.rightArm.delta.normSquared;
203
+ const b = I.minus(p).dot(this.rightArm.delta) * 2;
204
+ const c = I.minus(p).normSquared - r * r;
205
+ const discriminant = b * b - 4 * a * c;
206
+ if (discriminant < (-10) ** -5) {
207
+ return null;
208
+ }
209
+ const t = [];
210
+ if (Math.abs(discriminant) < 10 ** -5) {
211
+ t.push(-b / (2 * a));
212
+ } else {
213
+ t.push((-b + Math.sqrt(discriminant)) / (2 * a));
214
+ t.push((-b - Math.sqrt(discriminant)) / (2 * a));
215
+ }
216
+ const result = [];
217
+ t.forEach((t0) => {
218
+ const O = this.rightArm.delta.times(t0).plus(I);
219
+ result.push({
220
+ circle: { centre: O, r },
221
+ tangent: new Line(p, p.plus(O.minus(p).normal()))
222
+ });
223
+ });
224
+ return result;
225
+ }
226
+ fit_NDl(l, error) {
227
+ if (!this.formTriangle(l, error)) {
228
+ return null;
229
+ }
230
+ const C = this.leftArm.start;
231
+ const A = l.intersectionPoint(this.leftArm, 0);
232
+ const B = l.intersectionPoint(this.rightArm, 0);
233
+ const AC = new Line(A, C);
234
+ const BC = new Line(B, C);
235
+ const AB = new Line(A, B);
236
+ const a = AC.length;
237
+ const b = BC.length;
238
+ const c = AB.length;
239
+ const s = (a + b + c) / 2;
240
+ if (s * (s - a) * (s - b) / (s - c) < 0) {
241
+ return null;
242
+ }
243
+ const r = Math.sqrt(s * (s - a) * (s - b) / (s - c));
244
+ const det = AB.delta.cross(AC.delta);
245
+ const lhsAll = [
246
+ new Vec2(B.cross(A) + r * c, C.cross(A) + r * a),
247
+ new Vec2(B.cross(A) + r * c, C.cross(A) - r * a),
248
+ new Vec2(B.cross(A) - r * c, C.cross(A) + r * a),
249
+ new Vec2(B.cross(A) - r * c, C.cross(A) - r * a)
250
+ ];
251
+ const OAll = [];
252
+ lhsAll.forEach((lhs) => {
253
+ OAll.push(
254
+ new Vec2(
255
+ new Vec2(AB.delta.x, AC.delta.x).cross(lhs),
256
+ new Vec2(AB.delta.y, AC.delta.y).cross(lhs)
257
+ ).over(-det)
258
+ );
259
+ });
260
+ let o = null;
261
+ const dists = [];
262
+ for (const O of OAll) {
263
+ dists.push({
264
+ norm: Math.abs(BC.distanceToPoint(O) / r - 1),
265
+ raw: Math.abs(BC.distanceToPoint(O) - r)
266
+ });
267
+ const absoluteError = Math.abs(BC.distanceToPoint(O) - r);
268
+ const relativeError = Math.abs(BC.distanceToPoint(O) / r - 1);
269
+ if ((absoluteError < 10 ** -5 || relativeError < 10 ** -5) && AC.pointOnSide(O) !== BC.pointOnSide(O)) {
270
+ o = O;
271
+ break;
272
+ }
273
+ }
274
+ let message = "";
275
+ if (o === null) {
276
+ message = "fit_NDl, centre is undefined";
277
+ for (let index = 0; index < OAll.length; index++) {
278
+ message += `centre: (${OAll[index].x}, ${OAll[index].y}), r: ${r}, dist raw: ${dists[index].raw}, dist norm: ${dists[index].norm}
279
+ `;
280
+ }
281
+ }
282
+ if (o === null) {
283
+ throw new Error(message);
284
+ }
285
+ return [
286
+ {
287
+ circle: { centre: o, r },
288
+ tangentParameter: l.closestPointParam(o)
289
+ }
290
+ ];
291
+ }
292
+ // While fitting circles into a wedge
293
+ // There are four distinct cases:
294
+ // 1. Wedge is degenerate and additional element is a point
295
+ // 2. Wedge is degenerate and additional element is a line
296
+ // 3. Wedge is non-degenerate and additional element is a point
297
+ // 4. Wedge is non-degenerate and additional element is a line
298
+ // according to these assumptions, the following methods are named
299
+ fit_NDp(p, error) {
300
+ if (!this.strictlyContains(p, error)) {
301
+ return null;
302
+ }
303
+ const C = this.leftArm.start;
304
+ const A = this.leftArm.end;
305
+ const B = this.rightArm.end;
306
+ const a = C.minus(B).norm;
307
+ const b = C.minus(A).norm;
308
+ const D = A.minus(B).times(a / (a + b)).plus(B);
309
+ const bisector = new Line(C, D);
310
+ const eA = D.minus(C).normSquared - (A.minus(C).cross(D.minus(C)) / b) ** 2;
311
+ const eB = D.minus(C).dot(C.minus(p)) * 2;
312
+ const eC = C.minus(p).normSquared;
313
+ const discriminant = eB * eB - 4 * eA * eC;
314
+ if (discriminant < (-10) ** -5) {
315
+ return null;
316
+ }
317
+ let O, r;
318
+ if (Math.abs(discriminant) < 10 ** -5) {
319
+ const t = -eB / (2 * eA);
320
+ O = bisector.evaluate(t);
321
+ r = O.minus(p).norm;
322
+ } else {
323
+ const t1 = (-eB + Math.sqrt(discriminant)) / (2 * eA);
324
+ const t2 = (-eB - Math.sqrt(discriminant)) / (2 * eA);
325
+ if (bisector.evaluate(t1).minus(p).normSquared > bisector.evaluate(t2).minus(p).normSquared) {
326
+ O = bisector.evaluate(t1);
327
+ r = bisector.evaluate(t1).minus(p).norm;
328
+ } else {
329
+ O = bisector.evaluate(t2);
330
+ r = bisector.evaluate(t2).minus(p).norm;
331
+ }
332
+ }
333
+ return [
334
+ {
335
+ circle: { centre: O, r },
336
+ tangent: new Line(p, p.plus(O.minus(p).normal()))
337
+ }
338
+ ];
339
+ }
340
+ fitCircles(element, error) {
341
+ if (element instanceof Vec2) {
342
+ return this.isDegenerate ? this.fit_Dp(element, error) : this.fit_NDp(element, error);
343
+ }
344
+ if (element instanceof Line) {
345
+ return this.isDegenerate ? this.fit_Dl(element instanceof Line ? element : element, error) : this.fit_NDl(element instanceof Line ? element : element, error);
346
+ }
347
+ return null;
348
+ }
349
+ formTriangle(line, error) {
350
+ const thin = this.leftArm.parallel(line, 0.1 / (this.leftArm.length * line.length)) || this.rightArm.parallel(line, 0.1 / (this.rightArm.length * line.length));
351
+ if (thin) {
352
+ return false;
353
+ }
354
+ const A = line.intersectionPoint(this.leftArm, 0);
355
+ const B = line.intersectionPoint(this.rightArm, 0);
356
+ if (this.isDegenerate) {
357
+ return !A.equals(B, error);
358
+ }
359
+ const C = this.leftArm.intersectionPoint(this.rightArm, 0);
360
+ return !C.equals(A, error) && !C.equals(B, error) && !A.equals(B, error) && !new Line(A, B).pointOnTop(C, error);
361
+ }
362
+ looselyContains(p, error) {
363
+ const pLeft = this.leftArm.pointOnSide(p, error);
364
+ const pRight = this.rightArm.pointOnSide(p, error);
365
+ if (pLeft === 0 /* Top */ || pRight === 0 /* Top */) {
366
+ return true;
367
+ }
368
+ if (pLeft === pRight) {
369
+ return false;
370
+ }
371
+ return this.isDegenerate ? (
372
+ // degenerate + different sides => true
373
+ true
374
+ ) : (
375
+ // 2. (Because the arms intersect)
376
+ // Projection params of the point onto the arms must be larger than 0
377
+ this.leftArm.closestPointParam(p) >= 0 && this.rightArm.closestPointParam(p) >= 0
378
+ );
379
+ }
380
+ strictlyContains(p, error) {
381
+ const pLeft = this.leftArm.pointOnSide(p, error);
382
+ const pRight = this.rightArm.pointOnSide(p, error);
383
+ if (pLeft === 0 /* Top */ || pRight === 0 /* Top */) {
384
+ return false;
385
+ }
386
+ if (pLeft === pRight) {
387
+ return false;
388
+ }
389
+ return this.isDegenerate ? (
390
+ // degenerate + different sides => true
391
+ true
392
+ ) : (
393
+ // 2. (Because the arms intersect)
394
+ // Projection params of the point onto the arms must be larger than 0
395
+ this.leftArm.closestPointParam(p) >= 0 && this.rightArm.closestPointParam(p) >= 0
396
+ );
397
+ }
398
+ toString() {
399
+ return `LA: ${this.leftArm.start.toString()} --> ${this.leftArm.end.toString()}
400
+ RA: ${this.rightArm.start.toString()} --> ${this.rightArm.end.toString()}`;
401
+ }
402
+ };
403
+
404
+ // src/index.ts
405
+ function lineTangentToHull(line, points, halo) {
406
+ let holds = true;
407
+ let side = 0 /* Top */;
408
+ let k = 0;
409
+ while (side === 0 /* Top */ && k < points.length) {
410
+ side = line.pointOnSide(points[k], halo);
411
+ k++;
412
+ }
413
+ for (let index = k; index < points.length; index++) {
414
+ const testSide = line.pointOnSide(points[index], halo);
415
+ if (testSide === 0 /* Top */) {
416
+ continue;
417
+ }
418
+ if (testSide !== side) {
419
+ holds = false;
420
+ break;
421
+ }
422
+ }
423
+ return { holds, side };
424
+ }
425
+ function findEnclosingSide(wedge, startVertex, endVertex, points, halo) {
426
+ let side = null;
427
+ let stopVertex = startVertex;
428
+ let vertex = startVertex;
429
+ while (side === null && vertex > endVertex) {
430
+ const p1 = points[vertex];
431
+ const p2 = points[vertex - 1];
432
+ const edge = new Line(p1, p2);
433
+ const circlesEdge = wedge.fitCircles(edge, halo);
434
+ if (circlesEdge !== null) {
435
+ let tangentParameter = 100;
436
+ if (wedge.isDegenerate) {
437
+ let sidedness = 0 /* Top */;
438
+ let k = 0;
439
+ while (sidedness === 0 /* Top */ && k < points.length) {
440
+ sidedness = edge.pointOnSide(points[k], halo);
441
+ k++;
442
+ }
443
+ tangentParameter = edge.pointOnSide(circlesEdge[0].circle.centre) !== sidedness ? circlesEdge[0].tangentParameter : circlesEdge[1].tangentParameter;
444
+ } else {
445
+ tangentParameter = circlesEdge[0].tangentParameter;
446
+ }
447
+ if (tangentParameter > 0 && tangentParameter < 1) {
448
+ const Y = edge.evaluate(tangentParameter);
449
+ const joint = wedge.leftArm.intersectionPoint(edge, halo);
450
+ side = new Line(joint, Y);
451
+ }
452
+ }
453
+ if (side === null) {
454
+ const circlesPoint = wedge.fitCircles(p2, halo);
455
+ if (circlesPoint !== null) {
456
+ let tangent;
457
+ if (wedge.isDegenerate) {
458
+ let sidedness = 0 /* Top */;
459
+ let k = 0;
460
+ while (sidedness === 0 /* Top */ && k < points.length) {
461
+ sidedness = circlesPoint[0].tangent.pointOnSide(points[k], halo);
462
+ k++;
463
+ }
464
+ tangent = circlesPoint[0].tangent.pointOnSide(circlesPoint[0].circle.centre, halo) !== sidedness ? circlesPoint[0].tangent : circlesPoint[1].tangent;
465
+ } else {
466
+ tangent = circlesPoint[0].tangent;
467
+ }
468
+ if (lineTangentToHull(tangent, points, halo).holds) {
469
+ const joint = wedge.leftArm.intersectionPoint(tangent, halo);
470
+ side = new Line(joint, p2);
471
+ }
472
+ }
473
+ }
474
+ stopVertex = vertex;
475
+ vertex--;
476
+ }
477
+ return side === null ? null : { side, stopVertex };
478
+ }
479
+ function findAntipode(points) {
480
+ let farthestIndex = 0;
481
+ let farthestDistribution = 0;
482
+ for (let index = 0, n = points.length; index < n; index++) {
483
+ const testDistribution = new Line(points[0], points[n - 1]).distanceToPoint(
484
+ points[index]
485
+ );
486
+ if (testDistribution > farthestDistribution) {
487
+ farthestDistribution = testDistribution;
488
+ farthestIndex = index;
489
+ }
490
+ }
491
+ return farthestIndex;
492
+ }
493
+ function minTriangleWithBase(convexHull, error, tol) {
494
+ let AB, AC;
495
+ const n = convexHull.length;
496
+ const BC = new Line(convexHull[0], convexHull[n - 1]);
497
+ const antipodIndex = findAntipode(convexHull);
498
+ const baseParallel = new Line(convexHull[antipodIndex], convexHull[antipodIndex].plus(BC.delta));
499
+ let wedge = Wedge.new(BC, baseParallel, error);
500
+ let Pn = n - 1;
501
+ let Qn = antipodIndex;
502
+ do {
503
+ const CQinfo = findEnclosingSide(wedge, Pn, antipodIndex, convexHull, error);
504
+ if (CQinfo === null) {
505
+ return null;
506
+ }
507
+ ({ side: AC, stopVertex: Pn } = CQinfo);
508
+ wedge = Wedge.new(wedge.leftArm, AC, error);
509
+ const BPinfo = findEnclosingSide(wedge, Qn, 0, convexHull, error);
510
+ if (BPinfo === null) {
511
+ return null;
512
+ }
513
+ ({ side: AB, stopVertex: Qn } = BPinfo);
514
+ wedge = Wedge.new(wedge.leftArm, AB, error);
515
+ } while (AB.length - AC.length > tol);
516
+ const A = AC.intersectionPoint(AB, 0);
517
+ const B = AB.start;
518
+ const C = AC.start;
519
+ return { A, B, C };
520
+ }
521
+ function minTriangle(convexHull, error, tol) {
522
+ if (convexHull.length < 3) {
523
+ return null;
524
+ }
525
+ if (convexHull.length === 3) {
526
+ return { A: convexHull[0], B: convexHull[1], C: convexHull[2] };
527
+ }
528
+ const points = convexHull.map((p) => new Vec2(p.x, p.y));
529
+ let A = null;
530
+ let B = null;
531
+ let C = null;
532
+ let perimeter = -1;
533
+ let rotations = 0;
534
+ while (rotations < points.length) {
535
+ if (rotations > 0) {
536
+ points.push(points.shift());
537
+ }
538
+ const triangle = minTriangleWithBase(points, error, tol);
539
+ if (triangle !== null) {
540
+ const { A: A1, B: B1, C: C1 } = triangle;
541
+ const perimeter1 = A1.minus(B1).norm + B1.minus(C1).norm + C1.minus(A1).norm;
542
+ if (perimeter1 < perimeter || perimeter === -1) {
543
+ [A, B, C] = [A1, B1, C1];
544
+ perimeter = perimeter1;
545
+ }
546
+ }
547
+ rotations++;
548
+ }
549
+ return perimeter === -1 ? null : {
550
+ A: { x: A.x, y: A.y },
551
+ B: { x: B.x, y: B.y },
552
+ C: { x: C.x, y: C.y }
553
+ };
554
+ }
555
+
556
+ export { lineTangentToHull, minTriangle, minTriangleWithBase };
557
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/line.ts","../../src/vec2.ts","../../src/inscribe.ts","../../src/index.ts"],"names":[],"mappings":"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"}