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}