gistools/geometry/predicates/
incircle.rs

1// import { estimate, predSum, predSumThree, resulterrbound, scale, splitter, vec } from './util';
2
3// const iccerrboundA = 1.1102230246251577e-15; // (10 + 96 * epsilon) * epsilon;
4// const iccerrboundB = 4.440892098500632e-16; // (4 + 48 * epsilon) * epsilon;
5// const iccerrboundC = 5.423418723394464e-31; // (44 + 576 * epsilon) * epsilon * epsilon;
6
7// /** Constants for incircle */
8// export interface InCircleConstants {
9//   bc: Float64Array;
10//   ca: Float64Array;
11//   ab: Float64Array;
12//   aa: Float64Array;
13//   bb: Float64Array;
14//   cc: Float64Array;
15//   u: Float64Array;
16//   v: Float64Array;
17//   axtbc: Float64Array;
18//   aytbc: Float64Array;
19//   bxtca: Float64Array;
20//   bytca: Float64Array;
21//   cxtab: Float64Array;
22//   cytab: Float64Array;
23//   abt: Float64Array;
24//   bct: Float64Array;
25//   cat: Float64Array;
26//   abtt: Float64Array;
27//   bctt: Float64Array;
28//   catt: Float64Array;
29
30//   _8: Float64Array;
31//   _16: Float64Array;
32//   _16b: Float64Array;
33//   _16c: Float64Array;
34//   _32: Float64Array;
35//   _32b: Float64Array;
36//   _48: Float64Array;
37//   _64: Float64Array;
38
39//   fin: Float64Array;
40//   fin2: Float64Array;
41// }
42
43// let constants: undefined | InCircleConstants;
44
45// /**
46//  * build constants for future reuse
47//  * @returns - the constants
48//  */
49// function buildConstants(): InCircleConstants {
50//   return {
51//     bc: vec(4),
52//     ca: vec(4),
53//     ab: vec(4),
54//     aa: vec(4),
55//     bb: vec(4),
56//     cc: vec(4),
57//     u: vec(4),
58//     v: vec(4),
59//     axtbc: vec(8),
60//     aytbc: vec(8),
61//     bxtca: vec(8),
62//     bytca: vec(8),
63//     cxtab: vec(8),
64//     cytab: vec(8),
65//     abt: vec(8),
66//     bct: vec(8),
67//     cat: vec(8),
68//     abtt: vec(4),
69//     bctt: vec(4),
70//     catt: vec(4),
71
72//     _8: vec(8),
73//     _16: vec(16),
74//     _16b: vec(16),
75//     _16c: vec(16),
76//     _32: vec(32),
77//     _32b: vec(32),
78//     _48: vec(48),
79//     _64: vec(64),
80
81//     fin: vec(1152),
82//     fin2: vec(1152),
83//   };
84// }
85
86// /**
87//  * @param finlen - length of array
88//  * @param a - index
89//  * @param alen - array
90//  * @returns - updated finlen
91//  */
92// function finadd(finlen: number, a: number, alen: number[] | Float64Array): number {
93//   if (constants === undefined) constants = buildConstants();
94//   finlen = predSum(finlen, constants.fin, a, alen, constants.fin2);
95//   const tmp = constants.fin;
96//   constants.fin = constants.fin2;
97//   constants.fin2 = tmp;
98//   return finlen;
99// }
100
101// /**
102//  * @param ax - x coordinate of first point
103//  * @param ay - y coordinate of first point
104//  * @param bx - x coordinate of second point
105//  * @param by - y coordinate of second point
106//  * @param cx - x coordinate of third point
107//  * @param cy - y coordinate of third point
108//  * @param dx - x coordinate of comparison point
109//  * @param dy - y coordinate of comparison point
110//  * @param permanent - a value between 0 and 1
111//  * @returns - a positive value if the point d lies outside the circle passing through a, b, and c.
112//  * - a negative value if it lies inside.
113//  * - zero if the four points are cocircular.
114//  */
115// function incircleadapt(
116//   ax: number,
117//   ay: number,
118//   bx: number,
119//   by: number,
120//   cx: number,
121//   cy: number,
122//   dx: number,
123//   dy: number,
124//   permanent: number,
125// ): number {
126//   if (constants === undefined) constants = buildConstants();
127//   const {
128//     bc,
129//     ca,
130//     ab,
131//     aa,
132//     bb,
133//     cc,
134//     u,
135//     v,
136//     axtbc,
137//     aytbc,
138//     bxtca,
139//     bytca,
140//     cxtab,
141//     cytab,
142//     abt,
143//     bct,
144//     cat,
145//     abtt,
146//     bctt,
147//     catt,
148
149//     _8,
150//     _16,
151//     _16b,
152//     _16c,
153//     _32,
154//     _32b,
155//     _48,
156//     _64,
157
158//     fin,
159//   } = constants;
160//   let finlen;
161//   let axtbclen = 0,
162//     aytbclen = 0,
163//     bxtcalen = 0,
164//     bytcalen = 0,
165//     cxtablen = 0,
166//     cytablen = 0;
167//   let abtlen, bctlen, catlen;
168//   let abttlen, bcttlen, cattlen;
169//   let n1, n0;
170
171//   let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;
172
173//   const adx = ax - dx;
174//   const bdx = bx - dx;
175//   const cdx = cx - dx;
176//   const ady = ay - dy;
177//   const bdy = by - dy;
178//   const cdy = cy - dy;
179
180//   s1 = bdx * cdy;
181//   c = splitter * bdx;
182//   ahi = c - (c - bdx);
183//   alo = bdx - ahi;
184//   c = splitter * cdy;
185//   bhi = c - (c - cdy);
186//   blo = cdy - bhi;
187//   s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
188//   t1 = cdx * bdy;
189//   c = splitter * cdx;
190//   ahi = c - (c - cdx);
191//   alo = cdx - ahi;
192//   c = splitter * bdy;
193//   bhi = c - (c - bdy);
194//   blo = bdy - bhi;
195//   t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
196//   _i = s0 - t0;
197//   bvirt = s0 - _i;
198//   bc[0] = s0 - (_i + bvirt) + (bvirt - t0);
199//   _j = s1 + _i;
200//   bvirt = _j - s1;
201//   _0 = s1 - (_j - bvirt) + (_i - bvirt);
202//   _i = _0 - t1;
203//   bvirt = _0 - _i;
204//   bc[1] = _0 - (_i + bvirt) + (bvirt - t1);
205//   u3 = _j + _i;
206//   bvirt = u3 - _j;
207//   bc[2] = _j - (u3 - bvirt) + (_i - bvirt);
208//   bc[3] = u3;
209//   s1 = cdx * ady;
210//   c = splitter * cdx;
211//   ahi = c - (c - cdx);
212//   alo = cdx - ahi;
213//   c = splitter * ady;
214//   bhi = c - (c - ady);
215//   blo = ady - bhi;
216//   s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
217//   t1 = adx * cdy;
218//   c = splitter * adx;
219//   ahi = c - (c - adx);
220//   alo = adx - ahi;
221//   c = splitter * cdy;
222//   bhi = c - (c - cdy);
223//   blo = cdy - bhi;
224//   t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
225//   _i = s0 - t0;
226//   bvirt = s0 - _i;
227//   ca[0] = s0 - (_i + bvirt) + (bvirt - t0);
228//   _j = s1 + _i;
229//   bvirt = _j - s1;
230//   _0 = s1 - (_j - bvirt) + (_i - bvirt);
231//   _i = _0 - t1;
232//   bvirt = _0 - _i;
233//   ca[1] = _0 - (_i + bvirt) + (bvirt - t1);
234//   u3 = _j + _i;
235//   bvirt = u3 - _j;
236//   ca[2] = _j - (u3 - bvirt) + (_i - bvirt);
237//   ca[3] = u3;
238//   s1 = adx * bdy;
239//   c = splitter * adx;
240//   ahi = c - (c - adx);
241//   alo = adx - ahi;
242//   c = splitter * bdy;
243//   bhi = c - (c - bdy);
244//   blo = bdy - bhi;
245//   s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
246//   t1 = bdx * ady;
247//   c = splitter * bdx;
248//   ahi = c - (c - bdx);
249//   alo = bdx - ahi;
250//   c = splitter * ady;
251//   bhi = c - (c - ady);
252//   blo = ady - bhi;
253//   t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
254//   _i = s0 - t0;
255//   bvirt = s0 - _i;
256//   ab[0] = s0 - (_i + bvirt) + (bvirt - t0);
257//   _j = s1 + _i;
258//   bvirt = _j - s1;
259//   _0 = s1 - (_j - bvirt) + (_i - bvirt);
260//   _i = _0 - t1;
261//   bvirt = _0 - _i;
262//   ab[1] = _0 - (_i + bvirt) + (bvirt - t1);
263//   u3 = _j + _i;
264//   bvirt = u3 - _j;
265//   ab[2] = _j - (u3 - bvirt) + (_i - bvirt);
266//   ab[3] = u3;
267
268//   finlen = predSum(
269//     predSum(
270//       predSum(
271//         scale(scale(4, bc, adx, _8), _8, adx, _16),
272//         _16,
273//         scale(scale(4, bc, ady, _8), _8, ady, _16b),
274//         _16b,
275//         _32,
276//       ),
277//       _32,
278//       predSum(
279//         scale(scale(4, ca, bdx, _8), _8, bdx, _16),
280//         _16,
281//         scale(scale(4, ca, bdy, _8), _8, bdy, _16b),
282//         _16b,
283//         _32b,
284//       ),
285//       _32b,
286//       _64,
287//     ),
288//     _64,
289//     predSum(
290//       scale(scale(4, ab, cdx, _8), _8, cdx, _16),
291//       _16,
292//       scale(scale(4, ab, cdy, _8), _8, cdy, _16b),
293//       _16b,
294//       _32,
295//     ),
296//     _32,
297//     fin,
298//   );
299
300//   let det = estimate(finlen, fin);
301//   let errbound = iccerrboundB * permanent;
302//   if (det >= errbound || -det >= errbound) {
303//     return det;
304//   }
305
306//   bvirt = ax - adx;
307//   const adxtail = ax - (adx + bvirt) + (bvirt - dx);
308//   bvirt = ay - ady;
309//   const adytail = ay - (ady + bvirt) + (bvirt - dy);
310//   bvirt = bx - bdx;
311//   const bdxtail = bx - (bdx + bvirt) + (bvirt - dx);
312//   bvirt = by - bdy;
313//   const bdytail = by - (bdy + bvirt) + (bvirt - dy);
314//   bvirt = cx - cdx;
315//   const cdxtail = cx - (cdx + bvirt) + (bvirt - dx);
316//   bvirt = cy - cdy;
317//   const cdytail = cy - (cdy + bvirt) + (bvirt - dy);
318//   if (
319//     adxtail === 0 &&
320//     bdxtail === 0 &&
321//     cdxtail === 0 &&
322//     adytail === 0 &&
323//     bdytail === 0 &&
324//     cdytail === 0
325//   ) {
326//     return det;
327//   }
328
329//   errbound = iccerrboundC * permanent + resulterrbound * Math.abs(det);
330//   det +=
331//     (adx * adx + ady * ady) * (bdx * cdytail + cdy * bdxtail - (bdy * cdxtail + cdx * bdytail)) +
332//     2 * (adx * adxtail + ady * adytail) * (bdx * cdy - bdy * cdx) +
333//     ((bdx * bdx + bdy * bdy) * (cdx * adytail + ady * cdxtail - (cdy * adxtail + adx * cdytail)) +
334//       2 * (bdx * bdxtail + bdy * bdytail) * (cdx * ady - cdy * adx)) +
335//     ((cdx * cdx + cdy * cdy) * (adx * bdytail + bdy * adxtail - (ady * bdxtail + bdx * adytail)) +
336//       2 * (cdx * cdxtail + cdy * cdytail) * (adx * bdy - ady * bdx));
337
338//   if (det >= errbound || -det >= errbound) {
339//     return det;
340//   }
341
342//   if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {
343//     s1 = adx * adx;
344//     c = splitter * adx;
345//     ahi = c - (c - adx);
346//     alo = adx - ahi;
347//     s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);
348//     t1 = ady * ady;
349//     c = splitter * ady;
350//     ahi = c - (c - ady);
351//     alo = ady - ahi;
352//     t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);
353//     _i = s0 + t0;
354//     bvirt = _i - s0;
355//     aa[0] = s0 - (_i - bvirt) + (t0 - bvirt);
356//     _j = s1 + _i;
357//     bvirt = _j - s1;
358//     _0 = s1 - (_j - bvirt) + (_i - bvirt);
359//     _i = _0 + t1;
360//     bvirt = _i - _0;
361//     aa[1] = _0 - (_i - bvirt) + (t1 - bvirt);
362//     u3 = _j + _i;
363//     bvirt = u3 - _j;
364//     aa[2] = _j - (u3 - bvirt) + (_i - bvirt);
365//     aa[3] = u3;
366//   }
367//   if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {
368//     s1 = bdx * bdx;
369//     c = splitter * bdx;
370//     ahi = c - (c - bdx);
371//     alo = bdx - ahi;
372//     s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);
373//     t1 = bdy * bdy;
374//     c = splitter * bdy;
375//     ahi = c - (c - bdy);
376//     alo = bdy - ahi;
377//     t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);
378//     _i = s0 + t0;
379//     bvirt = _i - s0;
380//     bb[0] = s0 - (_i - bvirt) + (t0 - bvirt);
381//     _j = s1 + _i;
382//     bvirt = _j - s1;
383//     _0 = s1 - (_j - bvirt) + (_i - bvirt);
384//     _i = _0 + t1;
385//     bvirt = _i - _0;
386//     bb[1] = _0 - (_i - bvirt) + (t1 - bvirt);
387//     u3 = _j + _i;
388//     bvirt = u3 - _j;
389//     bb[2] = _j - (u3 - bvirt) + (_i - bvirt);
390//     bb[3] = u3;
391//   }
392//   if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {
393//     s1 = cdx * cdx;
394//     c = splitter * cdx;
395//     ahi = c - (c - cdx);
396//     alo = cdx - ahi;
397//     s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);
398//     t1 = cdy * cdy;
399//     c = splitter * cdy;
400//     ahi = c - (c - cdy);
401//     alo = cdy - ahi;
402//     t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);
403//     _i = s0 + t0;
404//     bvirt = _i - s0;
405//     cc[0] = s0 - (_i - bvirt) + (t0 - bvirt);
406//     _j = s1 + _i;
407//     bvirt = _j - s1;
408//     _0 = s1 - (_j - bvirt) + (_i - bvirt);
409//     _i = _0 + t1;
410//     bvirt = _i - _0;
411//     cc[1] = _0 - (_i - bvirt) + (t1 - bvirt);
412//     u3 = _j + _i;
413//     bvirt = u3 - _j;
414//     cc[2] = _j - (u3 - bvirt) + (_i - bvirt);
415//     cc[3] = u3;
416//   }
417
418//   if (adxtail !== 0) {
419//     axtbclen = scale(4, bc, adxtail, axtbc);
420//     finlen = finadd(
421//       finlen,
422//       predSumThree(
423//         scale(axtbclen, axtbc, 2 * adx, _16),
424//         _16,
425//         scale(scale(4, cc, adxtail, _8), _8, bdy, _16b),
426//         _16b,
427//         scale(scale(4, bb, adxtail, _8), _8, -cdy, _16c),
428//         _16c,
429//         _32,
430//         _48,
431//       ),
432//       _48,
433//     );
434//   }
435//   if (adytail !== 0) {
436//     aytbclen = scale(4, bc, adytail, aytbc);
437//     finlen = finadd(
438//       finlen,
439//       predSumThree(
440//         scale(aytbclen, aytbc, 2 * ady, _16),
441//         _16,
442//         scale(scale(4, bb, adytail, _8), _8, cdx, _16b),
443//         _16b,
444//         scale(scale(4, cc, adytail, _8), _8, -bdx, _16c),
445//         _16c,
446//         _32,
447//         _48,
448//       ),
449//       _48,
450//     );
451//   }
452//   if (bdxtail !== 0) {
453//     bxtcalen = scale(4, ca, bdxtail, bxtca);
454//     finlen = finadd(
455//       finlen,
456//       predSumThree(
457//         scale(bxtcalen, bxtca, 2 * bdx, _16),
458//         _16,
459//         scale(scale(4, aa, bdxtail, _8), _8, cdy, _16b),
460//         _16b,
461//         scale(scale(4, cc, bdxtail, _8), _8, -ady, _16c),
462//         _16c,
463//         _32,
464//         _48,
465//       ),
466//       _48,
467//     );
468//   }
469//   if (bdytail !== 0) {
470//     bytcalen = scale(4, ca, bdytail, bytca);
471//     finlen = finadd(
472//       finlen,
473//       predSumThree(
474//         scale(bytcalen, bytca, 2 * bdy, _16),
475//         _16,
476//         scale(scale(4, cc, bdytail, _8), _8, adx, _16b),
477//         _16b,
478//         scale(scale(4, aa, bdytail, _8), _8, -cdx, _16c),
479//         _16c,
480//         _32,
481//         _48,
482//       ),
483//       _48,
484//     );
485//   }
486//   if (cdxtail !== 0) {
487//     cxtablen = scale(4, ab, cdxtail, cxtab);
488//     finlen = finadd(
489//       finlen,
490//       predSumThree(
491//         scale(cxtablen, cxtab, 2 * cdx, _16),
492//         _16,
493//         scale(scale(4, bb, cdxtail, _8), _8, ady, _16b),
494//         _16b,
495//         scale(scale(4, aa, cdxtail, _8), _8, -bdy, _16c),
496//         _16c,
497//         _32,
498//         _48,
499//       ),
500//       _48,
501//     );
502//   }
503//   if (cdytail !== 0) {
504//     cytablen = scale(4, ab, cdytail, cytab);
505//     finlen = finadd(
506//       finlen,
507//       predSumThree(
508//         scale(cytablen, cytab, 2 * cdy, _16),
509//         _16,
510//         scale(scale(4, aa, cdytail, _8), _8, bdx, _16b),
511//         _16b,
512//         scale(scale(4, bb, cdytail, _8), _8, -adx, _16c),
513//         _16c,
514//         _32,
515//         _48,
516//       ),
517//       _48,
518//     );
519//   }
520
521//   if (adxtail !== 0 || adytail !== 0) {
522//     if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {
523//       s1 = bdxtail * cdy;
524//       c = splitter * bdxtail;
525//       ahi = c - (c - bdxtail);
526//       alo = bdxtail - ahi;
527//       c = splitter * cdy;
528//       bhi = c - (c - cdy);
529//       blo = cdy - bhi;
530//       s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
531//       t1 = bdx * cdytail;
532//       c = splitter * bdx;
533//       ahi = c - (c - bdx);
534//       alo = bdx - ahi;
535//       c = splitter * cdytail;
536//       bhi = c - (c - cdytail);
537//       blo = cdytail - bhi;
538//       t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
539//       _i = s0 + t0;
540//       bvirt = _i - s0;
541//       u[0] = s0 - (_i - bvirt) + (t0 - bvirt);
542//       _j = s1 + _i;
543//       bvirt = _j - s1;
544//       _0 = s1 - (_j - bvirt) + (_i - bvirt);
545//       _i = _0 + t1;
546//       bvirt = _i - _0;
547//       u[1] = _0 - (_i - bvirt) + (t1 - bvirt);
548//       u3 = _j + _i;
549//       bvirt = u3 - _j;
550//       u[2] = _j - (u3 - bvirt) + (_i - bvirt);
551//       u[3] = u3;
552//       s1 = cdxtail * -bdy;
553//       c = splitter * cdxtail;
554//       ahi = c - (c - cdxtail);
555//       alo = cdxtail - ahi;
556//       c = splitter * -bdy;
557//       bhi = c - (c - -bdy);
558//       blo = -bdy - bhi;
559//       s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
560//       t1 = cdx * -bdytail;
561//       c = splitter * cdx;
562//       ahi = c - (c - cdx);
563//       alo = cdx - ahi;
564//       c = splitter * -bdytail;
565//       bhi = c - (c - -bdytail);
566//       blo = -bdytail - bhi;
567//       t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
568//       _i = s0 + t0;
569//       bvirt = _i - s0;
570//       v[0] = s0 - (_i - bvirt) + (t0 - bvirt);
571//       _j = s1 + _i;
572//       bvirt = _j - s1;
573//       _0 = s1 - (_j - bvirt) + (_i - bvirt);
574//       _i = _0 + t1;
575//       bvirt = _i - _0;
576//       v[1] = _0 - (_i - bvirt) + (t1 - bvirt);
577//       u3 = _j + _i;
578//       bvirt = u3 - _j;
579//       v[2] = _j - (u3 - bvirt) + (_i - bvirt);
580//       v[3] = u3;
581//       bctlen = predSum(4, u, 4, v, bct);
582//       s1 = bdxtail * cdytail;
583//       c = splitter * bdxtail;
584//       ahi = c - (c - bdxtail);
585//       alo = bdxtail - ahi;
586//       c = splitter * cdytail;
587//       bhi = c - (c - cdytail);
588//       blo = cdytail - bhi;
589//       s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
590//       t1 = cdxtail * bdytail;
591//       c = splitter * cdxtail;
592//       ahi = c - (c - cdxtail);
593//       alo = cdxtail - ahi;
594//       c = splitter * bdytail;
595//       bhi = c - (c - bdytail);
596//       blo = bdytail - bhi;
597//       t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
598//       _i = s0 - t0;
599//       bvirt = s0 - _i;
600//       bctt[0] = s0 - (_i + bvirt) + (bvirt - t0);
601//       _j = s1 + _i;
602//       bvirt = _j - s1;
603//       _0 = s1 - (_j - bvirt) + (_i - bvirt);
604//       _i = _0 - t1;
605//       bvirt = _0 - _i;
606//       bctt[1] = _0 - (_i + bvirt) + (bvirt - t1);
607//       u3 = _j + _i;
608//       bvirt = u3 - _j;
609//       bctt[2] = _j - (u3 - bvirt) + (_i - bvirt);
610//       bctt[3] = u3;
611//       bcttlen = 4;
612//     } else {
613//       bct[0] = 0;
614//       bctlen = 1;
615//       bctt[0] = 0;
616//       bcttlen = 1;
617//     }
618//     if (adxtail !== 0) {
619//       const len = scale(bctlen, bct, adxtail, _16c);
620//       finlen = finadd(
621//         finlen,
622//         predSum(
623//           scale(axtbclen, axtbc, adxtail, _16),
624//           _16,
625//           scale(len, _16c, 2 * adx, _32),
626//           _32,
627//           _48,
628//         ),
629//         _48,
630//       );
631
632//       const len2 = scale(bcttlen, bctt, adxtail, _8);
633//       finlen = finadd(
634//         finlen,
635//         predSumThree(
636//           scale(len2, _8, 2 * adx, _16),
637//           _16,
638//           scale(len2, _8, adxtail, _16b),
639//           _16b,
640//           scale(len, _16c, adxtail, _32),
641//           _32,
642//           _32b,
643//           _64,
644//         ),
645//         _64,
646//       );
647
648//       if (bdytail !== 0) {
649//         finlen = finadd(finlen, scale(scale(4, cc, adxtail, _8), _8, bdytail, _16), _16);
650//       }
651//       if (cdytail !== 0) {
652//         finlen = finadd(finlen, scale(scale(4, bb, -adxtail, _8), _8, cdytail, _16), _16);
653//       }
654//     }
655//     if (adytail !== 0) {
656//       const len = scale(bctlen, bct, adytail, _16c);
657//       finlen = finadd(
658//         finlen,
659//         predSum(
660//           scale(aytbclen, aytbc, adytail, _16),
661//           _16,
662//           scale(len, _16c, 2 * ady, _32),
663//           _32,
664//           _48,
665//         ),
666//         _48,
667//       );
668
669//       const len2 = scale(bcttlen, bctt, adytail, _8);
670//       finlen = finadd(
671//         finlen,
672//         predSumThree(
673//           scale(len2, _8, 2 * ady, _16),
674//           _16,
675//           scale(len2, _8, adytail, _16b),
676//           _16b,
677//           scale(len, _16c, adytail, _32),
678//           _32,
679//           _32b,
680//           _64,
681//         ),
682//         _64,
683//       );
684//     }
685//   }
686//   if (bdxtail !== 0 || bdytail !== 0) {
687//     if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {
688//       s1 = cdxtail * ady;
689//       c = splitter * cdxtail;
690//       ahi = c - (c - cdxtail);
691//       alo = cdxtail - ahi;
692//       c = splitter * ady;
693//       bhi = c - (c - ady);
694//       blo = ady - bhi;
695//       s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
696//       t1 = cdx * adytail;
697//       c = splitter * cdx;
698//       ahi = c - (c - cdx);
699//       alo = cdx - ahi;
700//       c = splitter * adytail;
701//       bhi = c - (c - adytail);
702//       blo = adytail - bhi;
703//       t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
704//       _i = s0 + t0;
705//       bvirt = _i - s0;
706//       u[0] = s0 - (_i - bvirt) + (t0 - bvirt);
707//       _j = s1 + _i;
708//       bvirt = _j - s1;
709//       _0 = s1 - (_j - bvirt) + (_i - bvirt);
710//       _i = _0 + t1;
711//       bvirt = _i - _0;
712//       u[1] = _0 - (_i - bvirt) + (t1 - bvirt);
713//       u3 = _j + _i;
714//       bvirt = u3 - _j;
715//       u[2] = _j - (u3 - bvirt) + (_i - bvirt);
716//       u[3] = u3;
717//       n1 = -cdy;
718//       n0 = -cdytail;
719//       s1 = adxtail * n1;
720//       c = splitter * adxtail;
721//       ahi = c - (c - adxtail);
722//       alo = adxtail - ahi;
723//       c = splitter * n1;
724//       bhi = c - (c - n1);
725//       blo = n1 - bhi;
726//       s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
727//       t1 = adx * n0;
728//       c = splitter * adx;
729//       ahi = c - (c - adx);
730//       alo = adx - ahi;
731//       c = splitter * n0;
732//       bhi = c - (c - n0);
733//       blo = n0 - bhi;
734//       t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
735//       _i = s0 + t0;
736//       bvirt = _i - s0;
737//       v[0] = s0 - (_i - bvirt) + (t0 - bvirt);
738//       _j = s1 + _i;
739//       bvirt = _j - s1;
740//       _0 = s1 - (_j - bvirt) + (_i - bvirt);
741//       _i = _0 + t1;
742//       bvirt = _i - _0;
743//       v[1] = _0 - (_i - bvirt) + (t1 - bvirt);
744//       u3 = _j + _i;
745//       bvirt = u3 - _j;
746//       v[2] = _j - (u3 - bvirt) + (_i - bvirt);
747//       v[3] = u3;
748//       catlen = predSum(4, u, 4, v, cat);
749//       s1 = cdxtail * adytail;
750//       c = splitter * cdxtail;
751//       ahi = c - (c - cdxtail);
752//       alo = cdxtail - ahi;
753//       c = splitter * adytail;
754//       bhi = c - (c - adytail);
755//       blo = adytail - bhi;
756//       s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
757//       t1 = adxtail * cdytail;
758//       c = splitter * adxtail;
759//       ahi = c - (c - adxtail);
760//       alo = adxtail - ahi;
761//       c = splitter * cdytail;
762//       bhi = c - (c - cdytail);
763//       blo = cdytail - bhi;
764//       t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
765//       _i = s0 - t0;
766//       bvirt = s0 - _i;
767//       catt[0] = s0 - (_i + bvirt) + (bvirt - t0);
768//       _j = s1 + _i;
769//       bvirt = _j - s1;
770//       _0 = s1 - (_j - bvirt) + (_i - bvirt);
771//       _i = _0 - t1;
772//       bvirt = _0 - _i;
773//       catt[1] = _0 - (_i + bvirt) + (bvirt - t1);
774//       u3 = _j + _i;
775//       bvirt = u3 - _j;
776//       catt[2] = _j - (u3 - bvirt) + (_i - bvirt);
777//       catt[3] = u3;
778//       cattlen = 4;
779//     } else {
780//       cat[0] = 0;
781//       catlen = 1;
782//       catt[0] = 0;
783//       cattlen = 1;
784//     }
785//     if (bdxtail !== 0) {
786//       const len = scale(catlen, cat, bdxtail, _16c);
787//       finlen = finadd(
788//         finlen,
789//         predSum(
790//           scale(bxtcalen, bxtca, bdxtail, _16),
791//           _16,
792//           scale(len, _16c, 2 * bdx, _32),
793//           _32,
794//           _48,
795//         ),
796//         _48,
797//       );
798
799//       const len2 = scale(cattlen, catt, bdxtail, _8);
800//       finlen = finadd(
801//         finlen,
802//         predSumThree(
803//           scale(len2, _8, 2 * bdx, _16),
804//           _16,
805//           scale(len2, _8, bdxtail, _16b),
806//           _16b,
807//           scale(len, _16c, bdxtail, _32),
808//           _32,
809//           _32b,
810//           _64,
811//         ),
812//         _64,
813//       );
814
815//       if (cdytail !== 0) {
816//         finlen = finadd(finlen, scale(scale(4, aa, bdxtail, _8), _8, cdytail, _16), _16);
817//       }
818//       if (adytail !== 0) {
819//         finlen = finadd(finlen, scale(scale(4, cc, -bdxtail, _8), _8, adytail, _16), _16);
820//       }
821//     }
822//     if (bdytail !== 0) {
823//       const len = scale(catlen, cat, bdytail, _16c);
824//       finlen = finadd(
825//         finlen,
826//         predSum(
827//           scale(bytcalen, bytca, bdytail, _16),
828//           _16,
829//           scale(len, _16c, 2 * bdy, _32),
830//           _32,
831//           _48,
832//         ),
833//         _48,
834//       );
835
836//       const len2 = scale(cattlen, catt, bdytail, _8);
837//       finlen = finadd(
838//         finlen,
839//         predSumThree(
840//           scale(len2, _8, 2 * bdy, _16),
841//           _16,
842//           scale(len2, _8, bdytail, _16b),
843//           _16b,
844//           scale(len, _16c, bdytail, _32),
845//           _32,
846//           _32b,
847//           _64,
848//         ),
849//         _64,
850//       );
851//     }
852//   }
853//   if (cdxtail !== 0 || cdytail !== 0) {
854//     if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {
855//       s1 = adxtail * bdy;
856//       c = splitter * adxtail;
857//       ahi = c - (c - adxtail);
858//       alo = adxtail - ahi;
859//       c = splitter * bdy;
860//       bhi = c - (c - bdy);
861//       blo = bdy - bhi;
862//       s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
863//       t1 = adx * bdytail;
864//       c = splitter * adx;
865//       ahi = c - (c - adx);
866//       alo = adx - ahi;
867//       c = splitter * bdytail;
868//       bhi = c - (c - bdytail);
869//       blo = bdytail - bhi;
870//       t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
871//       _i = s0 + t0;
872//       bvirt = _i - s0;
873//       u[0] = s0 - (_i - bvirt) + (t0 - bvirt);
874//       _j = s1 + _i;
875//       bvirt = _j - s1;
876//       _0 = s1 - (_j - bvirt) + (_i - bvirt);
877//       _i = _0 + t1;
878//       bvirt = _i - _0;
879//       u[1] = _0 - (_i - bvirt) + (t1 - bvirt);
880//       u3 = _j + _i;
881//       bvirt = u3 - _j;
882//       u[2] = _j - (u3 - bvirt) + (_i - bvirt);
883//       u[3] = u3;
884//       n1 = -ady;
885//       n0 = -adytail;
886//       s1 = bdxtail * n1;
887//       c = splitter * bdxtail;
888//       ahi = c - (c - bdxtail);
889//       alo = bdxtail - ahi;
890//       c = splitter * n1;
891//       bhi = c - (c - n1);
892//       blo = n1 - bhi;
893//       s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
894//       t1 = bdx * n0;
895//       c = splitter * bdx;
896//       ahi = c - (c - bdx);
897//       alo = bdx - ahi;
898//       c = splitter * n0;
899//       bhi = c - (c - n0);
900//       blo = n0 - bhi;
901//       t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
902//       _i = s0 + t0;
903//       bvirt = _i - s0;
904//       v[0] = s0 - (_i - bvirt) + (t0 - bvirt);
905//       _j = s1 + _i;
906//       bvirt = _j - s1;
907//       _0 = s1 - (_j - bvirt) + (_i - bvirt);
908//       _i = _0 + t1;
909//       bvirt = _i - _0;
910//       v[1] = _0 - (_i - bvirt) + (t1 - bvirt);
911//       u3 = _j + _i;
912//       bvirt = u3 - _j;
913//       v[2] = _j - (u3 - bvirt) + (_i - bvirt);
914//       v[3] = u3;
915//       abtlen = predSum(4, u, 4, v, abt);
916//       s1 = adxtail * bdytail;
917//       c = splitter * adxtail;
918//       ahi = c - (c - adxtail);
919//       alo = adxtail - ahi;
920//       c = splitter * bdytail;
921//       bhi = c - (c - bdytail);
922//       blo = bdytail - bhi;
923//       s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
924//       t1 = bdxtail * adytail;
925//       c = splitter * bdxtail;
926//       ahi = c - (c - bdxtail);
927//       alo = bdxtail - ahi;
928//       c = splitter * adytail;
929//       bhi = c - (c - adytail);
930//       blo = adytail - bhi;
931//       t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
932//       _i = s0 - t0;
933//       bvirt = s0 - _i;
934//       abtt[0] = s0 - (_i + bvirt) + (bvirt - t0);
935//       _j = s1 + _i;
936//       bvirt = _j - s1;
937//       _0 = s1 - (_j - bvirt) + (_i - bvirt);
938//       _i = _0 - t1;
939//       bvirt = _0 - _i;
940//       abtt[1] = _0 - (_i + bvirt) + (bvirt - t1);
941//       u3 = _j + _i;
942//       bvirt = u3 - _j;
943//       abtt[2] = _j - (u3 - bvirt) + (_i - bvirt);
944//       abtt[3] = u3;
945//       abttlen = 4;
946//     } else {
947//       abt[0] = 0;
948//       abtlen = 1;
949//       abtt[0] = 0;
950//       abttlen = 1;
951//     }
952//     if (cdxtail !== 0) {
953//       const len = scale(abtlen, abt, cdxtail, _16c);
954//       finlen = finadd(
955//         finlen,
956//         predSum(
957//           scale(cxtablen, cxtab, cdxtail, _16),
958//           _16,
959//           scale(len, _16c, 2 * cdx, _32),
960//           _32,
961//           _48,
962//         ),
963//         _48,
964//       );
965
966//       const len2 = scale(abttlen, abtt, cdxtail, _8);
967//       finlen = finadd(
968//         finlen,
969//         predSumThree(
970//           scale(len2, _8, 2 * cdx, _16),
971//           _16,
972//           scale(len2, _8, cdxtail, _16b),
973//           _16b,
974//           scale(len, _16c, cdxtail, _32),
975//           _32,
976//           _32b,
977//           _64,
978//         ),
979//         _64,
980//       );
981
982//       if (adytail !== 0) {
983//         finlen = finadd(finlen, scale(scale(4, bb, cdxtail, _8), _8, adytail, _16), _16);
984//       }
985//       if (bdytail !== 0) {
986//         finlen = finadd(finlen, scale(scale(4, aa, -cdxtail, _8), _8, bdytail, _16), _16);
987//       }
988//     }
989//     if (cdytail !== 0) {
990//       const len = scale(abtlen, abt, cdytail, _16c);
991//       finlen = finadd(
992//         finlen,
993//         predSum(
994//           scale(cytablen, cytab, cdytail, _16),
995//           _16,
996//           scale(len, _16c, 2 * cdy, _32),
997//           _32,
998//           _48,
999//         ),
1000//         _48,
1001//       );
1002
1003//       const len2 = scale(abttlen, abtt, cdytail, _8);
1004//       finlen = finadd(
1005//         finlen,
1006//         predSumThree(
1007//           scale(len2, _8, 2 * cdy, _16),
1008//           _16,
1009//           scale(len2, _8, cdytail, _16b),
1010//           _16b,
1011//           scale(len, _16c, cdytail, _32),
1012//           _32,
1013//           _32b,
1014//           _64,
1015//         ),
1016//         _64,
1017//       );
1018//     }
1019//   }
1020
1021//   return fin[finlen - 1];
1022// }
1023
1024// /**
1025//  * The points a, b, and c must be in counterclockwise order, or the sign of the result will be reversed.
1026//  * @param ax - x coordinate of first point
1027//  * @param ay - y coordinate of first point
1028//  * @param bx - x coordinate of second point
1029//  * @param by - y coordinate of second point
1030//  * @param cx - x coordinate of third point
1031//  * @param cy - y coordinate of third point
1032//  * @param dx - x coordinate of fourth point
1033//  * @param dy - y coordinate of fourth point
1034//  * @returns - a positive value if the point d lies outside the circle passing through a, b, and c.
1035//  * - a negative value if it lies inside.
1036//  * - zero if the four points are cocircular.
1037//  */
1038// export function incircle(
1039//   ax: number,
1040//   ay: number,
1041//   bx: number,
1042//   by: number,
1043//   cx: number,
1044//   cy: number,
1045//   dx: number,
1046//   dy: number,
1047// ): number {
1048//   const adx = ax - dx;
1049//   const bdx = bx - dx;
1050//   const cdx = cx - dx;
1051//   const ady = ay - dy;
1052//   const bdy = by - dy;
1053//   const cdy = cy - dy;
1054
1055//   const bdxcdy = bdx * cdy;
1056//   const cdxbdy = cdx * bdy;
1057//   const alift = adx * adx + ady * ady;
1058
1059//   const cdxady = cdx * ady;
1060//   const adxcdy = adx * cdy;
1061//   const blift = bdx * bdx + bdy * bdy;
1062
1063//   const adxbdy = adx * bdy;
1064//   const bdxady = bdx * ady;
1065//   const clift = cdx * cdx + cdy * cdy;
1066
1067//   const det = alift * (bdxcdy - cdxbdy) + blift * (cdxady - adxcdy) + clift * (adxbdy - bdxady);
1068
1069//   const permanent =
1070//     (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * alift +
1071//     (Math.abs(cdxady) + Math.abs(adxcdy)) * blift +
1072//     (Math.abs(adxbdy) + Math.abs(bdxady)) * clift;
1073
1074//   const errbound = iccerrboundA * permanent;
1075
1076//   if (det > errbound || -det > errbound) {
1077//     return det;
1078//   }
1079//   return incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent);
1080// }
1081
1082/// An in-circle test fast test, lacks the same accuracy as incircle
1083///
1084/// ## Parameters
1085/// - `ax`: x coordinate of first point
1086/// - `ay`: y coordinate of first point
1087/// - `bx`: x coordinate of second point
1088/// - `by`: y coordinate of second point
1089/// - `cx`: x coordinate of third point
1090/// - `cy`: y coordinate of third point
1091/// - `dx`: x coordinate of comparison point
1092/// - `dy`: y coordinate of comparison point
1093///
1094/// ## Returns
1095/// point d is in circle if the return value is less than 0, otherwise not in circle
1096#[allow(clippy::too_many_arguments)]
1097pub fn incirclefast(ax: f64, ay: f64, bx: f64, by: f64, cx: f64, cy: f64, dx: f64, dy: f64) -> f64 {
1098    let adx = ax - dx;
1099    let ady = ay - dy;
1100    let bdx = bx - dx;
1101    let bdy = by - dy;
1102    let cdx = cx - dx;
1103    let cdy = cy - dy;
1104
1105    let abdet = adx * bdy - bdx * ady;
1106    let bcdet = bdx * cdy - cdx * bdy;
1107    let cadet = cdx * ady - adx * cdy;
1108    let alift = adx * adx + ady * ady;
1109    let blift = bdx * bdx + bdy * bdy;
1110    let clift = cdx * cdx + cdy * cdy;
1111
1112    alift * bcdet + blift * cadet + clift * abdet
1113}