quaeratin
Version:
An extended precision floating point library (as per Shewchuk) - precision only limited by overflow / underflow
49 lines (36 loc) • 1.11 kB
text/typescript
import { twoProduct } from "../basic/two-product.js";
import { eDiff } from "../double-expansion/e-diff.js";
import { twoDiff } from "../basic/two-diff.js";
import { fastExpansionSum } from "../double-expansion/fast-expansion-sum.js";
import { scaleExpansion } from "../double-expansion/scale-expansion.js";
import { eCompress } from "../double-expansion/e-compress.js";
/**
* * **Dont use!** Use `orien2d` instead.
* * Only for testing purposes - too slow.
* @param a
* @param b
* @param c
*/
function orient2dExact(a: number[], b: number[], c: number[]) {
// det := ax(by - cy) - ay(bx - cx) + (bx*cy - by*cx)
const term1 = scaleExpansion(
twoDiff(b[1], c[1]),
a[0]
);
const term2 = scaleExpansion(
twoDiff(b[0], c[0]),
-a[1]
);
const term3 = eDiff(
twoProduct(b[0], c[1]),
twoProduct(b[1], c[0]),
);
const term4 = fastExpansionSum(term2, term3);
let det = fastExpansionSum(
term1,
term4
);
det = eCompress(det);
return det[det.length - 1];
}
export { orient2dExact }