opencascade Bnd_Box原始碼學習 包圍盒

一点灯發表於2024-09-21

opencascade Bnd_Box 包圍盒

前言 描述一個三維空間中的包圍盒

一個包圍盒與座標系的軸線平行。如果它是有限的,則由三個區間定義:

  • [Xmin, Xmax],
  • [Ymin, Ymax],
  • [Zmin, Zmax]。

一個包圍盒在一個或多個方向上可能是無限的(即開放的)。它被稱為:

  • OpenXmin 如果它在“X方向”的負方向上是無限的;
  • OpenXmax 如果它在“X方向”的正方向上是無限的;
  • OpenYmin 如果它在“Y方向”的負方向上是無限的;
  • OpenYmax 如果它在“Y方向”的正方向上是無限的;
  • OpenZmin 如果它在“Z方向”的負方向上是無限的;
  • OpenZmax 如果它在“Z方向”的正方向上是無限的;
  • WholeSpace 如果它在所有六個方向上都是無限的。在這種情況下,空間中的任何點都在包圍盒內;
  • Void 如果它是空的。在這種情況下,包圍盒內沒有任何點。

一個包圍盒由以下部分定義:

  • 六個邊界(Xmin、Xmax、Ymin、Ymax、Zmin 和 Zmax),當包圍盒是有限時,這些邊界限制包圍盒;
  • 八個標誌(OpenXmin、OpenXmax、OpenYmin、OpenYmax、OpenZmin、OpenZmax、WholeSpace 和 Void),這些標誌描述包圍盒是否是無限的或空的;
  • 一個間隙,它在任何方向上包括在包圍盒的有限邊界的兩側。

方法

1

空建構函式
Bnd_B3f();

2

建構函式
Bnd_B3f(const gp_XYZ& theCenter, const gp_XYZ& theHSize);

3

返回 True 如果包圍盒為空(未初始化)
Standard_Boolean IsVoid() const;

4

重置包圍盒資料
void Clear();

5

透過一個點更新包圍盒
Standard_EXPORT void Add (const gp_XYZ& thePnt);

6

透過一個點更新包圍盒
void Add (const gp_Pnt& thePnt);

7

透過另一個包圍盒更新包圍盒
void Add (const Bnd_B3f& theBox);

8

查詢下角點:(Center - HSize)。必須確保包圍盒不是空的(請參見 IsVoid()),否則該方法返回不相關的結果。
gp_XYZ CornerMin() const;

9

查詢上角點:(Center + HSize)。必須確保包圍盒不是空的(請參見 IsVoid()),否則該方法返回不相關的結果。
gp_XYZ CornerMax() const;

10

查詢對角線的平方。如果包圍盒是空的(參見 IsVoid()),則返回一個非常大的實數值。
Standard_Real SquareExtent() const;

11

theDiff 的絕對值擴充套件包圍盒
void Enlarge (const Standard_Real theDiff);

12

透過 theOtherBox 的內部限制包圍盒。如果包圍盒被限制,則返回 True,否則返回 False 表示包圍盒不相交。
Standard_EXPORT Standard_Boolean Limit (const Bnd_B3f& theOtherBox);

13

使用給定的變換對包圍盒進行變換。如果 theTrsf 包含旋轉,則結果包圍盒會更大。
Standard_NODISCARD Standard_EXPORT Bnd_B3f Transformed (const gp_Trsf& theTrsf) const;

14

檢查給定點是否在包圍盒內。如果點在包圍盒外,則返回 True
Standard_Boolean IsOut (const gp_XYZ& thePnt) const;

15

檢查一個球體是否與當前包圍盒相交。如果包圍盒完全在球體內,並且 IsSphereHollowTrue,則不會報告相交(否則該方法將報告相交)。
Standard_EXPORT Standard_Boolean IsOut (const gp_XYZ& theCenter, const Standard_Real theRadius, const Standard_Boolean isSphereHollow = Standard_False) const;

16

檢查給定包圍盒是否與當前包圍盒相交。如果包圍盒不相交,則返回 True
Standard_Boolean IsOut (const Bnd_B3f& theOtherBox) const;

17

檢查給定的包圍盒(經過給定的變換)是否與當前包圍盒相交。如果包圍盒不相交,則返回 True
Standard_EXPORT Standard_Boolean IsOut (const Bnd_B3f& theOtherBox, const gp_Trsf& theTrsf) const;

18

檢查給定的直線是否與當前包圍盒相交。如果不相交,則返回 TrueisRay==True 表示檢查與正半軸的相交,theOverthickness 是對當前包圍盒大小的額外加量(可能是負數)。如果為正,則可以視為直線 theLine 的厚度或沿 theLine 的圓柱體的半徑。
Standard_EXPORT Standard_Boolean IsOut (const gp_Ax1& theLine, const Standard_Boolean isRay = Standard_False, const Standard_Real theOverthickness = 0.0) const;

19

檢查給定平面是否與當前包圍盒相交。如果不相交,則返回 True
Standard_EXPORT Standard_Boolean IsOut (const gp_Ax3& thePlane) const;

20

檢查包圍盒 this 是否在給定的包圍盒 theBox 內。如果 this 包圍盒完全在 theBox 內,則返回 True
Standard_Boolean IsIn (const Bnd_B3f& theBox) const;

21

