| 591 | q[o+7] += c*c; q[o+8] += c*d; |
| 592 | q[o+9] += d*d; |
| 593 | } |
| 594 | |
| 595 | function mergeQuadric(q, v1, v2) { |
| 596 | const o1 = v1 * 10, o2 = v2 * 10; |
| 597 | for (let i = 0; i < 10; i++) q[o1 + i] += q[o2 + i]; |
| 598 | } |
| 599 | |
| 600 | function evalQ(q, v, x, y, z) { |
| 601 | const o = v * 10; |
| 602 | return q[o] * x*x + 2*q[o+1]*x*y + 2*q[o+2]*x*z + 2*q[o+3]*x |
| 603 | + q[o+4] * y*y + 2*q[o+5]*y*z + 2*q[o+6]*y |
| 604 | + q[o+7] * z*z + 2*q[o+8]*z |
| 605 | + q[o+9]; |
| 606 | } |
| 607 | |
| 608 | function evalQSum(q, v1, v2, x, y, z) { |
| 609 | return evalQ(q, v1, x, y, z) + evalQ(q, v2, x, y, z); |
| 610 | } |
| 611 | |
| 612 | const _s = new Float64Array(3); |
| 613 | |
| 614 | function solveQ(q, v1, v2) { |
| 615 | const o1 = v1 * 10, o2 = v2 * 10; |
| 616 | const a00 = q[o1] + q[o2]; |
| 617 | const a01 = q[o1+1] + q[o2+1]; |
| 618 | const a02 = q[o1+2] + q[o2+2]; |
| 619 | const a11 = q[o1+4] + q[o2+4]; |
| 620 | const a12 = q[o1+5] + q[o2+5]; |
| 621 | const a22 = q[o1+7] + q[o2+7]; |
| 622 | const b0 = -(q[o1+3] + q[o2+3]); |
| 623 | const b1 = -(q[o1+6] + q[o2+6]); |
| 624 | const b2 = -(q[o1+8] + q[o2+8]); |
| 625 | |
| 626 | const det = a00*(a11*a22 - a12*a12) - a01*(a01*a22 - a12*a02) + a02*(a01*a12 - a11*a02); |
| 627 | const maxEl = Math.max(Math.abs(a00), Math.abs(a01), Math.abs(a02), Math.abs(a11), Math.abs(a12), Math.abs(a22)); |