1

次のコードで定義された堅牢な述語が必要です。

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;
}

浮動小数点演算の制限により、正確に(その二乗でさえ)計算できないためdistance、このコードを直接実装した場合、述語は堅牢ではありません。CGALライブラリで見つけようとしましたが見つかりませんでした。

私が必要とする述語にやや近いのはcompare_distance_to_point(Point p, Point q, Point r) 述語です。Smallerif distance(p, q) < distance(p, r)Equalif distance(p, q) == distance(p, r)、それ以外の場合は戻りますLarger。最初の考えは、シフトcd(c - a)ベクトルで行うことです。そのため、を呼び出すことができますcompare_distance_to_point(a, b, d + (c - a))が、これは再び堅牢性に違反します。それで、誰かがそれを適応させるためのアイデアを持っていますか?

4

1 に答える 1

2

Exact_predicates_inexact_constructions_kernelなどの正確な述語を持つカーネルを 使用する場合は、 CompareDistance_3の概念のモデルであるファンクターCompare_distance_3を使用できます。

Kernel::Compare_distance_3 cmp;

return cmp(a,b,c,d);

于 2012-04-11T06:16:48.077 に答える