opencascade Bnd_B3f原始碼學習 包圍盒

一点灯發表於2024-09-29

opencascade Bnd_B3f

方法

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

//! 查詢下角點:(中心 - 半對角線)。你必須確保盒子不是空的(參見 IsVoid()),否則方法會返回無效結果。
gp_XYZ CornerMin() const;

9

//! 查詢上角點:(中心 + 半對角線)。你必須確保盒子不是空的(參見 IsVoid()),否則方法會返回無效結果。
gp_XYZ CornerMax() const;

10

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

11

//! 透過絕對值 of theDiff 擴充套件盒子。
void Enlarge (const Standard_Real theDiff);

12

//! 透過另一個盒子的內部限制當前盒子。
//! 如果限制發生,則返回 True,否則返回 False,表示盒子不相交。
Standard_EXPORT Standard_Boolean Limit (const Bnd_B3f& theOtherBox);

13

//! 使用給定的變換變換邊界盒。
//! 如果變換包含旋轉,結果盒子會更大。
Standard_NODISCARD Standard_EXPORT Bnd_B3f Transformed (const gp_Trsf& theTrsf) const;

14

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

15

//! 檢查一個球體是否與當前盒子相交。
//! 如果盒子完全在球體內,則返回 True,表示沒有相交(否則該方法會報告相交)。
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

//! 檢查給定直線是否與當前盒子相交。
//! 如果沒有相交,則返回 True。
//! isRay==True 表示檢查與正半直線的相交
//! theOverthickness 是當前盒子尺寸的附加值(可能是負值)。如果是正值,它可以被視為直線 'theLine' 的厚度或沿 'theLine' 的圓柱的半徑
IsOut

使用示例

以下是 Bnd_B3f 類的使用示例:

#include <gp_XYZ.hxx>
#include <Bnd_B3f.hxx>
#include <gp_Pnt.hxx>
#include <gp_Trsf.hxx>
#include <Standard_Real.hxx>
#include <Standard_Boolean.hxx>

