Home

Awesome

robust-predicates

Fast robust predicates for computational geometry in JavaScript. Provides reliable 2D and 3D point orientation tests (orient2d, orient3d, incircle, insphere) that are not susceptible to floating point errors (without sacrificing performance). A modern port of Jonathan R Shewchuk's C code, an industry standard since 1996.

<a href="https://observablehq.com/@mourner/non-robust-arithmetic-as-art"><img width="600" height="200" src="predicates.png" /></a>

Figure: non-robust vs robust orient2d test for points within a tiny range (2<sup>-42</sup>).

Build Status Simply Awesome Browser Build

Demo

API

Note: unlike J. Shewchuk's original code, all the functions in this library assume y axis is oriented downwards ↓, so the semantics are different.

orient2d(ax,ay, bx,by, cx,cy)

The result is also an approximation of twice the signed area of the triangle defined by the three points.

incircle(ax,ay, bx,by, cx,cy, dx,dy)

The points a, b, and c must be in counterclockwise order, or the sign of the result will be reversed.

orient3d(ax,ay,az, bx,by,bz, cx,cy,cz, dx,dy,dz)

The result is also an approximation of six times the signed volume of the tetrahedron defined by the four points.

insphere(ax,ay,az, bx,by,bz, cx,cy,cz, dx,dy,dz, ex,ey,ez)

The points a, b, c, and d must be ordered so that they have a positive orientation (as defined by orient3d), or the sign of the result will be reversed.

orient2dfast, orient3dfast, incirclefast, inspherefast

Simple, approximate, non-robust versions of predicates above. Use when robustness isn't needed.

Example

import {orient2d} from 'robust-predicates';

const ccw = orient2d(ax, ay, bx, by, cx, cy) > 0;

Install

Install with npm install robust-predicates or yarn add robust-predicates, or use one of the browser builds:

Thanks

This project is just a port — all the brilliant, hard work was done by Jonathan Richard Shewchuk.

The port was also inspired by Mikola Lysenko's excellent Robust Arithmetic Notes and related projects like robust-orientation and robust-in-sphere.

License

Since the original code is in the public domain, this project follows the same choice. See Unlicense.