"use strict" var twoProduct = require("two-product") var robustSum = require("robust-sum") var robustScale = require("robust-scale") var robustSubtract = require("robust-subtract") var NUM_EXPAND = 5 var EPSILON = 1.1102230246251565e-16 var ERRBOUND3 = (3.0 + 16.0 * EPSILON) * EPSILON var ERRBOUND4 = (7.0 + 56.0 * EPSILON) * EPSILON function cofactor(m, c) { var result = new Array(m.length-1) for(var i=1; i>1 return ["sum(", generateSum(expr.slice(0, m)), ",", generateSum(expr.slice(m)), ")"].join("") } } function determinant(m) { if(m.length === 2) { return [["sum(prod(", m[0][0], ",", m[1][1], "),prod(-", m[0][1], ",", m[1][0], "))"].join("")] } else { var expr = [] for(var i=0; i 0) { if(r <= 0) { return det } else { s = l + r } } else if(l < 0) { if(r >= 0) { return det } else { s = -(l + r) } } else { return det } var tol = ERRBOUND3 * s if(det >= tol || det <= -tol) { return det } return orientation3Exact(a, b, c) }, function orientation4(a,b,c,d) { var adx = a[0] - d[0] var bdx = b[0] - d[0] var cdx = c[0] - d[0] var ady = a[1] - d[1] var bdy = b[1] - d[1] var cdy = c[1] - d[1] var adz = a[2] - d[2] var bdz = b[2] - d[2] var cdz = c[2] - d[2] var bdxcdy = bdx * cdy var cdxbdy = cdx * bdy var cdxady = cdx * ady var adxcdy = adx * cdy var adxbdy = adx * bdy var bdxady = bdx * ady var det = adz * (bdxcdy - cdxbdy) + bdz * (cdxady - adxcdy) + cdz * (adxbdy - bdxady) var permanent = (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * Math.abs(adz) + (Math.abs(cdxady) + Math.abs(adxcdy)) * Math.abs(bdz) + (Math.abs(adxbdy) + Math.abs(bdxady)) * Math.abs(cdz) var tol = ERRBOUND4 * permanent if ((det > tol) || (-det > tol)) { return det } return orientation4Exact(a,b,c,d) } ] function slowOrient(args) { var proc = CACHED[args.length] if(!proc) { proc = CACHED[args.length] = orientation(args.length) } return proc.apply(undefined, args) } function generateOrientationProc() { while(CACHED.length <= NUM_EXPAND) { CACHED.push(orientation(CACHED.length)) } var args = [] var procArgs = ["slow"] for(var i=0; i<=NUM_EXPAND; ++i) { args.push("a" + i) procArgs.push("o" + i) } var code = [ "function getOrientation(", args.join(), "){switch(arguments.length){case 0:case 1:return 0;" ] for(var i=2; i<=NUM_EXPAND; ++i) { code.push("case ", i, ":return o", i, "(", args.slice(0, i).join(), ");") } code.push("}var s=new Array(arguments.length);for(var i=0;i