If you have two points in OpenCASCADE:
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:
#include <occutils/Equality.hxx> bool areTheyCoincident = p1 == p2;
If you can’t use OCCUtils, this is the way to check if they are coincident:
if (p1.Distance(p2) <= Precision::Confusion()) { // p1 coincides with p2 }
or alternatively:
if (p1.IsEqual(p2, Precision::Confusion())) { // p1 coincides with p2 }
The reason for this is that even though two points may represent the same point in space, depending on how you compute their coordinates exactly, their cartesian X/Y/Z coordinates might not be exactly identical. This is always the case with floating-point arithmetic, that’s the type of math computers use. Don’t confuse floating-point arithmetic with exact arithmetic which you have learnt in school or university.
The solution for this issue is to define a very small tolerance – any objects that have a distance less than that tolerance are considered equal.
In OpenCASCADE, Precision::Confusion()
in the standard tolerance value for this.
My OCCUtils library provides