如何在 OpenCASCADE 中检查两个 gp_Pnt 是否重合

如果你在 OpenCASCADE 中有两个点:

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

你不能仅使用 == 来检查它们在标准 OpenCASCADE 中是否重合。但是,OCCUtils 为 gp_Pnt 等类型提供了 operator== 和 operator!=:

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

bool areTheyCoincident = p1 == p2;

如果你不能使用 OCCUtils,这是检查它们是否重合的方法:

distance_check.cpp
if (p1.Distance(p2) <= Precision::Confusion()) {
    // p1 与 p2 重合
}

或替代地:

is_equal_check.cpp
if (p1.IsEqual(p2, Precision::Confusion())) {
    // p1 与 p2 重合
}

原因是即使两个点可能表示空间中的同一点,取决于你如何精确计算它们的坐标,它们的笛卡尔 X/Y/Z 坐标可能不完全相同。浮点运算总是这种情况,这是计算机使用的数学类型。不要将浮点运算与你在学校或大学学到的精确运算混淆。

此问题的解决方案是定义一个非常小的容差 - 任何距离小于该容差的对象都被视为相等。

在 OpenCASCADE 中,Precision::Confusion() 是此的标准容差值。

我的 OCCUtils 库提供


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