int main() {
    // 建立一個空的 Bnd_B3f 物件
    Bnd_B3f boundingBox;

    // 定義盒子的中心和半對角線
    gp_XYZ center(0.0, 0.0, 0.0);
    gp_XYZ hSize(1.0, 1.0, 1.0);

    // 使用中心和半對角線建立一個 Bnd_B3f 物件
    Bnd_B3f boundingBoxWithParams(center, hSize);

    // 檢查盒子是否為空(未初始化)
    if (boundingBoxWithParams.IsVoid()) {
        std::cout << "Box is void." << std::endl;
    } else {
        std::cout << "Box is initialized." << std::endl;
    }

    // 透過點更新盒子
    gp_XYZ point(2.0, 2.0, 2.0);
    boundingBoxWithParams.Add(point);

    // 透過點更新盒子(另一種方式)
    gp_Pnt pnt(3.0, 3.0, 3.0);
    boundingBoxWithParams.Add(pnt);

    // 透過另一個盒子更新當前盒子
    Bnd_B3f anotherBox(gp_XYZ(1.0, 1.0, 1.0), gp_XYZ(0.5, 0.5, 0.5));
    boundingBoxWithParams.Add(anotherBox);

    // 查詢盒子的下角點
    gp_XYZ minCorner = boundingBoxWithParams.CornerMin();
    std::cout << "Min Corner: (" << minCorner.X() << ", " << minCorner.Y() << ", " << minCorner.Z() << ")" << std::endl;

    // 查詢盒子的上角點
    gp_XYZ maxCorner = boundingBoxWithParams.CornerMax();
    std::cout << "Max Corner: (" << maxCorner.X() << ", " << maxCorner.Y() << ", " << maxCorner.Z() << ")" << std::endl;

    // 查詢盒子的平方對角線
    Standard_Real squareExtent = boundingBoxWithParams.SquareExtent();
    std::cout << "Square Extent: " << squareExtent << std::endl;

    // 擴充套件盒子的大小
    boundingBoxWithParams.Enlarge(2.0);

    // 限制盒子為另一個盒子的內部
    Standard_Boolean isLimited = boundingBoxWithParams.Limit(anotherBox);
    if (isLimited) {
        std::cout << "Box is limited to the other box." << std::endl;
    } else {
        std::cout << "Boxes do not intersect." << std::endl;
    }

    // 變換盒子
    gp_Trsf transform;
    transform.SetRotation(gp_Ax1(gp_Pnt(0,0,0), gp_Dir(0,0,1)), M_PI/4);  // 旋轉 45 度
    Bnd_B3f transformedBox = boundingBoxWithParams.Transformed(transform);

    // 檢查點是否在盒子內
    gp_XYZ testPoint(1.0, 1.0, 1.0);
    if (boundingBoxWithParams.IsOut(testPoint)) {
        std::cout << "Point is outside the box." << std::endl;
    } else {
        std::cout << "Point is inside the box." << std::endl;
    }

    // 檢查一個球體是否與盒子相交
    Standard_Boolean isOutSphere = boundingBoxWithParams.IsOut(gp_XYZ(0.0, 0.0, 0.0), 2.0);
    if (isOutSphere) {
        std::cout << "Sphere does not intersect with the box." << std::endl;
    } else {
        std::cout << "Sphere intersects with the box." << std::endl;
    }

    // 檢查兩個盒子是否相交
    Standard_Boolean isOutBox = boundingBoxWithParams.IsOut(anotherBox);
    if (isOutBox) {
        std::cout << "Boxes do not intersect." << std::endl;
    } else {
        std::cout << "Boxes intersect." << std::endl;
    }

    // 檢查直線是否與盒子相交
    gp_Ax1 line(gp_Pnt(0,0,0), gp_Dir(1,0,0));
    Standard_Boolean isOutLine = boundingBoxWithParams.IsOut(line, Standard_False, 0.1);
    if (isOutLine) {
        std::cout << "Line does not intersect with the box." << std::endl;
    } else {
        std::cout << "Line intersects with the box." << std::endl;
    }

    // 檢查平面是否與盒子相交
    gp_Ax3 plane(gp_Pnt(0,0,0), gp_Dir(0,0,1), gp_Dir(1,0,0));
    Standard_Boolean isOutPlane = boundingBoxWithParams.IsOut(plane);
    if (isOutPlane) {
        std::cout << "Plane does not intersect with the box." << std::endl;
    } else {
        std::cout << "Plane intersects with the box." << std::endl;
    }

    // 檢查盒子是否完全在另一個盒子內
    Standard_Boolean isIn = boundingBoxWithParams.IsIn(anotherBox);
    if (isIn) {
        std::cout << "Box is fully inside the other box." << std::endl;
    } else {
        std::cout << "Box is not fully inside the other box." << std::endl;
    }

    // 檢查變換後的盒子是否完全在另一個盒子內
    Standard_Boolean isInTransformed = boundingBoxWithParams.IsIn(anotherBox, transform);
    if (isInTransformed) {
        std::cout << "Box is fully inside the transformed other box." << std::endl;
    } else {
        std::cout << "Box is not fully inside the transformed other box." << std::endl;
    }

    // 設定盒子的中心座標
    boundingBoxWithParams.SetCenter(gp_XYZ(5.0, 5.0, 5.0));

    // 設定半對角線座標
    boundingBoxWithParams.SetHSize(gp_XYZ(2.0, 2.0, 2.0));

    return 0;
}

程式碼解釋

  1. 建立和初始化 Bnd_B3f 物件

    • 使用空建構函式建立一個空的 Bnd_B3f 物件。
    • 使用指定的中心和半對角線建立一個 Bnd_B3f 物件。
  2. 檢查和更新盒子

    • 使用 IsVoid() 檢查盒子是否為空。
    • 使用 Add() 方法透過點或另一個盒子更新當前盒子。
    • 使用 Clear() 方法重置盒子資料。
  3. 查詢和擴充套件盒子

    • 使用 CornerMin()CornerMax() 查詢盒子的下角點和上角點。
    • 使用 SquareExtent() 查詢盒子的平方對角線。
    • 使用 Enlarge() 方法擴充套件盒子的大小。
  4. 限制和變換盒子

    • 使用 Limit() 方法限制當前盒子到另一個盒子的內部。
    • 使用 Transformed() 方法將盒子變換到新的位置和方向。
  5. 檢測交集

    • 檢查點、球體、另一個盒子、直線、平面是否與當前盒子相交。
    • 使用 IsOut() 方法進行這些檢查。
  6. 檢查包含關係

    • 使用 IsIn() 方法檢查當前盒子是否完全在另一個盒子內。
    • 使用 IsIn() 方法檢查當前盒子是否完全在變換後的另一個盒子內。
  7. 設定盒子屬性

    • 使用 SetCenter() 設定盒子的中心座標。
    • 使用 SetHSize() 設定盒子的半對角線座標。

參考
參考

相關文章