-
Notifications
You must be signed in to change notification settings - Fork 147
Exact
The geometric algorithms in Geogram, such as 2D triangulations, 3D triangulations, mesh intersection and mesh CSG depend on on more "elementary questions", such as whether a point is above or below a plane (in a certain sense).
Such "elementary questions", called predicates, are functions that take as an argument a (small) number of points (or simple geometric objects) and that returns a set of discrete values.
For instance, consider four points ABOVE
, BELOW
, ON_PLANE
.
These predicates are the "nevralgic" point of mesh intersection methods: if at one moment the
algorithm "thinks" that
In fact, these predicates can be expressed as the sign of a polynomial in the coordinates of the points, and due to the limited precision of floating point numbers, the output of the predicate can be different from the exact mathematical result, especially around zero, and it can depend on the order of the points. Try this: write the following little C program:
#include <stdio.h>
void test_add3(double x, double y, double z) {
printf("%f+%f+%f=%f\n",x,y,z,x+y+z);
}
int main() {
double x1 = 1e30;
double x2 = 1e-6;
double x3 = -1e30;
test_add3(x1,x2,x3);
test_add3(x1,x3,x2);
return 0;
}
in floating point arithmetic, imagine you compute
-
Want to learn more about how it works ? See this article and this one
To gain more speed and more robustness in the extreme cases, read about GeogramPlus.