Überprüfen, ob zwei gp_Pnt in OpenCASCADE zusammenfallen

English Deutsch

Wenn du zwei Punkte in OpenCASCADE hast:

points_example.cpp
gp_Pnt p1 = /* ... */;
gp_Pnt p2 = /* ... */;

you can’t just use == to check if they coincide in stock OpenCASCADE. However, OCCUtils provides operator== and operator!= for gp_Pnt among other types:

occutils_equality_example.cpp
#include <occutils/Equality.hxx>

bool areTheyCoincident = p1 == p2;

Falls du OCCUtils nicht verwenden kannst, ist dies der Weg, um zu überprüfen, ob sie zusammenfallen:

distance_check.cpp
if (p1.Distance(p2) <= Precision::Confusion()) {
    // p1 fällt mit p2 zusammen
}

oder alternativ:

is_equal_check.cpp
if (p1.IsEqual(p2, Precision::Confusion())) {
    // p1 fällt mit p2 zusammen
}

Der Grund dafür ist, dass auch wenn zwei Punkte denselben Punkt im Raum darstellen können, je nachdem, wie du ihre Koordinaten genau berechnest, ihre kartesischen X/Y/Z-Koordinaten möglicherweise nicht exakt identisch sind. Dies ist immer der Fall bei Gleitkommaarithmetik, das ist die Art der Mathematik, die Computer verwenden. Verwechsle Gleitkommaarithmetik nicht mit exakter Arithmetik, die du in der Schule oder Universität gelernt hast.

Die Lösung für dieses Problem ist, eine sehr kleine Toleranz zu definieren - alle Objekte, die einen Abstand kleiner als diese Toleranz haben, werden als gleich betrachtet.

In OpenCASCADE ist Precision::Confusion() der Standard-Toleranzwert dafür.

Meine OCCUtils-Bibliothek stellt bereit


Check out similar posts by category: C/C++, OpenCASCADE