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,690 @@
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
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
+ const icbc = new Float64Array(4);
24
+ const icca = new Float64Array(4);
25
+ const icab = new Float64Array(4);
26
+ const icaa = new Float64Array(4);
27
+ const icbb = new Float64Array(4);
28
+ const iccc = new Float64Array(4);
29
+ const icu = new Float64Array(4);
30
+
31
+ const icaxtbc = new Float64Array(8);
32
+ const icaytbc = new Float64Array(8);
33
+ const icbxtca = new Float64Array(8);
34
+ const icbytca = new Float64Array(8);
35
+ const iccxtab = new Float64Array(8);
36
+ const iccytab = new Float64Array(8);
37
+ const icabt = new Float64Array(8);
38
+ const icbct = new Float64Array(8);
39
+ const iccat = new Float64Array(8);
40
+ const icabtt = new Float64Array(4);
41
+ const icbctt = new Float64Array(4);
42
+ const iccatt = new Float64Array(4);
43
+
44
+ const ic8 = new Float64Array(8);
45
+ const ic16 = new Float64Array(16);
46
+ const ic16b = new Float64Array(16);
47
+ const ic16c = new Float64Array(16);
48
+ const ic32 = new Float64Array(32);
49
+ const ic32b = new Float64Array(32);
50
+ const ic48 = new Float64Array(48);
51
+ const ic64 = new Float64Array(64);
52
+ const icv = new Float64Array(4);
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
+ // orient2d
156
+
157
+ function orient2dadapt(
158
+ ax: number, ay: number, bx: number, by: number,
159
+ cx: number, cy: number, detsum: number
160
+ ): number {
161
+ let bvirt: number, c: number, ahi: number, alo: number, bhi: number, blo: number;
162
+ let _i: number, _j: number, _0: number, s1: number, s0: number, t1: number, t0: number, u3: number;
163
+ let acxtail: number, acytail: number, bcxtail: number, bcytail: number;
164
+
165
+ const acx = ax - cx, bcx = bx - cx, acy = ay - cy, bcy = by - cy;
166
+
167
+ s1 = acx * bcy; c = SPLITTER * acx; ahi = c - (c - acx); alo = acx - ahi;
168
+ c = SPLITTER * bcy; bhi = c - (c - bcy); blo = bcy - bhi;
169
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
170
+ t1 = acy * bcx; c = SPLITTER * acy; ahi = c - (c - acy); alo = acy - ahi;
171
+ c = SPLITTER * bcx; bhi = c - (c - bcx); blo = bcx - bhi;
172
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
173
+
174
+ _i = s0 - t0; bvirt = s0 - _i;
175
+ o2dB[0] = s0 - (_i + bvirt) + (bvirt - t0);
176
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
177
+ _i = _0 - t1; bvirt = _0 - _i;
178
+ o2dB[1] = _0 - (_i + bvirt) + (bvirt - t1);
179
+ u3 = _j + _i; bvirt = u3 - _j;
180
+ o2dB[2] = _j - (u3 - bvirt) + (_i - bvirt);
181
+ o2dB[3] = u3;
182
+
183
+ let det = estimate(4, o2dB);
184
+ let errbound = ccwerrboundB * detsum;
185
+ if (det >= errbound || -det >= errbound) return det;
186
+
187
+ bvirt = ax - acx; acxtail = ax - (acx + bvirt) + (bvirt - cx);
188
+ bvirt = bx - bcx; bcxtail = bx - (bcx + bvirt) + (bvirt - cx);
189
+ bvirt = ay - acy; acytail = ay - (acy + bvirt) + (bvirt - cy);
190
+ bvirt = by - bcy; bcytail = by - (bcy + bvirt) + (bvirt - cy);
191
+
192
+ if (acxtail === 0 && acytail === 0 && bcxtail === 0 && bcytail === 0) return det;
193
+
194
+ errbound = ccwerrboundC * detsum + resulterrbound * Math.abs(det);
195
+ det += (acx * bcytail + bcy * acxtail) - (acy * bcxtail + bcx * acytail);
196
+ if (det >= errbound || -det >= errbound) return det;
197
+
198
+ s1 = acxtail * bcy; c = SPLITTER * acxtail; ahi = c - (c - acxtail); alo = acxtail - ahi;
199
+ c = SPLITTER * bcy; bhi = c - (c - bcy); blo = bcy - bhi;
200
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
201
+ t1 = acytail * bcx; c = SPLITTER * acytail; ahi = c - (c - acytail); alo = acytail - ahi;
202
+ c = SPLITTER * bcx; bhi = c - (c - bcx); blo = bcx - bhi;
203
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
204
+ _i = s0 - t0; bvirt = s0 - _i;
205
+ o2du[0] = s0 - (_i + bvirt) + (bvirt - t0);
206
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
207
+ _i = _0 - t1; bvirt = _0 - _i;
208
+ o2du[1] = _0 - (_i + bvirt) + (bvirt - t1);
209
+ u3 = _j + _i; bvirt = u3 - _j;
210
+ o2du[2] = _j - (u3 - bvirt) + (_i - bvirt); o2du[3] = u3;
211
+ const C1len = expansionSum(4, o2dB, 4, o2du, o2dC1);
212
+
213
+ s1 = acx * bcytail; c = SPLITTER * acx; ahi = c - (c - acx); alo = acx - ahi;
214
+ c = SPLITTER * bcytail; bhi = c - (c - bcytail); blo = bcytail - bhi;
215
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
216
+ t1 = acy * bcxtail; c = SPLITTER * acy; ahi = c - (c - acy); alo = acy - ahi;
217
+ c = SPLITTER * bcxtail; bhi = c - (c - bcxtail); blo = bcxtail - bhi;
218
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
219
+ _i = s0 - t0; bvirt = s0 - _i;
220
+ o2du[0] = s0 - (_i + bvirt) + (bvirt - t0);
221
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
222
+ _i = _0 - t1; bvirt = _0 - _i;
223
+ o2du[1] = _0 - (_i + bvirt) + (bvirt - t1);
224
+ u3 = _j + _i; bvirt = u3 - _j;
225
+ o2du[2] = _j - (u3 - bvirt) + (_i - bvirt); o2du[3] = u3;
226
+ const C2len = expansionSum(C1len, o2dC1, 4, o2du, o2dC2);
227
+
228
+ s1 = acxtail * bcytail; c = SPLITTER * acxtail; ahi = c - (c - acxtail); alo = acxtail - ahi;
229
+ c = SPLITTER * bcytail; bhi = c - (c - bcytail); blo = bcytail - bhi;
230
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
231
+ t1 = acytail * bcxtail; c = SPLITTER * acytail; ahi = c - (c - acytail); alo = acytail - ahi;
232
+ c = SPLITTER * bcxtail; bhi = c - (c - bcxtail); blo = bcxtail - bhi;
233
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
234
+ _i = s0 - t0; bvirt = s0 - _i;
235
+ o2du[0] = s0 - (_i + bvirt) + (bvirt - t0);
236
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
237
+ _i = _0 - t1; bvirt = _0 - _i;
238
+ o2du[1] = _0 - (_i + bvirt) + (bvirt - t1);
239
+ u3 = _j + _i; bvirt = u3 - _j;
240
+ o2du[2] = _j - (u3 - bvirt) + (_i - bvirt); o2du[3] = u3;
241
+ const Dlen = expansionSum(C2len, o2dC2, 4, o2du, o2dD);
242
+
243
+ return o2dD[Dlen - 1];
244
+ }
245
+
246
+ // orient2d sign, with adaptive exact fallback
247
+ export function adaptiveOrient2dSign(
248
+ ax: number, ay: number, bx: number, by: number,
249
+ cx: number, cy: number
250
+ ): number {
251
+ const detleft = (ay - cy) * (bx - cx);
252
+ const detright = (ax - cx) * (by - cy);
253
+ const det = detleft - detright;
254
+
255
+ if (detleft > 0) { if (detright <= 0) return det > 0 ? 1 : det < 0 ? -1 : 0; }
256
+ else if (detleft < 0) { if (detright >= 0) return det > 0 ? 1 : det < 0 ? -1 : 0; }
257
+ else { return det > 0 ? 1 : det < 0 ? -1 : 0; }
258
+
259
+ const detsum = detleft > 0 ? detleft + detright : -detleft - detright;
260
+ const errbound = ccwerrboundA * detsum;
261
+ if (det >= errbound || -det >= errbound) return det > 0 ? 1 : -1;
262
+
263
+ const result = orient2dadapt(ax, ay, bx, by, cx, cy, detsum);
264
+ return result > 0 ? 1 : result < 0 ? -1 : 0;
265
+ }
266
+
267
+ // incircle
268
+
269
+ function icFinadd(finlen: number, alen: number, a: Float64Array): number {
270
+ finlen = expansionSum(finlen, icfin, alen, a, icfin2);
271
+ const tmp = icfin; icfin = icfin2; icfin2 = tmp;
272
+ return finlen;
273
+ }
274
+
275
+ function incircleadapt(
276
+ ax: number, ay: number, bx: number, by: number,
277
+ cx: number, cy: number, dx: number, dy: number,
278
+ permanent: number
279
+ ): number {
280
+ let bvirt: number, c: number, ahi: number, alo: number, bhi: number, blo: number;
281
+ let _i: number, _j: number, _0: number, s1: number, s0: number, t1: number, t0: number, u3: number;
282
+ let finlen: number;
283
+ let adxtail: number, bdxtail: number, cdxtail: number;
284
+ let adytail: number, bdytail: number, cdytail: number;
285
+ let axtbclen = 0, aytbclen = 0, bxtcalen = 0, bytcalen = 0, cxtablen = 0, cytablen = 0;
286
+ let n1: number, n0: number;
287
+
288
+ const adx = ax - dx, bdx = bx - dx, cdx = cx - dx;
289
+ const ady = ay - dy, bdy = by - dy, cdy = cy - dy;
290
+
291
+ // bc = bdx*cdy - cdx*bdy as exact expansion
292
+ s1 = bdx * cdy; c = SPLITTER * bdx; ahi = c - (c - bdx); alo = bdx - ahi;
293
+ c = SPLITTER * cdy; bhi = c - (c - cdy); blo = cdy - bhi;
294
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
295
+ t1 = cdx * bdy; c = SPLITTER * cdx; ahi = c - (c - cdx); alo = cdx - ahi;
296
+ c = SPLITTER * bdy; bhi = c - (c - bdy); blo = bdy - bhi;
297
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
298
+ _i = s0 - t0; bvirt = s0 - _i;
299
+ icbc[0] = s0 - (_i + bvirt) + (bvirt - t0);
300
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
301
+ _i = _0 - t1; bvirt = _0 - _i;
302
+ icbc[1] = _0 - (_i + bvirt) + (bvirt - t1);
303
+ u3 = _j + _i; bvirt = u3 - _j;
304
+ icbc[2] = _j - (u3 - bvirt) + (_i - bvirt); icbc[3] = u3;
305
+
306
+ // ca = cdx*ady - adx*cdy
307
+ s1 = cdx * ady; c = SPLITTER * cdx; ahi = c - (c - cdx); alo = cdx - ahi;
308
+ c = SPLITTER * ady; bhi = c - (c - ady); blo = ady - bhi;
309
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
310
+ t1 = adx * cdy; c = SPLITTER * adx; ahi = c - (c - adx); alo = adx - ahi;
311
+ c = SPLITTER * cdy; bhi = c - (c - cdy); blo = cdy - bhi;
312
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
313
+ _i = s0 - t0; bvirt = s0 - _i;
314
+ icca[0] = s0 - (_i + bvirt) + (bvirt - t0);
315
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
316
+ _i = _0 - t1; bvirt = _0 - _i;
317
+ icca[1] = _0 - (_i + bvirt) + (bvirt - t1);
318
+ u3 = _j + _i; bvirt = u3 - _j;
319
+ icca[2] = _j - (u3 - bvirt) + (_i - bvirt); icca[3] = u3;
320
+
321
+ // ab = adx*bdy - bdx*ady
322
+ s1 = adx * bdy; c = SPLITTER * adx; ahi = c - (c - adx); alo = adx - ahi;
323
+ c = SPLITTER * bdy; bhi = c - (c - bdy); blo = bdy - bhi;
324
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
325
+ t1 = bdx * ady; c = SPLITTER * bdx; ahi = c - (c - bdx); alo = bdx - ahi;
326
+ c = SPLITTER * ady; bhi = c - (c - ady); blo = ady - bhi;
327
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
328
+ _i = s0 - t0; bvirt = s0 - _i;
329
+ icab[0] = s0 - (_i + bvirt) + (bvirt - t0);
330
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
331
+ _i = _0 - t1; bvirt = _0 - _i;
332
+ icab[1] = _0 - (_i + bvirt) + (bvirt - t1);
333
+ u3 = _j + _i; bvirt = u3 - _j;
334
+ icab[2] = _j - (u3 - bvirt) + (_i - bvirt); icab[3] = u3;
335
+
336
+ finlen = expansionSum(
337
+ expansionSum(
338
+ expansionSum(
339
+ scaleExpansion(scaleExpansion(4, icbc, adx, ic8), ic8, adx, ic16), ic16,
340
+ scaleExpansion(scaleExpansion(4, icbc, ady, ic8), ic8, ady, ic16b), ic16b, ic32
341
+ ), ic32,
342
+ expansionSum(
343
+ scaleExpansion(scaleExpansion(4, icca, bdx, ic8), ic8, bdx, ic16), ic16,
344
+ scaleExpansion(scaleExpansion(4, icca, bdy, ic8), ic8, bdy, ic16b), ic16b, ic32b
345
+ ), ic32b, ic64
346
+ ), ic64,
347
+ expansionSum(
348
+ scaleExpansion(scaleExpansion(4, icab, cdx, ic8), ic8, cdx, ic16), ic16,
349
+ scaleExpansion(scaleExpansion(4, icab, cdy, ic8), ic8, cdy, ic16b), ic16b, ic32
350
+ ), ic32, icfin
351
+ );
352
+
353
+ let det = estimate(finlen, icfin);
354
+ let errbound = iccerrboundB * permanent;
355
+ if (det >= errbound || -det >= errbound) return det;
356
+
357
+ bvirt = ax - adx; adxtail = ax - (adx + bvirt) + (bvirt - dx);
358
+ bvirt = ay - ady; adytail = ay - (ady + bvirt) + (bvirt - dy);
359
+ bvirt = bx - bdx; bdxtail = bx - (bdx + bvirt) + (bvirt - dx);
360
+ bvirt = by - bdy; bdytail = by - (bdy + bvirt) + (bvirt - dy);
361
+ bvirt = cx - cdx; cdxtail = cx - (cdx + bvirt) + (bvirt - dx);
362
+ bvirt = cy - cdy; cdytail = cy - (cdy + bvirt) + (bvirt - dy);
363
+
364
+ if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 &&
365
+ adytail === 0 && bdytail === 0 && cdytail === 0) return det;
366
+
367
+ errbound = iccerrboundC * permanent + resulterrbound * Math.abs(det);
368
+ det += ((adx * adx + ady * ady) * ((bdx * cdytail + cdy * bdxtail) - (bdy * cdxtail + cdx * bdytail)) +
369
+ 2 * (adx * adxtail + ady * adytail) * (bdx * cdy - bdy * cdx)) +
370
+ ((bdx * bdx + bdy * bdy) * ((cdx * adytail + ady * cdxtail) - (cdy * adxtail + adx * cdytail)) +
371
+ 2 * (bdx * bdxtail + bdy * bdytail) * (cdx * ady - cdy * adx)) +
372
+ ((cdx * cdx + cdy * cdy) * ((adx * bdytail + bdy * adxtail) - (ady * bdxtail + bdx * adytail)) +
373
+ 2 * (cdx * cdxtail + cdy * cdytail) * (adx * bdy - ady * bdx));
374
+ if (det >= errbound || -det >= errbound) return det;
375
+
376
+ // Stage C: full exact arithmetic with tail terms
377
+ if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {
378
+ s1 = adx * adx; c = SPLITTER * adx; ahi = c - (c - adx); alo = adx - ahi;
379
+ s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);
380
+ t1 = ady * ady; c = SPLITTER * ady; ahi = c - (c - ady); alo = ady - ahi;
381
+ t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);
382
+ _i = s0 + t0; bvirt = _i - s0; icaa[0] = s0 - (_i - bvirt) + (t0 - bvirt);
383
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
384
+ _i = _0 + t1; bvirt = _i - _0; icaa[1] = _0 - (_i - bvirt) + (t1 - bvirt);
385
+ u3 = _j + _i; bvirt = u3 - _j; icaa[2] = _j - (u3 - bvirt) + (_i - bvirt); icaa[3] = u3;
386
+ }
387
+ if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {
388
+ s1 = bdx * bdx; c = SPLITTER * bdx; ahi = c - (c - bdx); alo = bdx - ahi;
389
+ s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);
390
+ t1 = bdy * bdy; c = SPLITTER * bdy; ahi = c - (c - bdy); alo = bdy - ahi;
391
+ t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);
392
+ _i = s0 + t0; bvirt = _i - s0; icbb[0] = s0 - (_i - bvirt) + (t0 - bvirt);
393
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
394
+ _i = _0 + t1; bvirt = _i - _0; icbb[1] = _0 - (_i - bvirt) + (t1 - bvirt);
395
+ u3 = _j + _i; bvirt = u3 - _j; icbb[2] = _j - (u3 - bvirt) + (_i - bvirt); icbb[3] = u3;
396
+ }
397
+ if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {
398
+ s1 = cdx * cdx; c = SPLITTER * cdx; ahi = c - (c - cdx); alo = cdx - ahi;
399
+ s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);
400
+ t1 = cdy * cdy; c = SPLITTER * cdy; ahi = c - (c - cdy); alo = cdy - ahi;
401
+ t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);
402
+ _i = s0 + t0; bvirt = _i - s0; iccc[0] = s0 - (_i - bvirt) + (t0 - bvirt);
403
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
404
+ _i = _0 + t1; bvirt = _i - _0; iccc[1] = _0 - (_i - bvirt) + (t1 - bvirt);
405
+ u3 = _j + _i; bvirt = u3 - _j; iccc[2] = _j - (u3 - bvirt) + (_i - bvirt); iccc[3] = u3;
406
+ }
407
+
408
+ const sum3 = (al: number, a: Float64Array, bl: number, b: Float64Array, cl: number, cv: Float64Array): number => {
409
+ const tl = expansionSum(al, a, bl, b, ic32);
410
+ return expansionSum(tl, ic32, cl, cv, ic48);
411
+ };
412
+
413
+ if (adxtail !== 0) {
414
+ axtbclen = scaleExpansion(4, icbc, adxtail, icaxtbc);
415
+ finlen = icFinadd(finlen, sum3(
416
+ scaleExpansion(axtbclen, icaxtbc, 2 * adx, ic16), ic16,
417
+ scaleExpansion(scaleExpansion(4, iccc, adxtail, ic8), ic8, bdy, ic16b), ic16b,
418
+ scaleExpansion(scaleExpansion(4, icbb, adxtail, ic8), ic8, -cdy, ic16c), ic16c), ic48);
419
+ }
420
+ if (adytail !== 0) {
421
+ aytbclen = scaleExpansion(4, icbc, adytail, icaytbc);
422
+ finlen = icFinadd(finlen, sum3(
423
+ scaleExpansion(aytbclen, icaytbc, 2 * ady, ic16), ic16,
424
+ scaleExpansion(scaleExpansion(4, icbb, adytail, ic8), ic8, cdx, ic16b), ic16b,
425
+ scaleExpansion(scaleExpansion(4, iccc, adytail, ic8), ic8, -bdx, ic16c), ic16c), ic48);
426
+ }
427
+ if (bdxtail !== 0) {
428
+ bxtcalen = scaleExpansion(4, icca, bdxtail, icbxtca);
429
+ finlen = icFinadd(finlen, sum3(
430
+ scaleExpansion(bxtcalen, icbxtca, 2 * bdx, ic16), ic16,
431
+ scaleExpansion(scaleExpansion(4, icaa, bdxtail, ic8), ic8, cdy, ic16b), ic16b,
432
+ scaleExpansion(scaleExpansion(4, iccc, bdxtail, ic8), ic8, -ady, ic16c), ic16c), ic48);
433
+ }
434
+ if (bdytail !== 0) {
435
+ bytcalen = scaleExpansion(4, icca, bdytail, icbytca);
436
+ finlen = icFinadd(finlen, sum3(
437
+ scaleExpansion(bytcalen, icbytca, 2 * bdy, ic16), ic16,
438
+ scaleExpansion(scaleExpansion(4, iccc, bdytail, ic8), ic8, adx, ic16b), ic16b,
439
+ scaleExpansion(scaleExpansion(4, icaa, bdytail, ic8), ic8, -cdx, ic16c), ic16c), ic48);
440
+ }
441
+ if (cdxtail !== 0) {
442
+ cxtablen = scaleExpansion(4, icab, cdxtail, iccxtab);
443
+ finlen = icFinadd(finlen, sum3(
444
+ scaleExpansion(cxtablen, iccxtab, 2 * cdx, ic16), ic16,
445
+ scaleExpansion(scaleExpansion(4, icbb, cdxtail, ic8), ic8, ady, ic16b), ic16b,
446
+ scaleExpansion(scaleExpansion(4, icaa, cdxtail, ic8), ic8, -bdy, ic16c), ic16c), ic48);
447
+ }
448
+ if (cdytail !== 0) {
449
+ cytablen = scaleExpansion(4, icab, cdytail, iccytab);
450
+ finlen = icFinadd(finlen, sum3(
451
+ scaleExpansion(cytablen, iccytab, 2 * cdy, ic16), ic16,
452
+ scaleExpansion(scaleExpansion(4, icaa, cdytail, ic8), ic8, bdx, ic16b), ic16b,
453
+ scaleExpansion(scaleExpansion(4, icbb, cdytail, ic8), ic8, -adx, ic16c), ic16c), ic48);
454
+ }
455
+
456
+ // Cross-tail terms
457
+ let bctlen: number, catlen: number, abtlen: number;
458
+ let bcttlen: number, cattlen: number, abttlen: number;
459
+
460
+ if (adxtail !== 0 || adytail !== 0) {
461
+ if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {
462
+ s1 = bdxtail * cdy; c = SPLITTER * bdxtail; ahi = c - (c - bdxtail); alo = bdxtail - ahi;
463
+ c = SPLITTER * cdy; bhi = c - (c - cdy); blo = cdy - bhi;
464
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
465
+ t1 = bdx * cdytail; c = SPLITTER * bdx; ahi = c - (c - bdx); alo = bdx - ahi;
466
+ c = SPLITTER * cdytail; bhi = c - (c - cdytail); blo = cdytail - bhi;
467
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
468
+ _i = s0 + t0; bvirt = _i - s0; icu[0] = s0 - (_i - bvirt) + (t0 - bvirt);
469
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
470
+ _i = _0 + t1; bvirt = _i - _0; icu[1] = _0 - (_i - bvirt) + (t1 - bvirt);
471
+ u3 = _j + _i; bvirt = u3 - _j; icu[2] = _j - (u3 - bvirt) + (_i - bvirt); icu[3] = u3;
472
+
473
+ n1 = -bdy; n0 = -bdytail;
474
+ s1 = cdxtail * n1; c = SPLITTER * cdxtail; ahi = c - (c - cdxtail); alo = cdxtail - ahi;
475
+ c = SPLITTER * n1; bhi = c - (c - n1); blo = n1 - bhi;
476
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
477
+ t1 = cdx * n0; c = SPLITTER * cdx; ahi = c - (c - cdx); alo = cdx - ahi;
478
+ c = SPLITTER * n0; bhi = c - (c - n0); blo = n0 - bhi;
479
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
480
+ _i = s0 + t0; bvirt = _i - s0; icv[0] = s0 - (_i - bvirt) + (t0 - bvirt);
481
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
482
+ _i = _0 + t1; bvirt = _i - _0; icv[1] = _0 - (_i - bvirt) + (t1 - bvirt);
483
+ u3 = _j + _i; bvirt = u3 - _j; icv[2] = _j - (u3 - bvirt) + (_i - bvirt); icv[3] = u3;
484
+ bctlen = expansionSum(4, icu, 4, icv, icbct);
485
+
486
+ s1 = bdxtail * cdytail; c = SPLITTER * bdxtail; ahi = c - (c - bdxtail); alo = bdxtail - ahi;
487
+ c = SPLITTER * cdytail; bhi = c - (c - cdytail); blo = cdytail - bhi;
488
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
489
+ t1 = cdxtail * bdytail; c = SPLITTER * cdxtail; ahi = c - (c - cdxtail); alo = cdxtail - ahi;
490
+ c = SPLITTER * bdytail; bhi = c - (c - bdytail); blo = bdytail - bhi;
491
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
492
+ _i = s0 - t0; bvirt = s0 - _i;
493
+ icbctt[0] = s0 - (_i + bvirt) + (bvirt - t0);
494
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
495
+ _i = _0 - t1; bvirt = _0 - _i;
496
+ icbctt[1] = _0 - (_i + bvirt) + (bvirt - t1);
497
+ u3 = _j + _i; bvirt = u3 - _j; icbctt[2] = _j - (u3 - bvirt) + (_i - bvirt); icbctt[3] = u3;
498
+ bcttlen = 4;
499
+ } else { icbct[0] = 0; bctlen = 1; icbctt[0] = 0; bcttlen = 1; }
500
+
501
+ if (adxtail !== 0) {
502
+ const len = scaleExpansion(bctlen, icbct, adxtail, ic16c);
503
+ finlen = icFinadd(finlen, expansionSum(
504
+ scaleExpansion(axtbclen, icaxtbc, adxtail, ic16), ic16,
505
+ scaleExpansion(len, ic16c, 2 * adx, ic32), ic32, ic48), ic48);
506
+ const len2 = scaleExpansion(bcttlen, icbctt, adxtail, ic8);
507
+ const t32bl = expansionSum(scaleExpansion(len2, ic8, 2 * adx, ic16), ic16,
508
+ scaleExpansion(len2, ic8, adxtail, ic16b), ic16b, ic32b);
509
+ finlen = icFinadd(finlen, expansionSum(
510
+ scaleExpansion(len, ic16c, adxtail, ic32), ic32, t32bl, ic32b, ic64), ic64);
511
+ if (bdytail !== 0) finlen = icFinadd(finlen, scaleExpansion(scaleExpansion(4, iccc, adxtail, ic8), ic8, bdytail, ic16), ic16);
512
+ if (cdytail !== 0) finlen = icFinadd(finlen, scaleExpansion(scaleExpansion(4, icbb, -adxtail, ic8), ic8, cdytail, ic16), ic16);
513
+ }
514
+ if (adytail !== 0) {
515
+ const len = scaleExpansion(bctlen, icbct, adytail, ic16c);
516
+ finlen = icFinadd(finlen, expansionSum(
517
+ scaleExpansion(aytbclen, icaytbc, adytail, ic16), ic16,
518
+ scaleExpansion(len, ic16c, 2 * ady, ic32), ic32, ic48), ic48);
519
+ const len2 = scaleExpansion(bcttlen, icbctt, adytail, ic8);
520
+ const t32bl = expansionSum(scaleExpansion(len2, ic8, 2 * ady, ic16), ic16,
521
+ scaleExpansion(len2, ic8, adytail, ic16b), ic16b, ic32b);
522
+ finlen = icFinadd(finlen, expansionSum(
523
+ scaleExpansion(len, ic16c, adytail, ic32), ic32, t32bl, ic32b, ic64), ic64);
524
+ }
525
+ }
526
+
527
+ if (bdxtail !== 0 || bdytail !== 0) {
528
+ if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {
529
+ s1 = cdxtail * ady; c = SPLITTER * cdxtail; ahi = c - (c - cdxtail); alo = cdxtail - ahi;
530
+ c = SPLITTER * ady; bhi = c - (c - ady); blo = ady - bhi;
531
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
532
+ t1 = cdx * adytail; c = SPLITTER * cdx; ahi = c - (c - cdx); alo = cdx - ahi;
533
+ c = SPLITTER * adytail; bhi = c - (c - adytail); blo = adytail - bhi;
534
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
535
+ _i = s0 + t0; bvirt = _i - s0; icu[0] = s0 - (_i - bvirt) + (t0 - bvirt);
536
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
537
+ _i = _0 + t1; bvirt = _i - _0; icu[1] = _0 - (_i - bvirt) + (t1 - bvirt);
538
+ u3 = _j + _i; bvirt = u3 - _j; icu[2] = _j - (u3 - bvirt) + (_i - bvirt); icu[3] = u3;
539
+
540
+ n1 = -cdy; n0 = -cdytail;
541
+ s1 = adxtail * n1; c = SPLITTER * adxtail; ahi = c - (c - adxtail); alo = adxtail - ahi;
542
+ c = SPLITTER * n1; bhi = c - (c - n1); blo = n1 - bhi;
543
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
544
+ t1 = adx * n0; c = SPLITTER * adx; ahi = c - (c - adx); alo = adx - ahi;
545
+ c = SPLITTER * n0; bhi = c - (c - n0); blo = n0 - bhi;
546
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
547
+ _i = s0 + t0; bvirt = _i - s0; icv[0] = s0 - (_i - bvirt) + (t0 - bvirt);
548
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
549
+ _i = _0 + t1; bvirt = _i - _0; icv[1] = _0 - (_i - bvirt) + (t1 - bvirt);
550
+ u3 = _j + _i; bvirt = u3 - _j; icv[2] = _j - (u3 - bvirt) + (_i - bvirt); icv[3] = u3;
551
+ catlen = expansionSum(4, icu, 4, icv, iccat);
552
+
553
+ s1 = cdxtail * adytail; c = SPLITTER * cdxtail; ahi = c - (c - cdxtail); alo = cdxtail - ahi;
554
+ c = SPLITTER * adytail; bhi = c - (c - adytail); blo = adytail - bhi;
555
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
556
+ t1 = adxtail * cdytail; c = SPLITTER * adxtail; ahi = c - (c - adxtail); alo = adxtail - ahi;
557
+ c = SPLITTER * cdytail; bhi = c - (c - cdytail); blo = cdytail - bhi;
558
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
559
+ _i = s0 - t0; bvirt = s0 - _i;
560
+ iccatt[0] = s0 - (_i + bvirt) + (bvirt - t0);
561
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
562
+ _i = _0 - t1; bvirt = _0 - _i;
563
+ iccatt[1] = _0 - (_i + bvirt) + (bvirt - t1);
564
+ u3 = _j + _i; bvirt = u3 - _j; iccatt[2] = _j - (u3 - bvirt) + (_i - bvirt); iccatt[3] = u3;
565
+ cattlen = 4;
566
+ } else { iccat[0] = 0; catlen = 1; iccatt[0] = 0; cattlen = 1; }
567
+
568
+ if (bdxtail !== 0) {
569
+ const len = scaleExpansion(catlen, iccat, bdxtail, ic16c);
570
+ finlen = icFinadd(finlen, expansionSum(
571
+ scaleExpansion(bxtcalen, icbxtca, bdxtail, ic16), ic16,
572
+ scaleExpansion(len, ic16c, 2 * bdx, ic32), ic32, ic48), ic48);
573
+ const len2 = scaleExpansion(cattlen, iccatt, bdxtail, ic8);
574
+ const t32bl = expansionSum(scaleExpansion(len2, ic8, 2 * bdx, ic16), ic16,
575
+ scaleExpansion(len2, ic8, bdxtail, ic16b), ic16b, ic32b);
576
+ finlen = icFinadd(finlen, expansionSum(
577
+ scaleExpansion(len, ic16c, bdxtail, ic32), ic32, t32bl, ic32b, ic64), ic64);
578
+ if (cdytail !== 0) finlen = icFinadd(finlen, scaleExpansion(scaleExpansion(4, icaa, bdxtail, ic8), ic8, cdytail, ic16), ic16);
579
+ if (adytail !== 0) finlen = icFinadd(finlen, scaleExpansion(scaleExpansion(4, iccc, -bdxtail, ic8), ic8, adytail, ic16), ic16);
580
+ }
581
+ if (bdytail !== 0) {
582
+ const len = scaleExpansion(catlen, iccat, bdytail, ic16c);
583
+ finlen = icFinadd(finlen, expansionSum(
584
+ scaleExpansion(bytcalen, icbytca, bdytail, ic16), ic16,
585
+ scaleExpansion(len, ic16c, 2 * bdy, ic32), ic32, ic48), ic48);
586
+ const len2 = scaleExpansion(cattlen, iccatt, bdytail, ic8);
587
+ const t32bl = expansionSum(scaleExpansion(len2, ic8, 2 * bdy, ic16), ic16,
588
+ scaleExpansion(len2, ic8, bdytail, ic16b), ic16b, ic32b);
589
+ finlen = icFinadd(finlen, expansionSum(
590
+ scaleExpansion(len, ic16c, bdytail, ic32), ic32, t32bl, ic32b, ic64), ic64);
591
+ }
592
+ }
593
+
594
+ if (cdxtail !== 0 || cdytail !== 0) {
595
+ if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {
596
+ s1 = adxtail * bdy; c = SPLITTER * adxtail; ahi = c - (c - adxtail); alo = adxtail - ahi;
597
+ c = SPLITTER * bdy; bhi = c - (c - bdy); blo = bdy - bhi;
598
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
599
+ t1 = adx * bdytail; c = SPLITTER * adx; ahi = c - (c - adx); alo = adx - ahi;
600
+ c = SPLITTER * bdytail; bhi = c - (c - bdytail); blo = bdytail - bhi;
601
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
602
+ _i = s0 + t0; bvirt = _i - s0; icu[0] = s0 - (_i - bvirt) + (t0 - bvirt);
603
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
604
+ _i = _0 + t1; bvirt = _i - _0; icu[1] = _0 - (_i - bvirt) + (t1 - bvirt);
605
+ u3 = _j + _i; bvirt = u3 - _j; icu[2] = _j - (u3 - bvirt) + (_i - bvirt); icu[3] = u3;
606
+
607
+ n1 = -ady; n0 = -adytail;
608
+ s1 = bdxtail * n1; c = SPLITTER * bdxtail; ahi = c - (c - bdxtail); alo = bdxtail - ahi;
609
+ c = SPLITTER * n1; bhi = c - (c - n1); blo = n1 - bhi;
610
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
611
+ t1 = bdx * n0; c = SPLITTER * bdx; ahi = c - (c - bdx); alo = bdx - ahi;
612
+ c = SPLITTER * n0; bhi = c - (c - n0); blo = n0 - bhi;
613
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
614
+ _i = s0 + t0; bvirt = _i - s0; icv[0] = s0 - (_i - bvirt) + (t0 - bvirt);
615
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
616
+ _i = _0 + t1; bvirt = _i - _0; icv[1] = _0 - (_i - bvirt) + (t1 - bvirt);
617
+ u3 = _j + _i; bvirt = u3 - _j; icv[2] = _j - (u3 - bvirt) + (_i - bvirt); icv[3] = u3;
618
+ abtlen = expansionSum(4, icu, 4, icv, icabt);
619
+
620
+ s1 = adxtail * bdytail; c = SPLITTER * adxtail; ahi = c - (c - adxtail); alo = adxtail - ahi;
621
+ c = SPLITTER * bdytail; bhi = c - (c - bdytail); blo = bdytail - bhi;
622
+ s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
623
+ t1 = bdxtail * adytail; c = SPLITTER * bdxtail; ahi = c - (c - bdxtail); alo = bdxtail - ahi;
624
+ c = SPLITTER * adytail; bhi = c - (c - adytail); blo = adytail - bhi;
625
+ t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
626
+ _i = s0 - t0; bvirt = s0 - _i;
627
+ icabtt[0] = s0 - (_i + bvirt) + (bvirt - t0);
628
+ _j = s1 + _i; bvirt = _j - s1; _0 = s1 - (_j - bvirt) + (_i - bvirt);
629
+ _i = _0 - t1; bvirt = _0 - _i;
630
+ icabtt[1] = _0 - (_i + bvirt) + (bvirt - t1);
631
+ u3 = _j + _i; bvirt = u3 - _j; icabtt[2] = _j - (u3 - bvirt) + (_i - bvirt); icabtt[3] = u3;
632
+ abttlen = 4;
633
+ } else { icabt[0] = 0; abtlen = 1; icabtt[0] = 0; abttlen = 1; }
634
+
635
+ if (cdxtail !== 0) {
636
+ const len = scaleExpansion(abtlen, icabt, cdxtail, ic16c);
637
+ finlen = icFinadd(finlen, expansionSum(
638
+ scaleExpansion(cxtablen, iccxtab, cdxtail, ic16), ic16,
639
+ scaleExpansion(len, ic16c, 2 * cdx, ic32), ic32, ic48), ic48);
640
+ const len2 = scaleExpansion(abttlen, icabtt, cdxtail, ic8);
641
+ const t32bl = expansionSum(scaleExpansion(len2, ic8, 2 * cdx, ic16), ic16,
642
+ scaleExpansion(len2, ic8, cdxtail, ic16b), ic16b, ic32b);
643
+ finlen = icFinadd(finlen, expansionSum(
644
+ scaleExpansion(len, ic16c, cdxtail, ic32), ic32, t32bl, ic32b, ic64), ic64);
645
+ if (adytail !== 0) finlen = icFinadd(finlen, scaleExpansion(scaleExpansion(4, icbb, cdxtail, ic8), ic8, adytail, ic16), ic16);
646
+ if (bdytail !== 0) finlen = icFinadd(finlen, scaleExpansion(scaleExpansion(4, icaa, -cdxtail, ic8), ic8, bdytail, ic16), ic16);
647
+ }
648
+ if (cdytail !== 0) {
649
+ const len = scaleExpansion(abtlen, icabt, cdytail, ic16c);
650
+ finlen = icFinadd(finlen, expansionSum(
651
+ scaleExpansion(cytablen, iccytab, cdytail, ic16), ic16,
652
+ scaleExpansion(len, ic16c, 2 * cdy, ic32), ic32, ic48), ic48);
653
+ const len2 = scaleExpansion(abttlen, icabtt, cdytail, ic8);
654
+ const t32bl = expansionSum(scaleExpansion(len2, ic8, 2 * cdy, ic16), ic16,
655
+ scaleExpansion(len2, ic8, cdytail, ic16b), ic16b, ic32b);
656
+ finlen = icFinadd(finlen, expansionSum(
657
+ scaleExpansion(len, ic16c, cdytail, ic32), ic32, t32bl, ic32b, ic64), ic64);
658
+ }
659
+ }
660
+
661
+ return icfin[finlen - 1];
662
+ }
663
+
664
+
665
+ // incircle sign, with adaptive exact fallback
666
+ export function adaptiveIncircleSign(
667
+ ax: number, ay: number, bx: number, by: number,
668
+ cx: number, cy: number, dx: number, dy: number
669
+ ): number {
670
+ const adx = ax - dx, bdx = bx - dx, cdx = cx - dx;
671
+ const ady = ay - dy, bdy = by - dy, cdy = cy - dy;
672
+
673
+ const bdxcdy = bdx * cdy, cdxbdy = cdx * bdy;
674
+ const alift = adx * adx + ady * ady;
675
+ const cdxady = cdx * ady, adxcdy = adx * cdy;
676
+ const blift = bdx * bdx + bdy * bdy;
677
+ const adxbdy = adx * bdy, bdxady = bdx * ady;
678
+ const clift = cdx * cdx + cdy * cdy;
679
+
680
+ const det = alift * (bdxcdy - cdxbdy) + blift * (cdxady - adxcdy) + clift * (adxbdy - bdxady);
681
+ const permanent = (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * alift +
682
+ (Math.abs(cdxady) + Math.abs(adxcdy)) * blift +
683
+ (Math.abs(adxbdy) + Math.abs(bdxady)) * clift;
684
+
685
+ const errbound = iccerrboundA * permanent;
686
+ if (det > errbound || -det > errbound) return det > 0 ? 1 : -1;
687
+
688
+ const result = incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent);
689
+ return result > 0 ? 1 : result < 0 ? -1 : 0;
690
+ }