source: node_modules/robust-predicates/umd/incircle.js@ e4c61dd

Last change on this file since e4c61dd was e4c61dd, checked in by istevanoska <ilinastevanoska@…>, 6 months ago

Prototype 1.1

  • Property mode set to 100644
File size: 29.8 KB
Line 
1(function (global, factory) {
2typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
3typeof define === 'function' && define.amd ? define(['exports'], factory) :
4(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.predicates = {}));
5})(this, (function (exports) { 'use strict';
6
7const epsilon = 1.1102230246251565e-16;
8const splitter = 134217729;
9const resulterrbound = (3 + 8 * epsilon) * epsilon;
10
11// fast_expansion_sum_zeroelim routine from oritinal code
12function sum(elen, e, flen, f, h) {
13 let Q, Qnew, hh, bvirt;
14 let enow = e[0];
15 let fnow = f[0];
16 let eindex = 0;
17 let findex = 0;
18 if ((fnow > enow) === (fnow > -enow)) {
19 Q = enow;
20 enow = e[++eindex];
21 } else {
22 Q = fnow;
23 fnow = f[++findex];
24 }
25 let hindex = 0;
26 if (eindex < elen && findex < flen) {
27 if ((fnow > enow) === (fnow > -enow)) {
28 Qnew = enow + Q;
29 hh = Q - (Qnew - enow);
30 enow = e[++eindex];
31 } else {
32 Qnew = fnow + Q;
33 hh = Q - (Qnew - fnow);
34 fnow = f[++findex];
35 }
36 Q = Qnew;
37 if (hh !== 0) {
38 h[hindex++] = hh;
39 }
40 while (eindex < elen && findex < flen) {
41 if ((fnow > enow) === (fnow > -enow)) {
42 Qnew = Q + enow;
43 bvirt = Qnew - Q;
44 hh = Q - (Qnew - bvirt) + (enow - bvirt);
45 enow = e[++eindex];
46 } else {
47 Qnew = Q + fnow;
48 bvirt = Qnew - Q;
49 hh = Q - (Qnew - bvirt) + (fnow - bvirt);
50 fnow = f[++findex];
51 }
52 Q = Qnew;
53 if (hh !== 0) {
54 h[hindex++] = hh;
55 }
56 }
57 }
58 while (eindex < elen) {
59 Qnew = Q + enow;
60 bvirt = Qnew - Q;
61 hh = Q - (Qnew - bvirt) + (enow - bvirt);
62 enow = e[++eindex];
63 Q = Qnew;
64 if (hh !== 0) {
65 h[hindex++] = hh;
66 }
67 }
68 while (findex < flen) {
69 Qnew = Q + fnow;
70 bvirt = Qnew - Q;
71 hh = Q - (Qnew - bvirt) + (fnow - bvirt);
72 fnow = f[++findex];
73 Q = Qnew;
74 if (hh !== 0) {
75 h[hindex++] = hh;
76 }
77 }
78 if (Q !== 0 || hindex === 0) {
79 h[hindex++] = Q;
80 }
81 return hindex;
82}
83
84function sum_three(alen, a, blen, b, clen, c, tmp, out) {
85 return sum(sum(alen, a, blen, b, tmp), tmp, clen, c, out);
86}
87
88// scale_expansion_zeroelim routine from oritinal code
89function scale(elen, e, b, h) {
90 let Q, sum, hh, product1, product0;
91 let bvirt, c, ahi, alo, bhi, blo;
92
93 c = splitter * b;
94 bhi = c - (c - b);
95 blo = b - bhi;
96 let enow = e[0];
97 Q = enow * b;
98 c = splitter * enow;
99 ahi = c - (c - enow);
100 alo = enow - ahi;
101 hh = alo * blo - (Q - ahi * bhi - alo * bhi - ahi * blo);
102 let hindex = 0;
103 if (hh !== 0) {
104 h[hindex++] = hh;
105 }
106 for (let i = 1; i < elen; i++) {
107 enow = e[i];
108 product1 = enow * b;
109 c = splitter * enow;
110 ahi = c - (c - enow);
111 alo = enow - ahi;
112 product0 = alo * blo - (product1 - ahi * bhi - alo * bhi - ahi * blo);
113 sum = Q + product0;
114 bvirt = sum - Q;
115 hh = Q - (sum - bvirt) + (product0 - bvirt);
116 if (hh !== 0) {
117 h[hindex++] = hh;
118 }
119 Q = product1 + sum;
120 hh = sum - (Q - product1);
121 if (hh !== 0) {
122 h[hindex++] = hh;
123 }
124 }
125 if (Q !== 0 || hindex === 0) {
126 h[hindex++] = Q;
127 }
128 return hindex;
129}
130
131function estimate(elen, e) {
132 let Q = e[0];
133 for (let i = 1; i < elen; i++) Q += e[i];
134 return Q;
135}
136
137function vec(n) {
138 return new Float64Array(n);
139}
140
141const iccerrboundA = (10 + 96 * epsilon) * epsilon;
142const iccerrboundB = (4 + 48 * epsilon) * epsilon;
143const iccerrboundC = (44 + 576 * epsilon) * epsilon * epsilon;
144
145const bc = vec(4);
146const ca = vec(4);
147const ab = vec(4);
148const aa = vec(4);
149const bb = vec(4);
150const cc = vec(4);
151const u = vec(4);
152const v = vec(4);
153const axtbc = vec(8);
154const aytbc = vec(8);
155const bxtca = vec(8);
156const bytca = vec(8);
157const cxtab = vec(8);
158const cytab = vec(8);
159const abt = vec(8);
160const bct = vec(8);
161const cat = vec(8);
162const abtt = vec(4);
163const bctt = vec(4);
164const catt = vec(4);
165
166const _8 = vec(8);
167const _16 = vec(16);
168const _16b = vec(16);
169const _16c = vec(16);
170const _32 = vec(32);
171const _32b = vec(32);
172const _48 = vec(48);
173const _64 = vec(64);
174
175let fin = vec(1152);
176let fin2 = vec(1152);
177
178function finadd(finlen, a, alen) {
179 finlen = sum(finlen, fin, a, alen, fin2);
180 const tmp = fin; fin = fin2; fin2 = tmp;
181 return finlen;
182}
183
184function incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent) {
185 let finlen;
186 let adxtail, bdxtail, cdxtail, adytail, bdytail, cdytail;
187 let axtbclen, aytbclen, bxtcalen, bytcalen, cxtablen, cytablen;
188 let abtlen, bctlen, catlen;
189 let abttlen, bcttlen, cattlen;
190 let n1, n0;
191
192 let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;
193
194 const adx = ax - dx;
195 const bdx = bx - dx;
196 const cdx = cx - dx;
197 const ady = ay - dy;
198 const bdy = by - dy;
199 const cdy = cy - dy;
200
201 s1 = bdx * cdy;
202 c = splitter * bdx;
203 ahi = c - (c - bdx);
204 alo = bdx - ahi;
205 c = splitter * cdy;
206 bhi = c - (c - cdy);
207 blo = cdy - bhi;
208 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
209 t1 = cdx * bdy;
210 c = splitter * cdx;
211 ahi = c - (c - cdx);
212 alo = cdx - ahi;
213 c = splitter * bdy;
214 bhi = c - (c - bdy);
215 blo = bdy - bhi;
216 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
217 _i = s0 - t0;
218 bvirt = s0 - _i;
219 bc[0] = s0 - (_i + bvirt) + (bvirt - t0);
220 _j = s1 + _i;
221 bvirt = _j - s1;
222 _0 = s1 - (_j - bvirt) + (_i - bvirt);
223 _i = _0 - t1;
224 bvirt = _0 - _i;
225 bc[1] = _0 - (_i + bvirt) + (bvirt - t1);
226 u3 = _j + _i;
227 bvirt = u3 - _j;
228 bc[2] = _j - (u3 - bvirt) + (_i - bvirt);
229 bc[3] = u3;
230 s1 = cdx * ady;
231 c = splitter * cdx;
232 ahi = c - (c - cdx);
233 alo = cdx - ahi;
234 c = splitter * ady;
235 bhi = c - (c - ady);
236 blo = ady - bhi;
237 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
238 t1 = adx * cdy;
239 c = splitter * adx;
240 ahi = c - (c - adx);
241 alo = adx - ahi;
242 c = splitter * cdy;
243 bhi = c - (c - cdy);
244 blo = cdy - bhi;
245 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
246 _i = s0 - t0;
247 bvirt = s0 - _i;
248 ca[0] = s0 - (_i + bvirt) + (bvirt - t0);
249 _j = s1 + _i;
250 bvirt = _j - s1;
251 _0 = s1 - (_j - bvirt) + (_i - bvirt);
252 _i = _0 - t1;
253 bvirt = _0 - _i;
254 ca[1] = _0 - (_i + bvirt) + (bvirt - t1);
255 u3 = _j + _i;
256 bvirt = u3 - _j;
257 ca[2] = _j - (u3 - bvirt) + (_i - bvirt);
258 ca[3] = u3;
259 s1 = adx * bdy;
260 c = splitter * adx;
261 ahi = c - (c - adx);
262 alo = adx - ahi;
263 c = splitter * bdy;
264 bhi = c - (c - bdy);
265 blo = bdy - bhi;
266 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
267 t1 = bdx * ady;
268 c = splitter * bdx;
269 ahi = c - (c - bdx);
270 alo = bdx - ahi;
271 c = splitter * ady;
272 bhi = c - (c - ady);
273 blo = ady - bhi;
274 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
275 _i = s0 - t0;
276 bvirt = s0 - _i;
277 ab[0] = s0 - (_i + bvirt) + (bvirt - t0);
278 _j = s1 + _i;
279 bvirt = _j - s1;
280 _0 = s1 - (_j - bvirt) + (_i - bvirt);
281 _i = _0 - t1;
282 bvirt = _0 - _i;
283 ab[1] = _0 - (_i + bvirt) + (bvirt - t1);
284 u3 = _j + _i;
285 bvirt = u3 - _j;
286 ab[2] = _j - (u3 - bvirt) + (_i - bvirt);
287 ab[3] = u3;
288
289 finlen = sum(
290 sum(
291 sum(
292 scale(scale(4, bc, adx, _8), _8, adx, _16), _16,
293 scale(scale(4, bc, ady, _8), _8, ady, _16b), _16b, _32), _32,
294 sum(
295 scale(scale(4, ca, bdx, _8), _8, bdx, _16), _16,
296 scale(scale(4, ca, bdy, _8), _8, bdy, _16b), _16b, _32b), _32b, _64), _64,
297 sum(
298 scale(scale(4, ab, cdx, _8), _8, cdx, _16), _16,
299 scale(scale(4, ab, cdy, _8), _8, cdy, _16b), _16b, _32), _32, fin);
300
301 let det = estimate(finlen, fin);
302 let errbound = iccerrboundB * permanent;
303 if (det >= errbound || -det >= errbound) {
304 return det;
305 }
306
307 bvirt = ax - adx;
308 adxtail = ax - (adx + bvirt) + (bvirt - dx);
309 bvirt = ay - ady;
310 adytail = ay - (ady + bvirt) + (bvirt - dy);
311 bvirt = bx - bdx;
312 bdxtail = bx - (bdx + bvirt) + (bvirt - dx);
313 bvirt = by - bdy;
314 bdytail = by - (bdy + bvirt) + (bvirt - dy);
315 bvirt = cx - cdx;
316 cdxtail = cx - (cdx + bvirt) + (bvirt - dx);
317 bvirt = cy - cdy;
318 cdytail = cy - (cdy + bvirt) + (bvirt - dy);
319 if (adxtail === 0 && bdxtail === 0 && cdxtail === 0 && adytail === 0 && bdytail === 0 && cdytail === 0) {
320 return det;
321 }
322
323 errbound = iccerrboundC * permanent + resulterrbound * Math.abs(det);
324 det += ((adx * adx + ady * ady) * ((bdx * cdytail + cdy * bdxtail) - (bdy * cdxtail + cdx * bdytail)) +
325 2 * (adx * adxtail + ady * adytail) * (bdx * cdy - bdy * cdx)) +
326 ((bdx * bdx + bdy * bdy) * ((cdx * adytail + ady * cdxtail) - (cdy * adxtail + adx * cdytail)) +
327 2 * (bdx * bdxtail + bdy * bdytail) * (cdx * ady - cdy * adx)) +
328 ((cdx * cdx + cdy * cdy) * ((adx * bdytail + bdy * adxtail) - (ady * bdxtail + bdx * adytail)) +
329 2 * (cdx * cdxtail + cdy * cdytail) * (adx * bdy - ady * bdx));
330
331 if (det >= errbound || -det >= errbound) {
332 return det;
333 }
334
335 if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {
336 s1 = adx * adx;
337 c = splitter * adx;
338 ahi = c - (c - adx);
339 alo = adx - ahi;
340 s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);
341 t1 = ady * ady;
342 c = splitter * ady;
343 ahi = c - (c - ady);
344 alo = ady - ahi;
345 t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);
346 _i = s0 + t0;
347 bvirt = _i - s0;
348 aa[0] = s0 - (_i - bvirt) + (t0 - bvirt);
349 _j = s1 + _i;
350 bvirt = _j - s1;
351 _0 = s1 - (_j - bvirt) + (_i - bvirt);
352 _i = _0 + t1;
353 bvirt = _i - _0;
354 aa[1] = _0 - (_i - bvirt) + (t1 - bvirt);
355 u3 = _j + _i;
356 bvirt = u3 - _j;
357 aa[2] = _j - (u3 - bvirt) + (_i - bvirt);
358 aa[3] = u3;
359 }
360 if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {
361 s1 = bdx * bdx;
362 c = splitter * bdx;
363 ahi = c - (c - bdx);
364 alo = bdx - ahi;
365 s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);
366 t1 = bdy * bdy;
367 c = splitter * bdy;
368 ahi = c - (c - bdy);
369 alo = bdy - ahi;
370 t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);
371 _i = s0 + t0;
372 bvirt = _i - s0;
373 bb[0] = s0 - (_i - bvirt) + (t0 - bvirt);
374 _j = s1 + _i;
375 bvirt = _j - s1;
376 _0 = s1 - (_j - bvirt) + (_i - bvirt);
377 _i = _0 + t1;
378 bvirt = _i - _0;
379 bb[1] = _0 - (_i - bvirt) + (t1 - bvirt);
380 u3 = _j + _i;
381 bvirt = u3 - _j;
382 bb[2] = _j - (u3 - bvirt) + (_i - bvirt);
383 bb[3] = u3;
384 }
385 if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {
386 s1 = cdx * cdx;
387 c = splitter * cdx;
388 ahi = c - (c - cdx);
389 alo = cdx - ahi;
390 s0 = alo * alo - (s1 - ahi * ahi - (ahi + ahi) * alo);
391 t1 = cdy * cdy;
392 c = splitter * cdy;
393 ahi = c - (c - cdy);
394 alo = cdy - ahi;
395 t0 = alo * alo - (t1 - ahi * ahi - (ahi + ahi) * alo);
396 _i = s0 + t0;
397 bvirt = _i - s0;
398 cc[0] = s0 - (_i - bvirt) + (t0 - bvirt);
399 _j = s1 + _i;
400 bvirt = _j - s1;
401 _0 = s1 - (_j - bvirt) + (_i - bvirt);
402 _i = _0 + t1;
403 bvirt = _i - _0;
404 cc[1] = _0 - (_i - bvirt) + (t1 - bvirt);
405 u3 = _j + _i;
406 bvirt = u3 - _j;
407 cc[2] = _j - (u3 - bvirt) + (_i - bvirt);
408 cc[3] = u3;
409 }
410
411 if (adxtail !== 0) {
412 axtbclen = scale(4, bc, adxtail, axtbc);
413 finlen = finadd(finlen, sum_three(
414 scale(axtbclen, axtbc, 2 * adx, _16), _16,
415 scale(scale(4, cc, adxtail, _8), _8, bdy, _16b), _16b,
416 scale(scale(4, bb, adxtail, _8), _8, -cdy, _16c), _16c, _32, _48), _48);
417 }
418 if (adytail !== 0) {
419 aytbclen = scale(4, bc, adytail, aytbc);
420 finlen = finadd(finlen, sum_three(
421 scale(aytbclen, aytbc, 2 * ady, _16), _16,
422 scale(scale(4, bb, adytail, _8), _8, cdx, _16b), _16b,
423 scale(scale(4, cc, adytail, _8), _8, -bdx, _16c), _16c, _32, _48), _48);
424 }
425 if (bdxtail !== 0) {
426 bxtcalen = scale(4, ca, bdxtail, bxtca);
427 finlen = finadd(finlen, sum_three(
428 scale(bxtcalen, bxtca, 2 * bdx, _16), _16,
429 scale(scale(4, aa, bdxtail, _8), _8, cdy, _16b), _16b,
430 scale(scale(4, cc, bdxtail, _8), _8, -ady, _16c), _16c, _32, _48), _48);
431 }
432 if (bdytail !== 0) {
433 bytcalen = scale(4, ca, bdytail, bytca);
434 finlen = finadd(finlen, sum_three(
435 scale(bytcalen, bytca, 2 * bdy, _16), _16,
436 scale(scale(4, cc, bdytail, _8), _8, adx, _16b), _16b,
437 scale(scale(4, aa, bdytail, _8), _8, -cdx, _16c), _16c, _32, _48), _48);
438 }
439 if (cdxtail !== 0) {
440 cxtablen = scale(4, ab, cdxtail, cxtab);
441 finlen = finadd(finlen, sum_three(
442 scale(cxtablen, cxtab, 2 * cdx, _16), _16,
443 scale(scale(4, bb, cdxtail, _8), _8, ady, _16b), _16b,
444 scale(scale(4, aa, cdxtail, _8), _8, -bdy, _16c), _16c, _32, _48), _48);
445 }
446 if (cdytail !== 0) {
447 cytablen = scale(4, ab, cdytail, cytab);
448 finlen = finadd(finlen, sum_three(
449 scale(cytablen, cytab, 2 * cdy, _16), _16,
450 scale(scale(4, aa, cdytail, _8), _8, bdx, _16b), _16b,
451 scale(scale(4, bb, cdytail, _8), _8, -adx, _16c), _16c, _32, _48), _48);
452 }
453
454 if (adxtail !== 0 || adytail !== 0) {
455 if (bdxtail !== 0 || bdytail !== 0 || cdxtail !== 0 || cdytail !== 0) {
456 s1 = bdxtail * cdy;
457 c = splitter * bdxtail;
458 ahi = c - (c - bdxtail);
459 alo = bdxtail - ahi;
460 c = splitter * cdy;
461 bhi = c - (c - cdy);
462 blo = cdy - bhi;
463 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
464 t1 = bdx * cdytail;
465 c = splitter * bdx;
466 ahi = c - (c - bdx);
467 alo = bdx - ahi;
468 c = splitter * cdytail;
469 bhi = c - (c - cdytail);
470 blo = cdytail - bhi;
471 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
472 _i = s0 + t0;
473 bvirt = _i - s0;
474 u[0] = s0 - (_i - bvirt) + (t0 - bvirt);
475 _j = s1 + _i;
476 bvirt = _j - s1;
477 _0 = s1 - (_j - bvirt) + (_i - bvirt);
478 _i = _0 + t1;
479 bvirt = _i - _0;
480 u[1] = _0 - (_i - bvirt) + (t1 - bvirt);
481 u3 = _j + _i;
482 bvirt = u3 - _j;
483 u[2] = _j - (u3 - bvirt) + (_i - bvirt);
484 u[3] = u3;
485 s1 = cdxtail * -bdy;
486 c = splitter * cdxtail;
487 ahi = c - (c - cdxtail);
488 alo = cdxtail - ahi;
489 c = splitter * -bdy;
490 bhi = c - (c - -bdy);
491 blo = -bdy - bhi;
492 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
493 t1 = cdx * -bdytail;
494 c = splitter * cdx;
495 ahi = c - (c - cdx);
496 alo = cdx - ahi;
497 c = splitter * -bdytail;
498 bhi = c - (c - -bdytail);
499 blo = -bdytail - bhi;
500 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
501 _i = s0 + t0;
502 bvirt = _i - s0;
503 v[0] = s0 - (_i - bvirt) + (t0 - bvirt);
504 _j = s1 + _i;
505 bvirt = _j - s1;
506 _0 = s1 - (_j - bvirt) + (_i - bvirt);
507 _i = _0 + t1;
508 bvirt = _i - _0;
509 v[1] = _0 - (_i - bvirt) + (t1 - bvirt);
510 u3 = _j + _i;
511 bvirt = u3 - _j;
512 v[2] = _j - (u3 - bvirt) + (_i - bvirt);
513 v[3] = u3;
514 bctlen = sum(4, u, 4, v, bct);
515 s1 = bdxtail * cdytail;
516 c = splitter * bdxtail;
517 ahi = c - (c - bdxtail);
518 alo = bdxtail - ahi;
519 c = splitter * cdytail;
520 bhi = c - (c - cdytail);
521 blo = cdytail - bhi;
522 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
523 t1 = cdxtail * bdytail;
524 c = splitter * cdxtail;
525 ahi = c - (c - cdxtail);
526 alo = cdxtail - ahi;
527 c = splitter * bdytail;
528 bhi = c - (c - bdytail);
529 blo = bdytail - bhi;
530 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
531 _i = s0 - t0;
532 bvirt = s0 - _i;
533 bctt[0] = s0 - (_i + bvirt) + (bvirt - t0);
534 _j = s1 + _i;
535 bvirt = _j - s1;
536 _0 = s1 - (_j - bvirt) + (_i - bvirt);
537 _i = _0 - t1;
538 bvirt = _0 - _i;
539 bctt[1] = _0 - (_i + bvirt) + (bvirt - t1);
540 u3 = _j + _i;
541 bvirt = u3 - _j;
542 bctt[2] = _j - (u3 - bvirt) + (_i - bvirt);
543 bctt[3] = u3;
544 bcttlen = 4;
545 } else {
546 bct[0] = 0;
547 bctlen = 1;
548 bctt[0] = 0;
549 bcttlen = 1;
550 }
551 if (adxtail !== 0) {
552 const len = scale(bctlen, bct, adxtail, _16c);
553 finlen = finadd(finlen, sum(
554 scale(axtbclen, axtbc, adxtail, _16), _16,
555 scale(len, _16c, 2 * adx, _32), _32, _48), _48);
556
557 const len2 = scale(bcttlen, bctt, adxtail, _8);
558 finlen = finadd(finlen, sum_three(
559 scale(len2, _8, 2 * adx, _16), _16,
560 scale(len2, _8, adxtail, _16b), _16b,
561 scale(len, _16c, adxtail, _32), _32, _32b, _64), _64);
562
563 if (bdytail !== 0) {
564 finlen = finadd(finlen, scale(scale(4, cc, adxtail, _8), _8, bdytail, _16), _16);
565 }
566 if (cdytail !== 0) {
567 finlen = finadd(finlen, scale(scale(4, bb, -adxtail, _8), _8, cdytail, _16), _16);
568 }
569 }
570 if (adytail !== 0) {
571 const len = scale(bctlen, bct, adytail, _16c);
572 finlen = finadd(finlen, sum(
573 scale(aytbclen, aytbc, adytail, _16), _16,
574 scale(len, _16c, 2 * ady, _32), _32, _48), _48);
575
576 const len2 = scale(bcttlen, bctt, adytail, _8);
577 finlen = finadd(finlen, sum_three(
578 scale(len2, _8, 2 * ady, _16), _16,
579 scale(len2, _8, adytail, _16b), _16b,
580 scale(len, _16c, adytail, _32), _32, _32b, _64), _64);
581 }
582 }
583 if (bdxtail !== 0 || bdytail !== 0) {
584 if (cdxtail !== 0 || cdytail !== 0 || adxtail !== 0 || adytail !== 0) {
585 s1 = cdxtail * ady;
586 c = splitter * cdxtail;
587 ahi = c - (c - cdxtail);
588 alo = cdxtail - ahi;
589 c = splitter * ady;
590 bhi = c - (c - ady);
591 blo = ady - bhi;
592 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
593 t1 = cdx * adytail;
594 c = splitter * cdx;
595 ahi = c - (c - cdx);
596 alo = cdx - ahi;
597 c = splitter * adytail;
598 bhi = c - (c - adytail);
599 blo = adytail - bhi;
600 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
601 _i = s0 + t0;
602 bvirt = _i - s0;
603 u[0] = s0 - (_i - bvirt) + (t0 - bvirt);
604 _j = s1 + _i;
605 bvirt = _j - s1;
606 _0 = s1 - (_j - bvirt) + (_i - bvirt);
607 _i = _0 + t1;
608 bvirt = _i - _0;
609 u[1] = _0 - (_i - bvirt) + (t1 - bvirt);
610 u3 = _j + _i;
611 bvirt = u3 - _j;
612 u[2] = _j - (u3 - bvirt) + (_i - bvirt);
613 u[3] = u3;
614 n1 = -cdy;
615 n0 = -cdytail;
616 s1 = adxtail * n1;
617 c = splitter * adxtail;
618 ahi = c - (c - adxtail);
619 alo = adxtail - ahi;
620 c = splitter * n1;
621 bhi = c - (c - n1);
622 blo = n1 - bhi;
623 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
624 t1 = adx * n0;
625 c = splitter * adx;
626 ahi = c - (c - adx);
627 alo = adx - ahi;
628 c = splitter * n0;
629 bhi = c - (c - n0);
630 blo = n0 - bhi;
631 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
632 _i = s0 + t0;
633 bvirt = _i - s0;
634 v[0] = s0 - (_i - bvirt) + (t0 - bvirt);
635 _j = s1 + _i;
636 bvirt = _j - s1;
637 _0 = s1 - (_j - bvirt) + (_i - bvirt);
638 _i = _0 + t1;
639 bvirt = _i - _0;
640 v[1] = _0 - (_i - bvirt) + (t1 - bvirt);
641 u3 = _j + _i;
642 bvirt = u3 - _j;
643 v[2] = _j - (u3 - bvirt) + (_i - bvirt);
644 v[3] = u3;
645 catlen = sum(4, u, 4, v, cat);
646 s1 = cdxtail * adytail;
647 c = splitter * cdxtail;
648 ahi = c - (c - cdxtail);
649 alo = cdxtail - ahi;
650 c = splitter * adytail;
651 bhi = c - (c - adytail);
652 blo = adytail - bhi;
653 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
654 t1 = adxtail * cdytail;
655 c = splitter * adxtail;
656 ahi = c - (c - adxtail);
657 alo = adxtail - ahi;
658 c = splitter * cdytail;
659 bhi = c - (c - cdytail);
660 blo = cdytail - bhi;
661 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
662 _i = s0 - t0;
663 bvirt = s0 - _i;
664 catt[0] = s0 - (_i + bvirt) + (bvirt - t0);
665 _j = s1 + _i;
666 bvirt = _j - s1;
667 _0 = s1 - (_j - bvirt) + (_i - bvirt);
668 _i = _0 - t1;
669 bvirt = _0 - _i;
670 catt[1] = _0 - (_i + bvirt) + (bvirt - t1);
671 u3 = _j + _i;
672 bvirt = u3 - _j;
673 catt[2] = _j - (u3 - bvirt) + (_i - bvirt);
674 catt[3] = u3;
675 cattlen = 4;
676 } else {
677 cat[0] = 0;
678 catlen = 1;
679 catt[0] = 0;
680 cattlen = 1;
681 }
682 if (bdxtail !== 0) {
683 const len = scale(catlen, cat, bdxtail, _16c);
684 finlen = finadd(finlen, sum(
685 scale(bxtcalen, bxtca, bdxtail, _16), _16,
686 scale(len, _16c, 2 * bdx, _32), _32, _48), _48);
687
688 const len2 = scale(cattlen, catt, bdxtail, _8);
689 finlen = finadd(finlen, sum_three(
690 scale(len2, _8, 2 * bdx, _16), _16,
691 scale(len2, _8, bdxtail, _16b), _16b,
692 scale(len, _16c, bdxtail, _32), _32, _32b, _64), _64);
693
694 if (cdytail !== 0) {
695 finlen = finadd(finlen, scale(scale(4, aa, bdxtail, _8), _8, cdytail, _16), _16);
696 }
697 if (adytail !== 0) {
698 finlen = finadd(finlen, scale(scale(4, cc, -bdxtail, _8), _8, adytail, _16), _16);
699 }
700 }
701 if (bdytail !== 0) {
702 const len = scale(catlen, cat, bdytail, _16c);
703 finlen = finadd(finlen, sum(
704 scale(bytcalen, bytca, bdytail, _16), _16,
705 scale(len, _16c, 2 * bdy, _32), _32, _48), _48);
706
707 const len2 = scale(cattlen, catt, bdytail, _8);
708 finlen = finadd(finlen, sum_three(
709 scale(len2, _8, 2 * bdy, _16), _16,
710 scale(len2, _8, bdytail, _16b), _16b,
711 scale(len, _16c, bdytail, _32), _32, _32b, _64), _64);
712 }
713 }
714 if (cdxtail !== 0 || cdytail !== 0) {
715 if (adxtail !== 0 || adytail !== 0 || bdxtail !== 0 || bdytail !== 0) {
716 s1 = adxtail * bdy;
717 c = splitter * adxtail;
718 ahi = c - (c - adxtail);
719 alo = adxtail - ahi;
720 c = splitter * bdy;
721 bhi = c - (c - bdy);
722 blo = bdy - bhi;
723 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
724 t1 = adx * bdytail;
725 c = splitter * adx;
726 ahi = c - (c - adx);
727 alo = adx - ahi;
728 c = splitter * bdytail;
729 bhi = c - (c - bdytail);
730 blo = bdytail - bhi;
731 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
732 _i = s0 + t0;
733 bvirt = _i - s0;
734 u[0] = s0 - (_i - bvirt) + (t0 - bvirt);
735 _j = s1 + _i;
736 bvirt = _j - s1;
737 _0 = s1 - (_j - bvirt) + (_i - bvirt);
738 _i = _0 + t1;
739 bvirt = _i - _0;
740 u[1] = _0 - (_i - bvirt) + (t1 - bvirt);
741 u3 = _j + _i;
742 bvirt = u3 - _j;
743 u[2] = _j - (u3 - bvirt) + (_i - bvirt);
744 u[3] = u3;
745 n1 = -ady;
746 n0 = -adytail;
747 s1 = bdxtail * n1;
748 c = splitter * bdxtail;
749 ahi = c - (c - bdxtail);
750 alo = bdxtail - ahi;
751 c = splitter * n1;
752 bhi = c - (c - n1);
753 blo = n1 - bhi;
754 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
755 t1 = bdx * n0;
756 c = splitter * bdx;
757 ahi = c - (c - bdx);
758 alo = bdx - ahi;
759 c = splitter * n0;
760 bhi = c - (c - n0);
761 blo = n0 - bhi;
762 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
763 _i = s0 + t0;
764 bvirt = _i - s0;
765 v[0] = s0 - (_i - bvirt) + (t0 - bvirt);
766 _j = s1 + _i;
767 bvirt = _j - s1;
768 _0 = s1 - (_j - bvirt) + (_i - bvirt);
769 _i = _0 + t1;
770 bvirt = _i - _0;
771 v[1] = _0 - (_i - bvirt) + (t1 - bvirt);
772 u3 = _j + _i;
773 bvirt = u3 - _j;
774 v[2] = _j - (u3 - bvirt) + (_i - bvirt);
775 v[3] = u3;
776 abtlen = sum(4, u, 4, v, abt);
777 s1 = adxtail * bdytail;
778 c = splitter * adxtail;
779 ahi = c - (c - adxtail);
780 alo = adxtail - ahi;
781 c = splitter * bdytail;
782 bhi = c - (c - bdytail);
783 blo = bdytail - bhi;
784 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
785 t1 = bdxtail * adytail;
786 c = splitter * bdxtail;
787 ahi = c - (c - bdxtail);
788 alo = bdxtail - ahi;
789 c = splitter * adytail;
790 bhi = c - (c - adytail);
791 blo = adytail - bhi;
792 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
793 _i = s0 - t0;
794 bvirt = s0 - _i;
795 abtt[0] = s0 - (_i + bvirt) + (bvirt - t0);
796 _j = s1 + _i;
797 bvirt = _j - s1;
798 _0 = s1 - (_j - bvirt) + (_i - bvirt);
799 _i = _0 - t1;
800 bvirt = _0 - _i;
801 abtt[1] = _0 - (_i + bvirt) + (bvirt - t1);
802 u3 = _j + _i;
803 bvirt = u3 - _j;
804 abtt[2] = _j - (u3 - bvirt) + (_i - bvirt);
805 abtt[3] = u3;
806 abttlen = 4;
807 } else {
808 abt[0] = 0;
809 abtlen = 1;
810 abtt[0] = 0;
811 abttlen = 1;
812 }
813 if (cdxtail !== 0) {
814 const len = scale(abtlen, abt, cdxtail, _16c);
815 finlen = finadd(finlen, sum(
816 scale(cxtablen, cxtab, cdxtail, _16), _16,
817 scale(len, _16c, 2 * cdx, _32), _32, _48), _48);
818
819 const len2 = scale(abttlen, abtt, cdxtail, _8);
820 finlen = finadd(finlen, sum_three(
821 scale(len2, _8, 2 * cdx, _16), _16,
822 scale(len2, _8, cdxtail, _16b), _16b,
823 scale(len, _16c, cdxtail, _32), _32, _32b, _64), _64);
824
825 if (adytail !== 0) {
826 finlen = finadd(finlen, scale(scale(4, bb, cdxtail, _8), _8, adytail, _16), _16);
827 }
828 if (bdytail !== 0) {
829 finlen = finadd(finlen, scale(scale(4, aa, -cdxtail, _8), _8, bdytail, _16), _16);
830 }
831 }
832 if (cdytail !== 0) {
833 const len = scale(abtlen, abt, cdytail, _16c);
834 finlen = finadd(finlen, sum(
835 scale(cytablen, cytab, cdytail, _16), _16,
836 scale(len, _16c, 2 * cdy, _32), _32, _48), _48);
837
838 const len2 = scale(abttlen, abtt, cdytail, _8);
839 finlen = finadd(finlen, sum_three(
840 scale(len2, _8, 2 * cdy, _16), _16,
841 scale(len2, _8, cdytail, _16b), _16b,
842 scale(len, _16c, cdytail, _32), _32, _32b, _64), _64);
843 }
844 }
845
846 return fin[finlen - 1];
847}
848
849function incircle(ax, ay, bx, by, cx, cy, dx, dy) {
850 const adx = ax - dx;
851 const bdx = bx - dx;
852 const cdx = cx - dx;
853 const ady = ay - dy;
854 const bdy = by - dy;
855 const cdy = cy - dy;
856
857 const bdxcdy = bdx * cdy;
858 const cdxbdy = cdx * bdy;
859 const alift = adx * adx + ady * ady;
860
861 const cdxady = cdx * ady;
862 const adxcdy = adx * cdy;
863 const blift = bdx * bdx + bdy * bdy;
864
865 const adxbdy = adx * bdy;
866 const bdxady = bdx * ady;
867 const clift = cdx * cdx + cdy * cdy;
868
869 const det =
870 alift * (bdxcdy - cdxbdy) +
871 blift * (cdxady - adxcdy) +
872 clift * (adxbdy - bdxady);
873
874 const permanent =
875 (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * alift +
876 (Math.abs(cdxady) + Math.abs(adxcdy)) * blift +
877 (Math.abs(adxbdy) + Math.abs(bdxady)) * clift;
878
879 const errbound = iccerrboundA * permanent;
880
881 if (det > errbound || -det > errbound) {
882 return det;
883 }
884 return incircleadapt(ax, ay, bx, by, cx, cy, dx, dy, permanent);
885}
886
887function incirclefast(ax, ay, bx, by, cx, cy, dx, dy) {
888 const adx = ax - dx;
889 const ady = ay - dy;
890 const bdx = bx - dx;
891 const bdy = by - dy;
892 const cdx = cx - dx;
893 const cdy = cy - dy;
894
895 const abdet = adx * bdy - bdx * ady;
896 const bcdet = bdx * cdy - cdx * bdy;
897 const cadet = cdx * ady - adx * cdy;
898 const alift = adx * adx + ady * ady;
899 const blift = bdx * bdx + bdy * bdy;
900 const clift = cdx * cdx + cdy * cdy;
901
902 return alift * bcdet + blift * cadet + clift * abdet;
903}
904
905exports.incircle = incircle;
906exports.incirclefast = incirclefast;
907
908}));
Note: See TracBrowser for help on using the repository browser.