clipper2-ts 2.0.1-13 → 2.0.1-15

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,682 @@
1
+ // Adaptive precision geometric predicates ported from
2
+ // Jonathan Richard Shewchuk's predicates.c (public domain).
3
+ // https://www.cs.cmu.edu/~quake/robust.html
4
+
5
+ const EPSILON = 1.1102230246251565e-16; // 2^-53
6
+ const SPLITTER = 134217729; // 2^27 + 1
7
+
8
+ const resulterrbound = (3 + 8 * EPSILON) * EPSILON;
9
+ const ccwerrboundA = (3 + 16 * EPSILON) * EPSILON;
10
+ const ccwerrboundB = (2 + 12 * EPSILON) * EPSILON;
11
+ const ccwerrboundC = (9 + 64 * EPSILON) * EPSILON * EPSILON;
12
+ const iccerrboundA = (10 + 96 * EPSILON) * EPSILON;
13
+ const iccerrboundB = (4 + 48 * EPSILON) * EPSILON;
14
+ const iccerrboundC = (44 + 576 * EPSILON) * EPSILON * EPSILON;
15
+
16
+ // Pre-allocated working arrays for orient2d
17
+ const o2dB = new Float64Array(4);
18
+ const o2dC1 = new Float64Array(8);
19
+ const o2dC2 = new Float64Array(12);
20
+ const o2dD = new Float64Array(16);
21
+ const o2du = new Float64Array(4);
22
+
23
+ // Pre-allocated working arrays for incircle
24
+ const icbc = new Float64Array(4);
25
+ const icca = new Float64Array(4);
26
+ const icab = new Float64Array(4);
27
+ const icaa = new Float64Array(4);
28
+ const icbb = new Float64Array(4);
29
+ const iccc = new Float64Array(4);
30
+ const icu = new Float64Array(4);
31
+
32
+ const icaxtbc = new Float64Array(8);
33
+ const icaytbc = new Float64Array(8);
34
+ const icbxtca = new Float64Array(8);
35
+ const icbytca = new Float64Array(8);
36
+ const iccxtab = new Float64Array(8);
37
+ const iccytab = new Float64Array(8);
38
+ const icabt = new Float64Array(8);
39
+ const icbct = new Float64Array(8);
40
+ const iccat = new Float64Array(8);
41
+ const icabtt = new Float64Array(4);
42
+ const icbctt = new Float64Array(4);
43
+ const iccatt = new Float64Array(4);
44
+
45
+ const ic8 = new Float64Array(8);
46
+ const ic16 = new Float64Array(16);
47
+ const ic16b = new Float64Array(16);
48
+ const ic16c = new Float64Array(16);
49
+ const ic32 = new Float64Array(32);
50
+ const ic32b = new Float64Array(32);
51
+ const ic48 = new Float64Array(48);
52
+ const ic64 = new Float64Array(64);
53
+ let icfin = new Float64Array(1152);
54
+ let icfin2 = new Float64Array(1152);
55
+
56
+ // fast_expansion_sum_zeroelim from predicates.c
57
+ function expansionSum(
58
+ elen: number, e: Float64Array,
59
+ flen: number, f: Float64Array,
60
+ h: Float64Array
61
+ ): number {
62
+ let Q: number, Qnew: number, hh: number, bvirt: number;
63
+ let enow = e[0];
64
+ let fnow = f[0];
65
+ let eindex = 0;
66
+ let findex = 0;
67
+
68
+ if ((fnow > enow) === (fnow > -enow)) {
69
+ Q = enow; enow = e[++eindex];
70
+ } else {
71
+ Q = fnow; fnow = f[++findex];
72
+ }
73
+
74
+ let hindex = 0;
75
+ if (eindex < elen && findex < flen) {
76
+ if ((fnow > enow) === (fnow > -enow)) {
77
+ Qnew = enow + Q; hh = Q - (Qnew - enow); enow = e[++eindex];
78
+ } else {
79
+ Qnew = fnow + Q; hh = Q - (Qnew - fnow); fnow = f[++findex];
80
+ }
81
+ Q = Qnew;
82
+ if (hh !== 0) h[hindex++] = hh;
83
+
84
+ while (eindex < elen && findex < flen) {
85
+ if ((fnow > enow) === (fnow > -enow)) {
86
+ Qnew = Q + enow; bvirt = Qnew - Q;
87
+ hh = Q - (Qnew - bvirt) + (enow - bvirt); enow = e[++eindex];
88
+ } else {
89
+ Qnew = Q + fnow; bvirt = Qnew - Q;
90
+ hh = Q - (Qnew - bvirt) + (fnow - bvirt); fnow = f[++findex];
91
+ }
92
+ Q = Qnew;
93
+ if (hh !== 0) h[hindex++] = hh;
94
+ }
95
+ }
96
+
97
+ while (eindex < elen) {
98
+ Qnew = Q + enow; bvirt = Qnew - Q;
99
+ hh = Q - (Qnew - bvirt) + (enow - bvirt); enow = e[++eindex];
100
+ Q = Qnew;
101
+ if (hh !== 0) h[hindex++] = hh;
102
+ }
103
+
104
+ while (findex < flen) {
105
+ Qnew = Q + fnow; bvirt = Qnew - Q;
106
+ hh = Q - (Qnew - bvirt) + (fnow - bvirt); fnow = f[++findex];
107
+ Q = Qnew;
108
+ if (hh !== 0) h[hindex++] = hh;
109
+ }
110
+
111
+ if (Q !== 0 || hindex === 0) h[hindex++] = Q;
112
+ return hindex;
113
+ }
114
+
115
+ // scale_expansion_zeroelim from predicates.c
116
+ function scaleExpansion(
117
+ elen: number, e: Float64Array, b: number, h: Float64Array
118
+ ): number {
119
+ let Q: number, sum: number, hh: number, product1: number, product0: number;
120
+ let bvirt: number, c: number, ahi: number, alo: number, bhi: number, blo: number;
121
+
122
+ c = SPLITTER * b; bhi = c - (c - b); blo = b - bhi;
123
+ let enow = e[0];
124
+ Q = enow * b;
125
+ c = SPLITTER * enow; ahi = c - (c - enow); alo = enow - ahi;
126
+ hh = alo * blo - (Q - ahi * bhi - alo * bhi - ahi * blo);
127
+
128
+ let hindex = 0;
129
+ if (hh !== 0) h[hindex++] = hh;
130
+
131
+ for (let i = 1; i < elen; i++) {
132
+ enow = e[i];
133
+ product1 = enow * b;
134
+ c = SPLITTER * enow; ahi = c - (c - enow); alo = enow - ahi;
135
+ product0 = alo * blo - (product1 - ahi * bhi - alo * bhi - ahi * blo);
136
+
137
+ sum = Q + product0; bvirt = sum - Q;
138
+ hh = Q - (sum - bvirt) + (product0 - bvirt);
139
+ if (hh !== 0) h[hindex++] = hh;
140
+
141
+ Q = product1 + sum; hh = sum - (Q - product1);
142
+ if (hh !== 0) h[hindex++] = hh;
143
+ }
144
+
145
+ if (Q !== 0 || hindex === 0) h[hindex++] = Q;
146
+ return hindex;
147
+ }
148
+
149
+ function estimate(elen: number, e: Float64Array): number {
150
+ let Q = e[0];
151
+ for (let i = 1; i < elen; i++) Q += e[i];
152
+ return Q;
153
+ }
154
+
155
+ function orient2dadapt(
156
+ ax: number, ay: number, bx: number, by: number,
157
+ cx: number, cy: number, detsum: number
158
+ ): number {
159
+ let bvirt: number, c: number, ahi: number, alo: number, bhi: number, blo: number;
160
+ let _i: number, _j: number, _0: number, s1: number, s0: number, t1: number, t0: number, u3: number;
161
+ let acxtail: number, acytail: number, bcxtail: number, bcytail: number;
162
+
163
+ const acx = ax - cx, bcx = bx - cx, acy = ay - cy, bcy = by - cy;
164
+
165
+ s1 = acx * bcy; c = SPLITTER * acx; ahi = c - (c - acx); alo = acx - ahi;
166
+ c = SPLITTER * bcy; bhi = c - (c - bcy); blo = bcy - bhi;
167
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
168
+ t1 = acy * bcx; c = SPLITTER * acy; ahi = c - (c - acy); alo = acy - ahi;
169
+ c = SPLITTER * bcx; bhi = c - (c - bcx); blo = bcx - bhi;
170
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
171
+
172
+ _i = s0 - t0; bvirt = s0 - _i;
173
+ o2dB[0] = s0 - (_i + bvirt) + (bvirt - t0);
174
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
175
+ _i = _0 - t1; bvirt = _0 - _i;
176
+ o2dB[1] = _0 - (_i + bvirt) + (bvirt - t1);
177
+ u3 = _j + _i; bvirt = u3 - _j;
178
+ o2dB[2] = _j - (u3 - bvirt) + (_i - bvirt);
179
+ o2dB[3] = u3;
180
+
181
+ let det = estimate(4, o2dB);
182
+ let errbound = ccwerrboundB * detsum;
183
+ if (det >= errbound || -det >= errbound) return det;
184
+
185
+ bvirt = ax - acx; acxtail = ax - (acx + bvirt) + (bvirt - cx);
186
+ bvirt = bx - bcx; bcxtail = bx - (bcx + bvirt) + (bvirt - cx);
187
+ bvirt = ay - acy; acytail = ay - (acy + bvirt) + (bvirt - cy);
188
+ bvirt = by - bcy; bcytail = by - (bcy + bvirt) + (bvirt - cy);
189
+
190
+ if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) return det;
191
+
192
+ errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);
193
+ det += (acx * bcytail + bcy * acxtail) - (acy * bcxtail + bcx * acytail);
194
+ if (det >= errbound || -det >= errbound) return det;
195
+
196
+ s1 = acxtail * bcy; c = SPLITTER * acxtail; ahi = c - (c - acxtail); alo = acxtail - ahi;
197
+ c = SPLITTER * bcy; bhi = c - (c - bcy); blo = bcy - bhi;
198
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
199
+ t1 = acytail * bcx; c = SPLITTER * acytail; ahi = c - (c - acytail); alo = acytail - ahi;
200
+ c = SPLITTER * bcx; bhi = c - (c - bcx); blo = bcx - bhi;
201
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
202
+ _i = s0 - t0; bvirt = s0 - _i;
203
+ o2du[0] = s0 - (_i + bvirt) + (bvirt - t0);
204
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
205
+ _i = _0 - t1; bvirt = _0 - _i;
206
+ o2du[1] = _0 - (_i + bvirt) + (bvirt - t1);
207
+ u3 = _j + _i; bvirt = u3 - _j;
208
+ o2du[2] = _j - (u3 - bvirt) + (_i - bvirt); o2du[3] = u3;
209
+ const C1len = expansionSum(4, o2dB, 4, o2du, o2dC1);
210
+
211
+ s1 = acx * bcytail; c = SPLITTER * acx; ahi = c - (c - acx); alo = acx - ahi;
212
+ c = SPLITTER * bcytail; bhi = c - (c - bcytail); blo = bcytail - bhi;
213
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
214
+ t1 = acy * bcxtail; c = SPLITTER * acy; ahi = c - (c - acy); alo = acy - ahi;
215
+ c = SPLITTER * bcxtail; bhi = c - (c - bcxtail); blo = bcxtail - bhi;
216
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
217
+ _i = s0 - t0; bvirt = s0 - _i;
218
+ o2du[0] = s0 - (_i + bvirt) + (bvirt - t0);
219
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
220
+ _i = _0 - t1; bvirt = _0 - _i;
221
+ o2du[1] = _0 - (_i + bvirt) + (bvirt - t1);
222
+ u3 = _j + _i; bvirt = u3 - _j;
223
+ o2du[2] = _j - (u3 - bvirt) + (_i - bvirt); o2du[3] = u3;
224
+ const C2len = expansionSum(C1len, o2dC1, 4, o2du, o2dC2);
225
+
226
+ s1 = acxtail * bcytail; c = SPLITTER * acxtail; ahi = c - (c - acxtail); alo = acxtail - ahi;
227
+ c = SPLITTER * bcytail; bhi = c - (c - bcytail); blo = bcytail - bhi;
228
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
229
+ t1 = acytail * bcxtail; c = SPLITTER * acytail; ahi = c - (c - acytail); alo = acytail - ahi;
230
+ c = SPLITTER * bcxtail; bhi = c - (c - bcxtail); blo = bcxtail - bhi;
231
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
232
+ _i = s0 - t0; bvirt = s0 - _i;
233
+ o2du[0] = s0 - (_i + bvirt) + (bvirt - t0);
234
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
235
+ _i = _0 - t1; bvirt = _0 - _i;
236
+ o2du[1] = _0 - (_i + bvirt) + (bvirt - t1);
237
+ u3 = _j + _i; bvirt = u3 - _j;
238
+ o2du[2] = _j - (u3 - bvirt) + (_i - bvirt); o2du[3] = u3;
239
+ const Dlen = expansionSum(C2len, o2dC2, 4, o2du, o2dD);
240
+
241
+ return o2dD[Dlen - 1];
242
+ }
243
+
244
+ // Returns +1 (CCW), -1 (CW), or 0 (collinear)
245
+ export function orient2dSign(
246
+ ax: number, ay: number, bx: number, by: number,
247
+ cx: number, cy: number
248
+ ): number {
249
+ const detleft = (ax - cx) * (by - cy);
250
+ const detright = (ay - cy) * (bx - cx);
251
+ const det = detleft - detright;
252
+
253
+ if (detleft > 0) { if (detright <= 0) return det > 0 ? 1 : det < 0 ? -1 : 0; }
254
+ else if (detleft < 0) { if (detright >= 0) return det > 0 ? 1 : det < 0 ? -1 : 0; }
255
+ else { return det > 0 ? 1 : det < 0 ? -1 : 0; }
256
+
257
+ const detsum = detleft > 0 ? detleft + detright : -detleft - detright;
258
+ const errbound = ccwerrboundA * detsum;
259
+ if (det >= errbound || -det >= errbound) return det > 0 ? 1 : -1;
260
+
261
+ const result = orient2dadapt(ax, ay, bx, by, cx, cy, detsum);
262
+ return result > 0 ? 1 : result < 0 ? -1 : 0;
263
+ }
264
+
265
+ function icFinadd(finlen: number, alen: number, a: Float64Array): number {
266
+ finlen = expansionSum(finlen, icfin, alen, a, icfin2);
267
+ const tmp = icfin; icfin = icfin2; icfin2 = tmp;
268
+ return finlen;
269
+ }
270
+
271
+ function incircleadapt(
272
+ ax: number, ay: number, bx: number, by: number,
273
+ cx: number, cy: number, dx: number, dy: number,
274
+ permanent: number
275
+ ): number {
276
+ let bvirt: number, c: number, ahi: number, alo: number, bhi: number, blo: number;
277
+ let _i: number, _j: number, _0: number, s1: number, s0: number, t1: number, t0: number, u3: number;
278
+ let finlen: number;
279
+ let adxtail: number, bdxtail: number, cdxtail: number;
280
+ let adytail: number, bdytail: number, cdytail: number;
281
+ let axtbclen = 0, aytbclen = 0, bxtcalen = 0, bytcalen = 0, cxtablen = 0, cytablen = 0;
282
+ let n1: number, n0: number;
283
+
284
+ const adx = ax - dx, bdx = bx - dx, cdx = cx - dx;
285
+ const ady = ay - dy, bdy = by - dy, cdy = cy - dy;
286
+
287
+ s1 = bdx * cdy; c = SPLITTER * bdx; ahi = c - (c - bdx); alo = bdx - ahi;
288
+ c = SPLITTER * cdy; bhi = c - (c - cdy); blo = cdy - bhi;
289
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
290
+ t1 = cdx * bdy; c = SPLITTER * cdx; ahi = c - (c - cdx); alo = cdx - ahi;
291
+ c = SPLITTER * bdy; bhi = c - (c - bdy); blo = bdy - bhi;
292
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
293
+ _i = s0 - t0; bvirt = s0 - _i;
294
+ icbc[0] = s0 - (_i + bvirt) + (bvirt - t0);
295
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
296
+ _i = _0 - t1; bvirt = _0 - _i;
297
+ icbc[1] = _0 - (_i + bvirt) + (bvirt - t1);
298
+ u3 = _j + _i; bvirt = u3 - _j;
299
+ icbc[2] = _j - (u3 - bvirt) + (_i - bvirt); icbc[3] = u3;
300
+
301
+ s1 = cdx * ady; c = SPLITTER * cdx; ahi = c - (c - cdx); alo = cdx - ahi;
302
+ c = SPLITTER * ady; bhi = c - (c - ady); blo = ady - bhi;
303
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
304
+ t1 = adx * cdy; c = SPLITTER * adx; ahi = c - (c - adx); alo = adx - ahi;
305
+ c = SPLITTER * cdy; bhi = c - (c - cdy); blo = cdy - bhi;
306
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
307
+ _i = s0 - t0; bvirt = s0 - _i;
308
+ icca[0] = s0 - (_i + bvirt) + (bvirt - t0);
309
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
310
+ _i = _0 - t1; bvirt = _0 - _i;
311
+ icca[1] = _0 - (_i + bvirt) + (bvirt - t1);
312
+ u3 = _j + _i; bvirt = u3 - _j;
313
+ icca[2] = _j - (u3 - bvirt) + (_i - bvirt); icca[3] = u3;
314
+
315
+ s1 = adx * bdy; c = SPLITTER * adx; ahi = c - (c - adx); alo = adx - ahi;
316
+ c = SPLITTER * bdy; bhi = c - (c - bdy); blo = bdy - bhi;
317
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
318
+ t1 = bdx * ady; c = SPLITTER * bdx; ahi = c - (c - bdx); alo = bdx - ahi;
319
+ c = SPLITTER * ady; bhi = c - (c - ady); blo = ady - bhi;
320
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
321
+ _i = s0 - t0; bvirt = s0 - _i;
322
+ icab[0] = s0 - (_i + bvirt) + (bvirt - t0);
323
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
324
+ _i = _0 - t1; bvirt = _0 - _i;
325
+ icab[1] = _0 - (_i + bvirt) + (bvirt - t1);
326
+ u3 = _j + _i; bvirt = u3 - _j;
327
+ icab[2] = _j - (u3 - bvirt) + (_i - bvirt); icab[3] = u3;
328
+
329
+ finlen = expansionSum(
330
+ expansionSum(
331
+ expansionSum(
332
+ scaleExpansion(scaleExpansion(4, icbc, adx, ic8), ic8, adx, ic16), ic16,
333
+ scaleExpansion(scaleExpansion(4, icbc, ady, ic8), ic8, ady, ic16b), ic16b, ic32
334
+ ), ic32,
335
+ expansionSum(
336
+ scaleExpansion(scaleExpansion(4, icca, bdx, ic8), ic8, bdx, ic16), ic16,
337
+ scaleExpansion(scaleExpansion(4, icca, bdy, ic8), ic8, bdy, ic16b), ic16b, ic32b
338
+ ), ic32b, ic64
339
+ ), ic64,
340
+ expansionSum(
341
+ scaleExpansion(scaleExpansion(4, icab, cdx, ic8), ic8, cdx, ic16), ic16,
342
+ scaleExpansion(scaleExpansion(4, icab, cdy, ic8), ic8, cdy, ic16b), ic16b, ic32
343
+ ), ic32, icfin
344
+ );
345
+
346
+ let det = estimate(finlen, icfin);
347
+ let errbound = iccerrboundB * permanent;
348
+ if (det >= errbound || -det >= errbound) return det;
349
+
350
+ bvirt = ax - adx; adxtail = ax - (adx + bvirt) + (bvirt - dx);
351
+ bvirt = ay - ady; adytail = ay - (ady + bvirt) + (bvirt - dy);
352
+ bvirt = bx - bdx; bdxtail = bx - (bdx + bvirt) + (bvirt - dx);
353
+ bvirt = by - bdy; bdytail = by - (bdy + bvirt) + (bvirt - dy);
354
+ bvirt = cx - cdx; cdxtail = cx - (cdx + bvirt) + (bvirt - dx);
355
+ bvirt = cy - cdy; cdytail = cy - (cdy + bvirt) + (bvirt - dy);
356
+
357
+ if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 &&
358
+ adytail === 0 && bdytail === 0 && cdytail === 0) return det;
359
+
360
+ errbound = iccerrboundC * permanent + resulterrbound * Math.abs(det);
361
+ det += ((adx * adx + ady * ady) * ((bdx * cdytail + cdy * bdxtail) - (bdy * cdxtail + cdx * bdytail)) +
362
+ 2 * (adx * adxtail + ady * adytail) * (bdx * cdy - bdy * cdx)) +
363
+ ((bdx * bdx + bdy * bdy) * ((cdx * adytail + ady * cdxtail) - (cdy * adxtail + adx * cdytail)) +
364
+ 2 * (bdx * bdxtail + bdy * bdytail) * (cdx * ady - cdy * adx)) +
365
+ ((cdx * cdx + cdy * cdy) * ((adx * bdytail + bdy * adxtail) - (ady * bdxtail + bdx * adytail)) +
366
+ 2 * (cdx * cdxtail + cdy * cdytail) * (adx * bdy - ady * bdx));
367
+ if (det >= errbound || -det >= errbound) return det;
368
+
369
+ if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {
370
+ s1 = adx * adx; c = SPLITTER * adx; ahi = c - (c - adx); alo = adx - ahi;
371
+ s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);
372
+ t1 = ady * ady; c = SPLITTER * ady; ahi = c - (c - ady); alo = ady - ahi;
373
+ t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);
374
+ _i = s0 + t0; bvirt = _i - s0; icaa[0] = s0 - (_i - bvirt) + (t0 - bvirt);
375
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
376
+ _i = _0 + t1; bvirt = _i - _0; icaa[1] = _0 - (_i - bvirt) + (t1 - bvirt);
377
+ u3 = _j + _i; bvirt = u3 - _j; icaa[2] = _j - (u3 - bvirt) + (_i - bvirt); icaa[3] = u3;
378
+ }
379
+ if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {
380
+ s1 = bdx * bdx; c = SPLITTER * bdx; ahi = c - (c - bdx); alo = bdx - ahi;
381
+ s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);
382
+ t1 = bdy * bdy; c = SPLITTER * bdy; ahi = c - (c - bdy); alo = bdy - ahi;
383
+ t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);
384
+ _i = s0 + t0; bvirt = _i - s0; icbb[0] = s0 - (_i - bvirt) + (t0 - bvirt);
385
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
386
+ _i = _0 + t1; bvirt = _i - _0; icbb[1] = _0 - (_i - bvirt) + (t1 - bvirt);
387
+ u3 = _j + _i; bvirt = u3 - _j; icbb[2] = _j - (u3 - bvirt) + (_i - bvirt); icbb[3] = u3;
388
+ }
389
+ if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {
390
+ s1 = cdx * cdx; c = SPLITTER * cdx; ahi = c - (c - cdx); alo = cdx - ahi;
391
+ s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);
392
+ t1 = cdy * cdy; c = SPLITTER * cdy; ahi = c - (c - cdy); alo = cdy - ahi;
393
+ t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);
394
+ _i = s0 + t0; bvirt = _i - s0; iccc[0] = s0 - (_i - bvirt) + (t0 - bvirt);
395
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
396
+ _i = _0 + t1; bvirt = _i - _0; iccc[1] = _0 - (_i - bvirt) + (t1 - bvirt);
397
+ u3 = _j + _i; bvirt = u3 - _j; iccc[2] = _j - (u3 - bvirt) + (_i - bvirt); iccc[3] = u3;
398
+ }
399
+
400
+ const sum3 = (al: number, a: Float64Array, bl: number, b: Float64Array, cl: number, cv: Float64Array): number => {
401
+ const tl = expansionSum(al, a, bl, b, ic32);
402
+ return expansionSum(tl, ic32, cl, cv, ic48);
403
+ };
404
+
405
+ if (adxtail !== 0) {
406
+ axtbclen = scaleExpansion(4, icbc, adxtail, icaxtbc);
407
+ finlen = icFinadd(finlen, sum3(
408
+ scaleExpansion(axtbclen, icaxtbc, 2 * adx, ic16), ic16,
409
+ scaleExpansion(scaleExpansion(4, iccc, adxtail, ic8), ic8, bdy, ic16b), ic16b,
410
+ scaleExpansion(scaleExpansion(4, icbb, adxtail, ic8), ic8, -cdy, ic16c), ic16c), ic48);
411
+ }
412
+ if (adytail !== 0) {
413
+ aytbclen = scaleExpansion(4, icbc, adytail, icaytbc);
414
+ finlen = icFinadd(finlen, sum3(
415
+ scaleExpansion(aytbclen, icaytbc, 2 * ady, ic16), ic16,
416
+ scaleExpansion(scaleExpansion(4, icbb, adytail, ic8), ic8, cdx, ic16b), ic16b,
417
+ scaleExpansion(scaleExpansion(4, iccc, adytail, ic8), ic8, -bdx, ic16c), ic16c), ic48);
418
+ }
419
+ if (bdxtail !== 0) {
420
+ bxtcalen = scaleExpansion(4, icca, bdxtail, icbxtca);
421
+ finlen = icFinadd(finlen, sum3(
422
+ scaleExpansion(bxtcalen, icbxtca, 2 * bdx, ic16), ic16,
423
+ scaleExpansion(scaleExpansion(4, icaa, bdxtail, ic8), ic8, cdy, ic16b), ic16b,
424
+ scaleExpansion(scaleExpansion(4, iccc, bdxtail, ic8), ic8, -ady, ic16c), ic16c), ic48);
425
+ }
426
+ if (bdytail !== 0) {
427
+ bytcalen = scaleExpansion(4, icca, bdytail, icbytca);
428
+ finlen = icFinadd(finlen, sum3(
429
+ scaleExpansion(bytcalen, icbytca, 2 * bdy, ic16), ic16,
430
+ scaleExpansion(scaleExpansion(4, iccc, bdytail, ic8), ic8, adx, ic16b), ic16b,
431
+ scaleExpansion(scaleExpansion(4, icaa, bdytail, ic8), ic8, -cdx, ic16c), ic16c), ic48);
432
+ }
433
+ if (cdxtail !== 0) {
434
+ cxtablen = scaleExpansion(4, icab, cdxtail, iccxtab);
435
+ finlen = icFinadd(finlen, sum3(
436
+ scaleExpansion(cxtablen, iccxtab, 2 * cdx, ic16), ic16,
437
+ scaleExpansion(scaleExpansion(4, icbb, cdxtail, ic8), ic8, ady, ic16b), ic16b,
438
+ scaleExpansion(scaleExpansion(4, icaa, cdxtail, ic8), ic8, -bdy, ic16c), ic16c), ic48);
439
+ }
440
+ if (cdytail !== 0) {
441
+ cytablen = scaleExpansion(4, icab, cdytail, iccytab);
442
+ finlen = icFinadd(finlen, sum3(
443
+ scaleExpansion(cytablen, iccytab, 2 * cdy, ic16), ic16,
444
+ scaleExpansion(scaleExpansion(4, icaa, cdytail, ic8), ic8, bdx, ic16b), ic16b,
445
+ scaleExpansion(scaleExpansion(4, icbb, cdytail, ic8), ic8, -adx, ic16c), ic16c), ic48);
446
+ }
447
+
448
+ const icv = new Float64Array(4);
449
+ let bctlen: number, catlen: number, abtlen: number;
450
+ let bcttlen: number, cattlen: number, abttlen: number;
451
+
452
+ if (adxtail !== 0 || adytail !== 0) {
453
+ if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {
454
+ s1 = bdxtail * cdy; c = SPLITTER * bdxtail; ahi = c - (c - bdxtail); alo = bdxtail - ahi;
455
+ c = SPLITTER * cdy; bhi = c - (c - cdy); blo = cdy - bhi;
456
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
457
+ t1 = bdx * cdytail; c = SPLITTER * bdx; ahi = c - (c - bdx); alo = bdx - ahi;
458
+ c = SPLITTER * cdytail; bhi = c - (c - cdytail); blo = cdytail - bhi;
459
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
460
+ _i = s0 + t0; bvirt = _i - s0; icu[0] = s0 - (_i - bvirt) + (t0 - bvirt);
461
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
462
+ _i = _0 + t1; bvirt = _i - _0; icu[1] = _0 - (_i - bvirt) + (t1 - bvirt);
463
+ u3 = _j + _i; bvirt = u3 - _j; icu[2] = _j - (u3 - bvirt) + (_i - bvirt); icu[3] = u3;
464
+
465
+ n1 = -bdy; n0 = -bdytail;
466
+ s1 = cdxtail * n1; c = SPLITTER * cdxtail; ahi = c - (c - cdxtail); alo = cdxtail - ahi;
467
+ c = SPLITTER * n1; bhi = c - (c - n1); blo = n1 - bhi;
468
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
469
+ t1 = cdx * n0; c = SPLITTER * cdx; ahi = c - (c - cdx); alo = cdx - ahi;
470
+ c = SPLITTER * n0; bhi = c - (c - n0); blo = n0 - bhi;
471
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
472
+ _i = s0 + t0; bvirt = _i - s0; icv[0] = s0 - (_i - bvirt) + (t0 - bvirt);
473
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
474
+ _i = _0 + t1; bvirt = _i - _0; icv[1] = _0 - (_i - bvirt) + (t1 - bvirt);
475
+ u3 = _j + _i; bvirt = u3 - _j; icv[2] = _j - (u3 - bvirt) + (_i - bvirt); icv[3] = u3;
476
+ bctlen = expansionSum(4, icu, 4, icv, icbct);
477
+
478
+ s1 = bdxtail * cdytail; c = SPLITTER * bdxtail; ahi = c - (c - bdxtail); alo = bdxtail - ahi;
479
+ c = SPLITTER * cdytail; bhi = c - (c - cdytail); blo = cdytail - bhi;
480
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
481
+ t1 = cdxtail * bdytail; c = SPLITTER * cdxtail; ahi = c - (c - cdxtail); alo = cdxtail - ahi;
482
+ c = SPLITTER * bdytail; bhi = c - (c - bdytail); blo = bdytail - bhi;
483
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
484
+ _i = s0 - t0; bvirt = s0 - _i;
485
+ icbctt[0] = s0 - (_i + bvirt) + (bvirt - t0);
486
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
487
+ _i = _0 - t1; bvirt = _0 - _i;
488
+ icbctt[1] = _0 - (_i + bvirt) + (bvirt - t1);
489
+ u3 = _j + _i; bvirt = u3 - _j; icbctt[2] = _j - (u3 - bvirt) + (_i - bvirt); icbctt[3] = u3;
490
+ bcttlen = 4;
491
+ } else { icbct[0] = 0; bctlen = 1; icbctt[0] = 0; bcttlen = 1; }
492
+
493
+ if (adxtail !== 0) {
494
+ const len = scaleExpansion(bctlen, icbct, adxtail, ic16c);
495
+ finlen = icFinadd(finlen, expansionSum(
496
+ scaleExpansion(axtbclen, icaxtbc, adxtail, ic16), ic16,
497
+ scaleExpansion(len, ic16c, 2 * adx, ic32), ic32, ic48), ic48);
498
+ const len2 = scaleExpansion(bcttlen, icbctt, adxtail, ic8);
499
+ const t32bl = expansionSum(scaleExpansion(len2, ic8, 2 * adx, ic16), ic16,
500
+ scaleExpansion(len2, ic8, adxtail, ic16b), ic16b, ic32b);
501
+ finlen = icFinadd(finlen, expansionSum(
502
+ scaleExpansion(len, ic16c, adxtail, ic32), ic32, t32bl, ic32b, ic64), ic64);
503
+ if (bdytail !== 0) finlen = icFinadd(finlen, scaleExpansion(scaleExpansion(4, iccc, adxtail, ic8), ic8, bdytail, ic16), ic16);
504
+ if (cdytail !== 0) finlen = icFinadd(finlen, scaleExpansion(scaleExpansion(4, icbb, -adxtail, ic8), ic8, cdytail, ic16), ic16);
505
+ }
506
+ if (adytail !== 0) {
507
+ const len = scaleExpansion(bctlen, icbct, adytail, ic16c);
508
+ finlen = icFinadd(finlen, expansionSum(
509
+ scaleExpansion(aytbclen, icaytbc, adytail, ic16), ic16,
510
+ scaleExpansion(len, ic16c, 2 * ady, ic32), ic32, ic48), ic48);
511
+ const len2 = scaleExpansion(bcttlen, icbctt, adytail, ic8);
512
+ const t32bl = expansionSum(scaleExpansion(len2, ic8, 2 * ady, ic16), ic16,
513
+ scaleExpansion(len2, ic8, adytail, ic16b), ic16b, ic32b);
514
+ finlen = icFinadd(finlen, expansionSum(
515
+ scaleExpansion(len, ic16c, adytail, ic32), ic32, t32bl, ic32b, ic64), ic64);
516
+ }
517
+ }
518
+
519
+ if (bdxtail !== 0 || bdytail !== 0) {
520
+ if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {
521
+ s1 = cdxtail * ady; c = SPLITTER * cdxtail; ahi = c - (c - cdxtail); alo = cdxtail - ahi;
522
+ c = SPLITTER * ady; bhi = c - (c - ady); blo = ady - bhi;
523
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
524
+ t1 = cdx * adytail; c = SPLITTER * cdx; ahi = c - (c - cdx); alo = cdx - ahi;
525
+ c = SPLITTER * adytail; bhi = c - (c - adytail); blo = adytail - bhi;
526
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
527
+ _i = s0 + t0; bvirt = _i - s0; icu[0] = s0 - (_i - bvirt) + (t0 - bvirt);
528
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
529
+ _i = _0 + t1; bvirt = _i - _0; icu[1] = _0 - (_i - bvirt) + (t1 - bvirt);
530
+ u3 = _j + _i; bvirt = u3 - _j; icu[2] = _j - (u3 - bvirt) + (_i - bvirt); icu[3] = u3;
531
+
532
+ n1 = -cdy; n0 = -cdytail;
533
+ s1 = adxtail * n1; c = SPLITTER * adxtail; ahi = c - (c - adxtail); alo = adxtail - ahi;
534
+ c = SPLITTER * n1; bhi = c - (c - n1); blo = n1 - bhi;
535
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
536
+ t1 = adx * n0; c = SPLITTER * adx; ahi = c - (c - adx); alo = adx - ahi;
537
+ c = SPLITTER * n0; bhi = c - (c - n0); blo = n0 - bhi;
538
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
539
+ _i = s0 + t0; bvirt = _i - s0; icv[0] = s0 - (_i - bvirt) + (t0 - bvirt);
540
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
541
+ _i = _0 + t1; bvirt = _i - _0; icv[1] = _0 - (_i - bvirt) + (t1 - bvirt);
542
+ u3 = _j + _i; bvirt = u3 - _j; icv[2] = _j - (u3 - bvirt) + (_i - bvirt); icv[3] = u3;
543
+ catlen = expansionSum(4, icu, 4, icv, iccat);
544
+
545
+ s1 = cdxtail * adytail; c = SPLITTER * cdxtail; ahi = c - (c - cdxtail); alo = cdxtail - ahi;
546
+ c = SPLITTER * adytail; bhi = c - (c - adytail); blo = adytail - bhi;
547
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
548
+ t1 = adxtail * cdytail; c = SPLITTER * adxtail; ahi = c - (c - adxtail); alo = adxtail - ahi;
549
+ c = SPLITTER * cdytail; bhi = c - (c - cdytail); blo = cdytail - bhi;
550
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
551
+ _i = s0 - t0; bvirt = s0 - _i;
552
+ iccatt[0] = s0 - (_i + bvirt) + (bvirt - t0);
553
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
554
+ _i = _0 - t1; bvirt = _0 - _i;
555
+ iccatt[1] = _0 - (_i + bvirt) + (bvirt - t1);
556
+ u3 = _j + _i; bvirt = u3 - _j; iccatt[2] = _j - (u3 - bvirt) + (_i - bvirt); iccatt[3] = u3;
557
+ cattlen = 4;
558
+ } else { iccat[0] = 0; catlen = 1; iccatt[0] = 0; cattlen = 1; }
559
+
560
+ if (bdxtail !== 0) {
561
+ const len = scaleExpansion(catlen, iccat, bdxtail, ic16c);
562
+ finlen = icFinadd(finlen, expansionSum(
563
+ scaleExpansion(bxtcalen, icbxtca, bdxtail, ic16), ic16,
564
+ scaleExpansion(len, ic16c, 2 * bdx, ic32), ic32, ic48), ic48);
565
+ const len2 = scaleExpansion(cattlen, iccatt, bdxtail, ic8);
566
+ const t32bl = expansionSum(scaleExpansion(len2, ic8, 2 * bdx, ic16), ic16,
567
+ scaleExpansion(len2, ic8, bdxtail, ic16b), ic16b, ic32b);
568
+ finlen = icFinadd(finlen, expansionSum(
569
+ scaleExpansion(len, ic16c, bdxtail, ic32), ic32, t32bl, ic32b, ic64), ic64);
570
+ if (cdytail !== 0) finlen = icFinadd(finlen, scaleExpansion(scaleExpansion(4, icaa, bdxtail, ic8), ic8, cdytail, ic16), ic16);
571
+ if (adytail !== 0) finlen = icFinadd(finlen, scaleExpansion(scaleExpansion(4, iccc, -bdxtail, ic8), ic8, adytail, ic16), ic16);
572
+ }
573
+ if (bdytail !== 0) {
574
+ const len = scaleExpansion(catlen, iccat, bdytail, ic16c);
575
+ finlen = icFinadd(finlen, expansionSum(
576
+ scaleExpansion(bytcalen, icbytca, bdytail, ic16), ic16,
577
+ scaleExpansion(len, ic16c, 2 * bdy, ic32), ic32, ic48), ic48);
578
+ const len2 = scaleExpansion(cattlen, iccatt, bdytail, ic8);
579
+ const t32bl = expansionSum(scaleExpansion(len2, ic8, 2 * bdy, ic16), ic16,
580
+ scaleExpansion(len2, ic8, bdytail, ic16b), ic16b, ic32b);
581
+ finlen = icFinadd(finlen, expansionSum(
582
+ scaleExpansion(len, ic16c, bdytail, ic32), ic32, t32bl, ic32b, ic64), ic64);
583
+ }
584
+ }
585
+
586
+ if (cdxtail !== 0 || cdytail !== 0) {
587
+ if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {
588
+ s1 = adxtail * bdy; c = SPLITTER * adxtail; ahi = c - (c - adxtail); alo = adxtail - ahi;
589
+ c = SPLITTER * bdy; bhi = c - (c - bdy); blo = bdy - bhi;
590
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
591
+ t1 = adx * bdytail; c = SPLITTER * adx; ahi = c - (c - adx); alo = adx - ahi;
592
+ c = SPLITTER * bdytail; bhi = c - (c - bdytail); blo = bdytail - bhi;
593
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
594
+ _i = s0 + t0; bvirt = _i - s0; icu[0] = s0 - (_i - bvirt) + (t0 - bvirt);
595
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
596
+ _i = _0 + t1; bvirt = _i - _0; icu[1] = _0 - (_i - bvirt) + (t1 - bvirt);
597
+ u3 = _j + _i; bvirt = u3 - _j; icu[2] = _j - (u3 - bvirt) + (_i - bvirt); icu[3] = u3;
598
+
599
+ n1 = -ady; n0 = -adytail;
600
+ s1 = bdxtail * n1; c = SPLITTER * bdxtail; ahi = c - (c - bdxtail); alo = bdxtail - ahi;
601
+ c = SPLITTER * n1; bhi = c - (c - n1); blo = n1 - bhi;
602
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
603
+ t1 = bdx * n0; c = SPLITTER * bdx; ahi = c - (c - bdx); alo = bdx - ahi;
604
+ c = SPLITTER * n0; bhi = c - (c - n0); blo = n0 - bhi;
605
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
606
+ _i = s0 + t0; bvirt = _i - s0; icv[0] = s0 - (_i - bvirt) + (t0 - bvirt);
607
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
608
+ _i = _0 + t1; bvirt = _i - _0; icv[1] = _0 - (_i - bvirt) + (t1 - bvirt);
609
+ u3 = _j + _i; bvirt = u3 - _j; icv[2] = _j - (u3 - bvirt) + (_i - bvirt); icv[3] = u3;
610
+ abtlen = expansionSum(4, icu, 4, icv, icabt);
611
+
612
+ s1 = adxtail * bdytail; c = SPLITTER * adxtail; ahi = c - (c - adxtail); alo = adxtail - ahi;
613
+ c = SPLITTER * bdytail; bhi = c - (c - bdytail); blo = bdytail - bhi;
614
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
615
+ t1 = bdxtail * adytail; c = SPLITTER * bdxtail; ahi = c - (c - bdxtail); alo = bdxtail - ahi;
616
+ c = SPLITTER * adytail; bhi = c - (c - adytail); blo = adytail - bhi;
617
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
618
+ _i = s0 - t0; bvirt = s0 - _i;
619
+ icabtt[0] = s0 - (_i + bvirt) + (bvirt - t0);
620
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
621
+ _i = _0 - t1; bvirt = _0 - _i;
622
+ icabtt[1] = _0 - (_i + bvirt) + (bvirt - t1);
623
+ u3 = _j + _i; bvirt = u3 - _j; icabtt[2] = _j - (u3 - bvirt) + (_i - bvirt); icabtt[3] = u3;
624
+ abttlen = 4;
625
+ } else { icabt[0] = 0; abtlen = 1; icabtt[0] = 0; abttlen = 1; }
626
+
627
+ if (cdxtail !== 0) {
628
+ const len = scaleExpansion(abtlen, icabt, cdxtail, ic16c);
629
+ finlen = icFinadd(finlen, expansionSum(
630
+ scaleExpansion(cxtablen, iccxtab, cdxtail, ic16), ic16,
631
+ scaleExpansion(len, ic16c, 2 * cdx, ic32), ic32, ic48), ic48);
632
+ const len2 = scaleExpansion(abttlen, icabtt, cdxtail, ic8);
633
+ const t32bl = expansionSum(scaleExpansion(len2, ic8, 2 * cdx, ic16), ic16,
634
+ scaleExpansion(len2, ic8, cdxtail, ic16b), ic16b, ic32b);
635
+ finlen = icFinadd(finlen, expansionSum(
636
+ scaleExpansion(len, ic16c, cdxtail, ic32), ic32, t32bl, ic32b, ic64), ic64);
637
+ if (adytail !== 0) finlen = icFinadd(finlen, scaleExpansion(scaleExpansion(4, icbb, cdxtail, ic8), ic8, adytail, ic16), ic16);
638
+ if (bdytail !== 0) finlen = icFinadd(finlen, scaleExpansion(scaleExpansion(4, icaa, -cdxtail, ic8), ic8, bdytail, ic16), ic16);
639
+ }
640
+ if (cdytail !== 0) {
641
+ const len = scaleExpansion(abtlen, icabt, cdytail, ic16c);
642
+ finlen = icFinadd(finlen, expansionSum(
643
+ scaleExpansion(cytablen, iccytab, cdytail, ic16), ic16,
644
+ scaleExpansion(len, ic16c, 2 * cdy, ic32), ic32, ic48), ic48);
645
+ const len2 = scaleExpansion(abttlen, icabtt, cdytail, ic8);
646
+ const t32bl = expansionSum(scaleExpansion(len2, ic8, 2 * cdy, ic16), ic16,
647
+ scaleExpansion(len2, ic8, cdytail, ic16b), ic16b, ic32b);
648
+ finlen = icFinadd(finlen, expansionSum(
649
+ scaleExpansion(len, ic16c, cdytail, ic32), ic32, t32bl, ic32b, ic64), ic64);
650
+ }
651
+ }
652
+
653
+ return icfin[finlen - 1];
654
+ }
655
+
656
+ // Returns +1 (inside), -1 (outside), or 0 (on circle)
657
+ // Points a,b,c must be in CCW order
658
+ export function incircleSign(
659
+ ax: number, ay: number, bx: number, by: number,
660
+ cx: number, cy: number, dx: number, dy: number
661
+ ): number {
662
+ const adx = ax - dx, bdx = bx - dx, cdx = cx - dx;
663
+ const ady = ay - dy, bdy = by - dy, cdy = cy - dy;
664
+
665
+ const bdxcdy = bdx * cdy, cdxbdy = cdx * bdy;
666
+ const alift = adx * adx + ady * ady;
667
+ const cdxady = cdx * ady, adxcdy = adx * cdy;
668
+ const blift = bdx * bdx + bdy * bdy;
669
+ const adxbdy = adx * bdy, bdxady = bdx * ady;
670
+ const clift = cdx * cdx + cdy * cdy;
671
+
672
+ const det = alift * (bdxcdy - cdxbdy) + blift * (cdxady - adxcdy) + clift * (adxbdy - bdxady);
673
+ const permanent = (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * alift +
674
+ (Math.abs(cdxady) + Math.abs(adxcdy)) * blift +
675
+ (Math.abs(adxbdy) + Math.abs(bdxady)) * clift;
676
+
677
+ const errbound = iccerrboundA * permanent;
678
+ if (det > errbound || -det > errbound) return det > 0 ? 1 : -1;
679
+
680
+ const result = incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent);
681
+ return result > 0 ? 1 : result < 0 ? -1 : 0;
682
+ }