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;
}
程式碼解釋
-
建立和初始化
Bnd_B3f
物件:- 使用空建構函式建立一個空的
Bnd_B3f
物件。 - 使用指定的中心和半對角線建立一個
Bnd_B3f
物件。
- 使用空建構函式建立一個空的
-
檢查和更新盒子:
- 使用
IsVoid()
檢查盒子是否為空。 - 使用
Add()
方法透過點或另一個盒子更新當前盒子。 - 使用
Clear()
方法重置盒子資料。
- 使用
-
查詢和擴充套件盒子:
- 使用
CornerMin()
和CornerMax()
查詢盒子的下角點和上角點。 - 使用
SquareExtent()
查詢盒子的平方對角線。 - 使用
Enlarge()
方法擴充套件盒子的大小。
- 使用
-
限制和變換盒子:
- 使用
Limit()
方法限制當前盒子到另一個盒子的內部。 - 使用
Transformed()
方法將盒子變換到新的位置和方向。
- 使用
-
檢測交集:
- 檢查點、球體、另一個盒子、直線、平面是否與當前盒子相交。
- 使用
IsOut()
方法進行這些檢查。
-
檢查包含關係:
- 使用
IsIn()
方法檢查當前盒子是否完全在另一個盒子內。 - 使用
IsIn()
方法檢查當前盒子是否完全在變換後的另一個盒子內。
- 使用
-
設定盒子屬性:
- 使用
SetCenter()
設定盒子的中心座標。 - 使用
SetHSize()
設定盒子的半對角線座標。
- 使用
參考
參考