source: node_modules/robust-predicates/umd/insphere.js

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

Prototype 1.1

  • Property mode set to 100644
File size: 27.2 KB
RevLine 
[e4c61dd]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 negate(elen, e) {
132 for (let i = 0; i < elen; i++) e[i] = -e[i];
133 return elen;
134}
135
136function estimate(elen, e) {
137 let Q = e[0];
138 for (let i = 1; i < elen; i++) Q += e[i];
139 return Q;
140}
141
142function vec(n) {
143 return new Float64Array(n);
144}
145
146const isperrboundA = (16 + 224 * epsilon) * epsilon;
147const isperrboundB = (5 + 72 * epsilon) * epsilon;
148const isperrboundC = (71 + 1408 * epsilon) * epsilon * epsilon;
149
150const ab = vec(4);
151const bc = vec(4);
152const cd = vec(4);
153const de = vec(4);
154const ea = vec(4);
155const ac = vec(4);
156const bd = vec(4);
157const ce = vec(4);
158const da = vec(4);
159const eb = vec(4);
160
161const abc = vec(24);
162const bcd = vec(24);
163const cde = vec(24);
164const dea = vec(24);
165const eab = vec(24);
166const abd = vec(24);
167const bce = vec(24);
168const cda = vec(24);
169const deb = vec(24);
170const eac = vec(24);
171
172const adet = vec(1152);
173const bdet = vec(1152);
174const cdet = vec(1152);
175const ddet = vec(1152);
176const edet = vec(1152);
177const abdet = vec(2304);
178const cddet = vec(2304);
179const cdedet = vec(3456);
180const deter = vec(5760);
181
182const _8 = vec(8);
183const _8b = vec(8);
184const _8c = vec(8);
185const _16 = vec(16);
186const _24 = vec(24);
187const _48 = vec(48);
188const _48b = vec(48);
189const _96 = vec(96);
190const _192 = vec(192);
191const _384x = vec(384);
192const _384y = vec(384);
193const _384z = vec(384);
194const _768 = vec(768);
195
196function sum_three_scale(a, b, c, az, bz, cz, out) {
197 return sum_three(
198 scale(4, a, az, _8), _8,
199 scale(4, b, bz, _8b), _8b,
200 scale(4, c, cz, _8c), _8c, _16, out);
201}
202
203function liftexact(alen, a, blen, b, clen, c, dlen, d, x, y, z, out) {
204 const len = sum(
205 sum(alen, a, blen, b, _48), _48,
206 negate(sum(clen, c, dlen, d, _48b), _48b), _48b, _96);
207
208 return sum_three(
209 scale(scale(len, _96, x, _192), _192, x, _384x), _384x,
210 scale(scale(len, _96, y, _192), _192, y, _384y), _384y,
211 scale(scale(len, _96, z, _192), _192, z, _384z), _384z, _768, out);
212}
213
214function insphereexact(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez) {
215 let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0, u3;
216
217 s1 = ax * by;
218 c = splitter * ax;
219 ahi = c - (c - ax);
220 alo = ax - ahi;
221 c = splitter * by;
222 bhi = c - (c - by);
223 blo = by - bhi;
224 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
225 t1 = bx * ay;
226 c = splitter * bx;
227 ahi = c - (c - bx);
228 alo = bx - ahi;
229 c = splitter * ay;
230 bhi = c - (c - ay);
231 blo = ay - bhi;
232 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
233 _i = s0 - t0;
234 bvirt = s0 - _i;
235 ab[0] = s0 - (_i + bvirt) + (bvirt - t0);
236 _j = s1 + _i;
237 bvirt = _j - s1;
238 _0 = s1 - (_j - bvirt) + (_i - bvirt);
239 _i = _0 - t1;
240 bvirt = _0 - _i;
241 ab[1] = _0 - (_i + bvirt) + (bvirt - t1);
242 u3 = _j + _i;
243 bvirt = u3 - _j;
244 ab[2] = _j - (u3 - bvirt) + (_i - bvirt);
245 ab[3] = u3;
246 s1 = bx * cy;
247 c = splitter * bx;
248 ahi = c - (c - bx);
249 alo = bx - ahi;
250 c = splitter * cy;
251 bhi = c - (c - cy);
252 blo = cy - bhi;
253 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
254 t1 = cx * by;
255 c = splitter * cx;
256 ahi = c - (c - cx);
257 alo = cx - ahi;
258 c = splitter * by;
259 bhi = c - (c - by);
260 blo = by - bhi;
261 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
262 _i = s0 - t0;
263 bvirt = s0 - _i;
264 bc[0] = s0 - (_i + bvirt) + (bvirt - t0);
265 _j = s1 + _i;
266 bvirt = _j - s1;
267 _0 = s1 - (_j - bvirt) + (_i - bvirt);
268 _i = _0 - t1;
269 bvirt = _0 - _i;
270 bc[1] = _0 - (_i + bvirt) + (bvirt - t1);
271 u3 = _j + _i;
272 bvirt = u3 - _j;
273 bc[2] = _j - (u3 - bvirt) + (_i - bvirt);
274 bc[3] = u3;
275 s1 = cx * dy;
276 c = splitter * cx;
277 ahi = c - (c - cx);
278 alo = cx - ahi;
279 c = splitter * dy;
280 bhi = c - (c - dy);
281 blo = dy - bhi;
282 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
283 t1 = dx * cy;
284 c = splitter * dx;
285 ahi = c - (c - dx);
286 alo = dx - ahi;
287 c = splitter * cy;
288 bhi = c - (c - cy);
289 blo = cy - bhi;
290 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
291 _i = s0 - t0;
292 bvirt = s0 - _i;
293 cd[0] = s0 - (_i + bvirt) + (bvirt - t0);
294 _j = s1 + _i;
295 bvirt = _j - s1;
296 _0 = s1 - (_j - bvirt) + (_i - bvirt);
297 _i = _0 - t1;
298 bvirt = _0 - _i;
299 cd[1] = _0 - (_i + bvirt) + (bvirt - t1);
300 u3 = _j + _i;
301 bvirt = u3 - _j;
302 cd[2] = _j - (u3 - bvirt) + (_i - bvirt);
303 cd[3] = u3;
304 s1 = dx * ey;
305 c = splitter * dx;
306 ahi = c - (c - dx);
307 alo = dx - ahi;
308 c = splitter * ey;
309 bhi = c - (c - ey);
310 blo = ey - bhi;
311 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
312 t1 = ex * dy;
313 c = splitter * ex;
314 ahi = c - (c - ex);
315 alo = ex - ahi;
316 c = splitter * dy;
317 bhi = c - (c - dy);
318 blo = dy - bhi;
319 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
320 _i = s0 - t0;
321 bvirt = s0 - _i;
322 de[0] = s0 - (_i + bvirt) + (bvirt - t0);
323 _j = s1 + _i;
324 bvirt = _j - s1;
325 _0 = s1 - (_j - bvirt) + (_i - bvirt);
326 _i = _0 - t1;
327 bvirt = _0 - _i;
328 de[1] = _0 - (_i + bvirt) + (bvirt - t1);
329 u3 = _j + _i;
330 bvirt = u3 - _j;
331 de[2] = _j - (u3 - bvirt) + (_i - bvirt);
332 de[3] = u3;
333 s1 = ex * ay;
334 c = splitter * ex;
335 ahi = c - (c - ex);
336 alo = ex - ahi;
337 c = splitter * ay;
338 bhi = c - (c - ay);
339 blo = ay - bhi;
340 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
341 t1 = ax * ey;
342 c = splitter * ax;
343 ahi = c - (c - ax);
344 alo = ax - ahi;
345 c = splitter * ey;
346 bhi = c - (c - ey);
347 blo = ey - bhi;
348 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
349 _i = s0 - t0;
350 bvirt = s0 - _i;
351 ea[0] = s0 - (_i + bvirt) + (bvirt - t0);
352 _j = s1 + _i;
353 bvirt = _j - s1;
354 _0 = s1 - (_j - bvirt) + (_i - bvirt);
355 _i = _0 - t1;
356 bvirt = _0 - _i;
357 ea[1] = _0 - (_i + bvirt) + (bvirt - t1);
358 u3 = _j + _i;
359 bvirt = u3 - _j;
360 ea[2] = _j - (u3 - bvirt) + (_i - bvirt);
361 ea[3] = u3;
362 s1 = ax * cy;
363 c = splitter * ax;
364 ahi = c - (c - ax);
365 alo = ax - ahi;
366 c = splitter * cy;
367 bhi = c - (c - cy);
368 blo = cy - bhi;
369 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
370 t1 = cx * ay;
371 c = splitter * cx;
372 ahi = c - (c - cx);
373 alo = cx - ahi;
374 c = splitter * ay;
375 bhi = c - (c - ay);
376 blo = ay - bhi;
377 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
378 _i = s0 - t0;
379 bvirt = s0 - _i;
380 ac[0] = s0 - (_i + bvirt) + (bvirt - t0);
381 _j = s1 + _i;
382 bvirt = _j - s1;
383 _0 = s1 - (_j - bvirt) + (_i - bvirt);
384 _i = _0 - t1;
385 bvirt = _0 - _i;
386 ac[1] = _0 - (_i + bvirt) + (bvirt - t1);
387 u3 = _j + _i;
388 bvirt = u3 - _j;
389 ac[2] = _j - (u3 - bvirt) + (_i - bvirt);
390 ac[3] = u3;
391 s1 = bx * dy;
392 c = splitter * bx;
393 ahi = c - (c - bx);
394 alo = bx - ahi;
395 c = splitter * dy;
396 bhi = c - (c - dy);
397 blo = dy - bhi;
398 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
399 t1 = dx * by;
400 c = splitter * dx;
401 ahi = c - (c - dx);
402 alo = dx - ahi;
403 c = splitter * by;
404 bhi = c - (c - by);
405 blo = by - bhi;
406 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
407 _i = s0 - t0;
408 bvirt = s0 - _i;
409 bd[0] = s0 - (_i + bvirt) + (bvirt - t0);
410 _j = s1 + _i;
411 bvirt = _j - s1;
412 _0 = s1 - (_j - bvirt) + (_i - bvirt);
413 _i = _0 - t1;
414 bvirt = _0 - _i;
415 bd[1] = _0 - (_i + bvirt) + (bvirt - t1);
416 u3 = _j + _i;
417 bvirt = u3 - _j;
418 bd[2] = _j - (u3 - bvirt) + (_i - bvirt);
419 bd[3] = u3;
420 s1 = cx * ey;
421 c = splitter * cx;
422 ahi = c - (c - cx);
423 alo = cx - ahi;
424 c = splitter * ey;
425 bhi = c - (c - ey);
426 blo = ey - bhi;
427 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
428 t1 = ex * cy;
429 c = splitter * ex;
430 ahi = c - (c - ex);
431 alo = ex - ahi;
432 c = splitter * cy;
433 bhi = c - (c - cy);
434 blo = cy - bhi;
435 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
436 _i = s0 - t0;
437 bvirt = s0 - _i;
438 ce[0] = s0 - (_i + bvirt) + (bvirt - t0);
439 _j = s1 + _i;
440 bvirt = _j - s1;
441 _0 = s1 - (_j - bvirt) + (_i - bvirt);
442 _i = _0 - t1;
443 bvirt = _0 - _i;
444 ce[1] = _0 - (_i + bvirt) + (bvirt - t1);
445 u3 = _j + _i;
446 bvirt = u3 - _j;
447 ce[2] = _j - (u3 - bvirt) + (_i - bvirt);
448 ce[3] = u3;
449 s1 = dx * ay;
450 c = splitter * dx;
451 ahi = c - (c - dx);
452 alo = dx - ahi;
453 c = splitter * ay;
454 bhi = c - (c - ay);
455 blo = ay - bhi;
456 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
457 t1 = ax * dy;
458 c = splitter * ax;
459 ahi = c - (c - ax);
460 alo = ax - ahi;
461 c = splitter * dy;
462 bhi = c - (c - dy);
463 blo = dy - bhi;
464 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
465 _i = s0 - t0;
466 bvirt = s0 - _i;
467 da[0] = s0 - (_i + bvirt) + (bvirt - t0);
468 _j = s1 + _i;
469 bvirt = _j - s1;
470 _0 = s1 - (_j - bvirt) + (_i - bvirt);
471 _i = _0 - t1;
472 bvirt = _0 - _i;
473 da[1] = _0 - (_i + bvirt) + (bvirt - t1);
474 u3 = _j + _i;
475 bvirt = u3 - _j;
476 da[2] = _j - (u3 - bvirt) + (_i - bvirt);
477 da[3] = u3;
478 s1 = ex * by;
479 c = splitter * ex;
480 ahi = c - (c - ex);
481 alo = ex - ahi;
482 c = splitter * by;
483 bhi = c - (c - by);
484 blo = by - bhi;
485 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
486 t1 = bx * ey;
487 c = splitter * bx;
488 ahi = c - (c - bx);
489 alo = bx - ahi;
490 c = splitter * ey;
491 bhi = c - (c - ey);
492 blo = ey - bhi;
493 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
494 _i = s0 - t0;
495 bvirt = s0 - _i;
496 eb[0] = s0 - (_i + bvirt) + (bvirt - t0);
497 _j = s1 + _i;
498 bvirt = _j - s1;
499 _0 = s1 - (_j - bvirt) + (_i - bvirt);
500 _i = _0 - t1;
501 bvirt = _0 - _i;
502 eb[1] = _0 - (_i + bvirt) + (bvirt - t1);
503 u3 = _j + _i;
504 bvirt = u3 - _j;
505 eb[2] = _j - (u3 - bvirt) + (_i - bvirt);
506 eb[3] = u3;
507
508 const abclen = sum_three_scale(ab, bc, ac, cz, az, -bz, abc);
509 const bcdlen = sum_three_scale(bc, cd, bd, dz, bz, -cz, bcd);
510 const cdelen = sum_three_scale(cd, de, ce, ez, cz, -dz, cde);
511 const dealen = sum_three_scale(de, ea, da, az, dz, -ez, dea);
512 const eablen = sum_three_scale(ea, ab, eb, bz, ez, -az, eab);
513 const abdlen = sum_three_scale(ab, bd, da, dz, az, bz, abd);
514 const bcelen = sum_three_scale(bc, ce, eb, ez, bz, cz, bce);
515 const cdalen = sum_three_scale(cd, da, ac, az, cz, dz, cda);
516 const deblen = sum_three_scale(de, eb, bd, bz, dz, ez, deb);
517 const eaclen = sum_three_scale(ea, ac, ce, cz, ez, az, eac);
518
519 const deterlen = sum_three(
520 liftexact(cdelen, cde, bcelen, bce, deblen, deb, bcdlen, bcd, ax, ay, az, adet), adet,
521 liftexact(dealen, dea, cdalen, cda, eaclen, eac, cdelen, cde, bx, by, bz, bdet), bdet,
522 sum_three(
523 liftexact(eablen, eab, deblen, deb, abdlen, abd, dealen, dea, cx, cy, cz, cdet), cdet,
524 liftexact(abclen, abc, eaclen, eac, bcelen, bce, eablen, eab, dx, dy, dz, ddet), ddet,
525 liftexact(bcdlen, bcd, abdlen, abd, cdalen, cda, abclen, abc, ex, ey, ez, edet), edet, cddet, cdedet), cdedet, abdet, deter);
526
527 return deter[deterlen - 1];
528}
529
530const xdet = vec(96);
531const ydet = vec(96);
532const zdet = vec(96);
533const fin = vec(1152);
534
535function liftadapt(a, b, c, az, bz, cz, x, y, z, out) {
536 const len = sum_three_scale(a, b, c, az, bz, cz, _24);
537 return sum_three(
538 scale(scale(len, _24, x, _48), _48, x, xdet), xdet,
539 scale(scale(len, _24, y, _48), _48, y, ydet), ydet,
540 scale(scale(len, _24, z, _48), _48, z, zdet), zdet, _192, out);
541}
542
543function insphereadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez, permanent) {
544 let ab3, bc3, cd3, da3, ac3, bd3;
545
546 let aextail, bextail, cextail, dextail;
547 let aeytail, beytail, ceytail, deytail;
548 let aeztail, beztail, ceztail, deztail;
549
550 let bvirt, c, ahi, alo, bhi, blo, _i, _j, _0, s1, s0, t1, t0;
551
552 const aex = ax - ex;
553 const bex = bx - ex;
554 const cex = cx - ex;
555 const dex = dx - ex;
556 const aey = ay - ey;
557 const bey = by - ey;
558 const cey = cy - ey;
559 const dey = dy - ey;
560 const aez = az - ez;
561 const bez = bz - ez;
562 const cez = cz - ez;
563 const dez = dz - ez;
564
565 s1 = aex * bey;
566 c = splitter * aex;
567 ahi = c - (c - aex);
568 alo = aex - ahi;
569 c = splitter * bey;
570 bhi = c - (c - bey);
571 blo = bey - bhi;
572 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
573 t1 = bex * aey;
574 c = splitter * bex;
575 ahi = c - (c - bex);
576 alo = bex - ahi;
577 c = splitter * aey;
578 bhi = c - (c - aey);
579 blo = aey - bhi;
580 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
581 _i = s0 - t0;
582 bvirt = s0 - _i;
583 ab[0] = s0 - (_i + bvirt) + (bvirt - t0);
584 _j = s1 + _i;
585 bvirt = _j - s1;
586 _0 = s1 - (_j - bvirt) + (_i - bvirt);
587 _i = _0 - t1;
588 bvirt = _0 - _i;
589 ab[1] = _0 - (_i + bvirt) + (bvirt - t1);
590 ab3 = _j + _i;
591 bvirt = ab3 - _j;
592 ab[2] = _j - (ab3 - bvirt) + (_i - bvirt);
593 ab[3] = ab3;
594 s1 = bex * cey;
595 c = splitter * bex;
596 ahi = c - (c - bex);
597 alo = bex - ahi;
598 c = splitter * cey;
599 bhi = c - (c - cey);
600 blo = cey - bhi;
601 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
602 t1 = cex * bey;
603 c = splitter * cex;
604 ahi = c - (c - cex);
605 alo = cex - ahi;
606 c = splitter * bey;
607 bhi = c - (c - bey);
608 blo = bey - bhi;
609 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
610 _i = s0 - t0;
611 bvirt = s0 - _i;
612 bc[0] = s0 - (_i + bvirt) + (bvirt - t0);
613 _j = s1 + _i;
614 bvirt = _j - s1;
615 _0 = s1 - (_j - bvirt) + (_i - bvirt);
616 _i = _0 - t1;
617 bvirt = _0 - _i;
618 bc[1] = _0 - (_i + bvirt) + (bvirt - t1);
619 bc3 = _j + _i;
620 bvirt = bc3 - _j;
621 bc[2] = _j - (bc3 - bvirt) + (_i - bvirt);
622 bc[3] = bc3;
623 s1 = cex * dey;
624 c = splitter * cex;
625 ahi = c - (c - cex);
626 alo = cex - ahi;
627 c = splitter * dey;
628 bhi = c - (c - dey);
629 blo = dey - bhi;
630 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
631 t1 = dex * cey;
632 c = splitter * dex;
633 ahi = c - (c - dex);
634 alo = dex - ahi;
635 c = splitter * cey;
636 bhi = c - (c - cey);
637 blo = cey - bhi;
638 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
639 _i = s0 - t0;
640 bvirt = s0 - _i;
641 cd[0] = s0 - (_i + bvirt) + (bvirt - t0);
642 _j = s1 + _i;
643 bvirt = _j - s1;
644 _0 = s1 - (_j - bvirt) + (_i - bvirt);
645 _i = _0 - t1;
646 bvirt = _0 - _i;
647 cd[1] = _0 - (_i + bvirt) + (bvirt - t1);
648 cd3 = _j + _i;
649 bvirt = cd3 - _j;
650 cd[2] = _j - (cd3 - bvirt) + (_i - bvirt);
651 cd[3] = cd3;
652 s1 = dex * aey;
653 c = splitter * dex;
654 ahi = c - (c - dex);
655 alo = dex - ahi;
656 c = splitter * aey;
657 bhi = c - (c - aey);
658 blo = aey - bhi;
659 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
660 t1 = aex * dey;
661 c = splitter * aex;
662 ahi = c - (c - aex);
663 alo = aex - ahi;
664 c = splitter * dey;
665 bhi = c - (c - dey);
666 blo = dey - bhi;
667 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
668 _i = s0 - t0;
669 bvirt = s0 - _i;
670 da[0] = s0 - (_i + bvirt) + (bvirt - t0);
671 _j = s1 + _i;
672 bvirt = _j - s1;
673 _0 = s1 - (_j - bvirt) + (_i - bvirt);
674 _i = _0 - t1;
675 bvirt = _0 - _i;
676 da[1] = _0 - (_i + bvirt) + (bvirt - t1);
677 da3 = _j + _i;
678 bvirt = da3 - _j;
679 da[2] = _j - (da3 - bvirt) + (_i - bvirt);
680 da[3] = da3;
681 s1 = aex * cey;
682 c = splitter * aex;
683 ahi = c - (c - aex);
684 alo = aex - ahi;
685 c = splitter * cey;
686 bhi = c - (c - cey);
687 blo = cey - bhi;
688 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
689 t1 = cex * aey;
690 c = splitter * cex;
691 ahi = c - (c - cex);
692 alo = cex - ahi;
693 c = splitter * aey;
694 bhi = c - (c - aey);
695 blo = aey - bhi;
696 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
697 _i = s0 - t0;
698 bvirt = s0 - _i;
699 ac[0] = s0 - (_i + bvirt) + (bvirt - t0);
700 _j = s1 + _i;
701 bvirt = _j - s1;
702 _0 = s1 - (_j - bvirt) + (_i - bvirt);
703 _i = _0 - t1;
704 bvirt = _0 - _i;
705 ac[1] = _0 - (_i + bvirt) + (bvirt - t1);
706 ac3 = _j + _i;
707 bvirt = ac3 - _j;
708 ac[2] = _j - (ac3 - bvirt) + (_i - bvirt);
709 ac[3] = ac3;
710 s1 = bex * dey;
711 c = splitter * bex;
712 ahi = c - (c - bex);
713 alo = bex - ahi;
714 c = splitter * dey;
715 bhi = c - (c - dey);
716 blo = dey - bhi;
717 s0 = alo * blo - (s1 - ahi * bhi - alo * bhi - ahi * blo);
718 t1 = dex * bey;
719 c = splitter * dex;
720 ahi = c - (c - dex);
721 alo = dex - ahi;
722 c = splitter * bey;
723 bhi = c - (c - bey);
724 blo = bey - bhi;
725 t0 = alo * blo - (t1 - ahi * bhi - alo * bhi - ahi * blo);
726 _i = s0 - t0;
727 bvirt = s0 - _i;
728 bd[0] = s0 - (_i + bvirt) + (bvirt - t0);
729 _j = s1 + _i;
730 bvirt = _j - s1;
731 _0 = s1 - (_j - bvirt) + (_i - bvirt);
732 _i = _0 - t1;
733 bvirt = _0 - _i;
734 bd[1] = _0 - (_i + bvirt) + (bvirt - t1);
735 bd3 = _j + _i;
736 bvirt = bd3 - _j;
737 bd[2] = _j - (bd3 - bvirt) + (_i - bvirt);
738 bd[3] = bd3;
739
740 const finlen = sum(
741 sum(
742 negate(liftadapt(bc, cd, bd, dez, bez, -cez, aex, aey, aez, adet), adet), adet,
743 liftadapt(cd, da, ac, aez, cez, dez, bex, bey, bez, bdet), bdet, abdet), abdet,
744 sum(
745 negate(liftadapt(da, ab, bd, bez, dez, aez, cex, cey, cez, cdet), cdet), cdet,
746 liftadapt(ab, bc, ac, cez, aez, -bez, dex, dey, dez, ddet), ddet, cddet), cddet, fin);
747
748 let det = estimate(finlen, fin);
749 let errbound = isperrboundB * permanent;
750 if (det >= errbound || -det >= errbound) {
751 return det;
752 }
753
754 bvirt = ax - aex;
755 aextail = ax - (aex + bvirt) + (bvirt - ex);
756 bvirt = ay - aey;
757 aeytail = ay - (aey + bvirt) + (bvirt - ey);
758 bvirt = az - aez;
759 aeztail = az - (aez + bvirt) + (bvirt - ez);
760 bvirt = bx - bex;
761 bextail = bx - (bex + bvirt) + (bvirt - ex);
762 bvirt = by - bey;
763 beytail = by - (bey + bvirt) + (bvirt - ey);
764 bvirt = bz - bez;
765 beztail = bz - (bez + bvirt) + (bvirt - ez);
766 bvirt = cx - cex;
767 cextail = cx - (cex + bvirt) + (bvirt - ex);
768 bvirt = cy - cey;
769 ceytail = cy - (cey + bvirt) + (bvirt - ey);
770 bvirt = cz - cez;
771 ceztail = cz - (cez + bvirt) + (bvirt - ez);
772 bvirt = dx - dex;
773 dextail = dx - (dex + bvirt) + (bvirt - ex);
774 bvirt = dy - dey;
775 deytail = dy - (dey + bvirt) + (bvirt - ey);
776 bvirt = dz - dez;
777 deztail = dz - (dez + bvirt) + (bvirt - ez);
778 if (aextail === 0 && aeytail === 0 && aeztail === 0 &&
779 bextail === 0 && beytail === 0 && beztail === 0 &&
780 cextail === 0 && ceytail === 0 && ceztail === 0 &&
781 dextail === 0 && deytail === 0 && deztail === 0) {
782 return det;
783 }
784
785 errbound = isperrboundC * permanent + resulterrbound * Math.abs(det);
786
787 const abeps = (aex * beytail + bey * aextail) - (aey * bextail + bex * aeytail);
788 const bceps = (bex * ceytail + cey * bextail) - (bey * cextail + cex * beytail);
789 const cdeps = (cex * deytail + dey * cextail) - (cey * dextail + dex * ceytail);
790 const daeps = (dex * aeytail + aey * dextail) - (dey * aextail + aex * deytail);
791 const aceps = (aex * ceytail + cey * aextail) - (aey * cextail + cex * aeytail);
792 const bdeps = (bex * deytail + dey * bextail) - (bey * dextail + dex * beytail);
793 det +=
794 (((bex * bex + bey * bey + bez * bez) * ((cez * daeps + dez * aceps + aez * cdeps) +
795 (ceztail * da3 + deztail * ac3 + aeztail * cd3)) + (dex * dex + dey * dey + dez * dez) *
796 ((aez * bceps - bez * aceps + cez * abeps) + (aeztail * bc3 - beztail * ac3 + ceztail * ab3))) -
797 ((aex * aex + aey * aey + aez * aez) * ((bez * cdeps - cez * bdeps + dez * bceps) +
798 (beztail * cd3 - ceztail * bd3 + deztail * bc3)) + (cex * cex + cey * cey + cez * cez) *
799 ((dez * abeps + aez * bdeps + bez * daeps) + (deztail * ab3 + aeztail * bd3 + beztail * da3)))) +
800 2 * (((bex * bextail + bey * beytail + bez * beztail) * (cez * da3 + dez * ac3 + aez * cd3) +
801 (dex * dextail + dey * deytail + dez * deztail) * (aez * bc3 - bez * ac3 + cez * ab3)) -
802 ((aex * aextail + aey * aeytail + aez * aeztail) * (bez * cd3 - cez * bd3 + dez * bc3) +
803 (cex * cextail + cey * ceytail + cez * ceztail) * (dez * ab3 + aez * bd3 + bez * da3)));
804
805 if (det >= errbound || -det >= errbound) {
806 return det;
807 }
808
809 return insphereexact(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez);
810}
811
812function insphere(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez) {
813 const aex = ax - ex;
814 const bex = bx - ex;
815 const cex = cx - ex;
816 const dex = dx - ex;
817 const aey = ay - ey;
818 const bey = by - ey;
819 const cey = cy - ey;
820 const dey = dy - ey;
821 const aez = az - ez;
822 const bez = bz - ez;
823 const cez = cz - ez;
824 const dez = dz - ez;
825
826 const aexbey = aex * bey;
827 const bexaey = bex * aey;
828 const ab = aexbey - bexaey;
829 const bexcey = bex * cey;
830 const cexbey = cex * bey;
831 const bc = bexcey - cexbey;
832 const cexdey = cex * dey;
833 const dexcey = dex * cey;
834 const cd = cexdey - dexcey;
835 const dexaey = dex * aey;
836 const aexdey = aex * dey;
837 const da = dexaey - aexdey;
838 const aexcey = aex * cey;
839 const cexaey = cex * aey;
840 const ac = aexcey - cexaey;
841 const bexdey = bex * dey;
842 const dexbey = dex * bey;
843 const bd = bexdey - dexbey;
844
845 const alift = aex * aex + aey * aey + aez * aez;
846 const blift = bex * bex + bey * bey + bez * bez;
847 const clift = cex * cex + cey * cey + cez * cez;
848 const dlift = dex * dex + dey * dey + dez * dez;
849
850 const det =
851 (clift * (dez * ab + aez * bd + bez * da) - dlift * (aez * bc - bez * ac + cez * ab)) +
852 (alift * (bez * cd - cez * bd + dez * bc) - blift * (cez * da + dez * ac + aez * cd));
853
854 const aezplus = Math.abs(aez);
855 const bezplus = Math.abs(bez);
856 const cezplus = Math.abs(cez);
857 const dezplus = Math.abs(dez);
858 const aexbeyplus = Math.abs(aexbey) + Math.abs(bexaey);
859 const bexceyplus = Math.abs(bexcey) + Math.abs(cexbey);
860 const cexdeyplus = Math.abs(cexdey) + Math.abs(dexcey);
861 const dexaeyplus = Math.abs(dexaey) + Math.abs(aexdey);
862 const aexceyplus = Math.abs(aexcey) + Math.abs(cexaey);
863 const bexdeyplus = Math.abs(bexdey) + Math.abs(dexbey);
864 const permanent =
865 (cexdeyplus * bezplus + bexdeyplus * cezplus + bexceyplus * dezplus) * alift +
866 (dexaeyplus * cezplus + aexceyplus * dezplus + cexdeyplus * aezplus) * blift +
867 (aexbeyplus * dezplus + bexdeyplus * aezplus + dexaeyplus * bezplus) * clift +
868 (bexceyplus * aezplus + aexceyplus * bezplus + aexbeyplus * cezplus) * dlift;
869
870 const errbound = isperrboundA * permanent;
871 if (det > errbound || -det > errbound) {
872 return det;
873 }
874 return -insphereadapt(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, ex, ey, ez, permanent);
875}
876
877function inspherefast(pax, pay, paz, pbx, pby, pbz, pcx, pcy, pcz, pdx, pdy, pdz, pex, pey, pez) {
878 const aex = pax - pex;
879 const bex = pbx - pex;
880 const cex = pcx - pex;
881 const dex = pdx - pex;
882 const aey = pay - pey;
883 const bey = pby - pey;
884 const cey = pcy - pey;
885 const dey = pdy - pey;
886 const aez = paz - pez;
887 const bez = pbz - pez;
888 const cez = pcz - pez;
889 const dez = pdz - pez;
890
891 const ab = aex * bey - bex * aey;
892 const bc = bex * cey - cex * bey;
893 const cd = cex * dey - dex * cey;
894 const da = dex * aey - aex * dey;
895 const ac = aex * cey - cex * aey;
896 const bd = bex * dey - dex * bey;
897
898 const abc = aez * bc - bez * ac + cez * ab;
899 const bcd = bez * cd - cez * bd + dez * bc;
900 const cda = cez * da + dez * ac + aez * cd;
901 const dab = dez * ab + aez * bd + bez * da;
902
903 const alift = aex * aex + aey * aey + aez * aez;
904 const blift = bex * bex + bey * bey + bez * bez;
905 const clift = cex * cex + cey * cey + cez * cez;
906 const dlift = dex * dex + dey * dey + dez * dez;
907
908 return (clift * dab - dlift * abc) + (alift * bcd - blift * cda);
909}
910
911exports.insphere = insphere;
912exports.inspherefast = inspherefast;
913
914}));
Note: See TracBrowser for help on using the repository browser.