檢查包圍盒 this 是否在經過 theTrsf 變換的包圍盒 theBox 內。如果 this 包圍盒完全在變換後的 theBox 內,則返回 True
Standard_EXPORT Standard_Boolean IsIn (const Bnd_B3f& theBox, const gp_Trsf& theTrsf) const;

22

設定中心座標
void SetCenter (const gp_XYZ& theCenter);

23

設定 HSize(半對角線)座標。所有 HSize 的分量必須是非負的。
void SetHSize (const gp_XYZ& theHSize);
Bnd_Box 是 OpenCascade 中用於表示三維包圍盒的類。下面是一些使用 Bnd_Box 類的示例,包括如何建立包圍盒、更新包圍盒、查詢包圍盒等操作的示例程式碼。

示例程式碼

#include <Bnd_Box.hxx>
#include <gp_Pnt.hxx>
#include <gp_XYZ.hxx>
#include <iostream>

int main() {
    // 建立一個空的包圍盒
    Bnd_Box box;

    // 建立一箇中心點和半對角線大小
    gp_XYZ center(0.0, 0.0, 0.0);
    gp_XYZ halfSize(1.0, 1.0, 1.0);

    // 設定包圍盒的中心和半對角線
    box.SetCenter(center);
    box.SetHSize(halfSize);

    // 新增一個點到包圍盒
    gp_Pnt point(0.5, 0.5, 0.5);
    box.Add(point);

    // 查詢包圍盒的下角和上角
    gp_XYZ minCorner = box.CornerMin();
    gp_XYZ maxCorner = box.CornerMax();

    std::cout << "Min Corner: (" << minCorner.X() << ", " << minCorner.Y() << ", " << minCorner.Z() << ")\n";
    std::cout << "Max Corner: (" << maxCorner.X() << ", " << maxCorner.Y() << ", " << maxCorner.Z() << ")\n";

    // 擴充套件包圍盒
    box.Enlarge(0.5);

    // 查詢擴充套件後的包圍盒的對角線平方長度
    Standard_Real extent = box.SquareExtent();
    std::cout << "Square Extent: " << extent << "\n";

    // 建立另一個包圍盒
    Bnd_Box anotherBox;
    anotherBox.SetCenter(gp_XYZ(2.0, 2.0, 2.0));
    anotherBox.SetHSize(gp_XYZ(1.0, 1.0, 1.0));

    // 檢查兩個包圍盒是否相交
    if (box.IsOut(anotherBox)) {
        std::cout << "The boxes do not intersect.\n";
    } else {
        std::cout << "The boxes intersect.\n";
    }

    // 建立一個變換
    gp_Trsf transform;
    transform.SetRotation(gp_Ax1(gp_Pnt(0,0,0), gp_Dir(1,1,1)), M_PI/4);

    // 變換包圍盒
    Bnd_Box transformedBox = box.Transformed(transform);

    // 查詢變換後的包圍盒的下角和上角
    gp_XYZ transformedMin = transformedBox.CornerMin();
    gp_XYZ transformedMax = transformedBox.CornerMax();

    std::cout << "Transformed Min Corner: (" << transformedMin.X() << ", " << transformedMin.Y() << ", " << transformedMin.Z() << ")\n";
    std::cout << "Transformed Max Corner: (" << transformedMax.X() << ", " << transformedMax.Y() << ", " << transformedMax.Z() << ")\n";

    return 0;
}

程式碼解釋

  1. 建立包圍盒Bnd_Box box; 建立了一個空的包圍盒。

  2. 設定包圍盒的中心和半對角線

    gp_XYZ center(0.0, 0.0, 0.0);
    gp_XYZ halfSize(1.0, 1.0, 1.0);
    box.SetCenter(center);
    box.SetHSize(halfSize);
    
  3. 新增點到包圍盒

    gp_Pnt point(0.5, 0.5, 0.5);
    box.Add(point);
    
  4. 查詢包圍盒的下角和上角

    gp_XYZ minCorner = box.CornerMin();
    gp_XYZ maxCorner = box.CornerMax();
    
  5. 擴充套件包圍盒

    box.Enlarge(0.5);
    
  6. 查詢擴充套件後的包圍盒的對角線平方長度

    Standard_Real extent = box.SquareExtent();
    
  7. 檢查兩個包圍盒是否相交

    Bnd_Box anotherBox;
    anotherBox.SetCenter(gp_XYZ(2.0, 2.0, 2.0));
    anotherBox.SetHSize(gp_XYZ(1.0, 1.0, 1.0));
    
    if (box.IsOut(anotherBox)) {
        std::cout << "The boxes do not intersect.\n";
    } else {
        std::cout << "The boxes intersect.\n";
    }
    
  8. 變換包圍盒

    gp_Trsf transform;
    transform.SetRotation(gp_Ax1(gp_Pnt(0,0,0), gp_Dir(1,1,1)), M_PI/4);
    Bnd_Box transformedBox = box.Transformed(transform);
    
  9. 查詢變換後的包圍盒的下角和上角

    gp_XYZ transformedMin = transformedBox.CornerMin();
    gp_XYZ transformedMax = transformedBox.CornerMax();
    

這些示例展示瞭如何使用 Bnd_Box 類建立和操作三維包圍盒,包括設定包圍盒的屬性、更新包圍盒、檢查相交情況以及應用變換。

參考
參考

相關文章