Ich brauche eine robuste Prädikat durch den folgenden Code definiert:Robust Abstand Vergleich Prädikat
CompareResult compareDistance(Point a, Point b, Point c, Point d) {
if (distance(a, b) > distance(c, d))
return Larger;
else if (distance(a, b) == distance(c, d))
return Equal;
else
return Smaller;
}
Aufgrund der Gleitpunktarithmetik Einschränkungen uns nicht distance
genau berechnen können (sogar sein Quadrat), so dass, wenn sie nur direkt implementieren Sie diesen Code, das Prädikat wird nicht robust sein. Ich habe versucht, es in der CGAL-Bibliothek zu finden, konnte es aber nicht.
Etwas nah an dem Prädikat, das ich brauche, ist compare_distance_to_point(Point p, Point q, Point r)
predicate. Es gibt Smaller
wenn distance(p, q) < distance(p, r)
, Equal
wenn distance(p, q) == distance(p, r)
und Larger
andernfalls. Der erste Gedanke ist, c
und d
durch (c - a)
Vektor zu verschieben, so dass wir compare_distance_to_point(a, b, d + (c - a))
aufrufen könnten, aber dies wird die Robustheit wieder verletzen. Hat also jemand eine Idee, es anzupassen?
Check "Robust Adaptive Gleitkommaoperation Geometric Prädikate" Artikel auf http://www.cs.cmu.edu/~quake/robust.html – MBo