2012-04-10 8 views
1

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?

+0

Check "Robust Adaptive Gleitkommaoperation Geometric Prädikate" Artikel auf http://www.cs.cmu.edu/~quake/robust.html – MBo

Antwort