@escapace/minimum-perimeter-triangle 0.2.4 → 0.2.6
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 +2 -1
- package/lib/neutral/index.js +557 -0
- package/lib/neutral/index.js.map +1 -0
- package/lib/types/index.d.ts +2 -2
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/inscribe.d.ts +11 -10
- package/lib/types/inscribe.d.ts.map +1 -1
- package/lib/types/line.d.ts +17 -17
- package/lib/types/line.d.ts.map +1 -1
- package/lib/types/vec2.d.ts +13 -13
- package/lib/types/vec2.d.ts.map +1 -1
- package/package.json +39 -42
- package/lib/esm/index.mjs +0 -399
- package/lib/esm/index.mjs.map +0 -7
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
|
|
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
|
|
@@ -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"],"sourcesContent":null,"names":[],"mappings":"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"}
|
package/lib/types/index.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export declare function lineTangentToHull(line: Line, points: Vec2[], halo: numb
|
|
|
11
11
|
* http://scholar.uwindsor.ca/cgi/viewcontent.cgi?article=2527&context=etd
|
|
12
12
|
* starting from p. 22; In the notation of the generic algorithm BC is fixed
|
|
13
13
|
*/
|
|
14
|
-
export declare function minTriangleWithBase(convexHull: Vec2[],
|
|
14
|
+
export declare function minTriangleWithBase(convexHull: Vec2[], error: number, tol: number): {
|
|
15
15
|
A: Vec2;
|
|
16
16
|
B: Vec2;
|
|
17
17
|
C: Vec2;
|
|
@@ -19,7 +19,7 @@ export declare function minTriangleWithBase(convexHull: Vec2[], err: number, tol
|
|
|
19
19
|
export declare function minTriangle(convexHull: Array<{
|
|
20
20
|
x: number;
|
|
21
21
|
y: number;
|
|
22
|
-
}>,
|
|
22
|
+
}>, error: number, tol: number): {
|
|
23
23
|
A: {
|
|
24
24
|
x: number;
|
|
25
25
|
y: number;
|
package/lib/types/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAQ,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE7B,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,IAAI,EAAE,EACd,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAsBlC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAQ,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE7B,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,IAAI,EAAE,EACd,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAsBlC;AA6HD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,IAAI,EAAE,EAClB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV;IAAE,CAAC,EAAE,IAAI,CAAC;IAAC,CAAC,EAAE,IAAI,CAAC;IAAC,CAAC,EAAE,IAAI,CAAA;CAAE,GAAG,IAAI,CAoDtC;AAED,wBAAgB,WAAW,CACzB,UAAU,EAAE,KAAK,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAC3C,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV;IACD,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC3B,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC3B,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC5B,GAAG,IAAI,CAgDP"}
|