opencascade Bnd_B3d源码学习 包围盒

news/2024/9/29 21:36:48

opencascade Bnd_B3d 包围盒
在这里插入图片描述

方法

1

Bnd_B3d();
// 空构造函数。

2

Bnd_B3d(const gp_XYZ& theCenter, const gp_XYZ& theHSize);
// 构造函数。

3

Standard_Boolean IsVoid() const;
// 如果盒子是空的(未初始化),则返回 True。

4

void Clear();
// 重置盒子的数据。

5

Standard_EXPORT void Add (const gp_XYZ& thePnt);
// 通过一个点更新盒子。

6

void Add (const gp_Pnt& thePnt);
// 通过一个点更新盒子。

7

void Add (const Bnd_B3d& theBox);
// 通过另一个盒子更新当前盒子。

8

gp_XYZ CornerMin() const;
// 查询下角点:(中心 - 半对角线)。你必须确保
// 盒子不是 VOID(参见 IsVoid()),否则方法将返回
// 无效结果。

9

gp_XYZ CornerMax() const;
// 查询上角点:(中心 + 半对角线)。你必须确保
// 盒子不是 VOID(参见 IsVoid()),否则方法将返回
// 无效结果。

10

Standard_Real SquareExtent() const;
// 查询平方对角线。如果盒子是 VOID(参见方法 IsVoid()),
// 则返回一个非常大的实值。

11

void Enlarge (const Standard_Real theDiff);
// 通过 theDiff 的绝对值扩展盒子。

12

Standard_EXPORT Standard_Boolean Limit (const Bnd_B3d& theOtherBox);
// 限制盒子在另一个盒子的内部。
// 如果限制发生,则返回 True,否则返回 False
// 表示两个盒子没有交集。

13

Standard_NODISCARD Standard_EXPORT Bnd_B3d Transformed (const gp_Trsf& theTrsf) const;
// 使用给定的变换变换边界盒。
// 如果 theTrsf 包含旋转,结果盒子将会更大。

14

Standard_Boolean IsOut (const gp_XYZ& thePnt) const;
// 检查给定点是否在盒子内。
// 如果点在外部,则返回 True。

15

Standard_EXPORT Standard_Boolean IsOut (const gp_XYZ& theCenter, const Standard_Real theRadius, const Standard_Boolean isSphereHollow = Standard_False) const;
// 检查一个球体是否与当前盒子有交集。
// 如果两个盒子之间没有交集,则返回 True。如果
// 参数 'IsSphereHollow' 为 True,则如果盒子完全在球体内,则不会报告交集
// (否则此方法会报告交集)。

16

Standard_Boolean IsOut (const Bnd_B3d& theOtherBox) const;
// 检查给定的盒子是否与当前盒子有交集。
// 如果两个盒子之间没有交集,则返回 True。

17

Standard_EXPORT Standard_Boolean IsOut (const Bnd_B3d& theOtherBox, const gp_Trsf& theTrsf) const;
// 检查通过给定变换变换的盒子是否与当前盒子有交集。
// 如果两个盒子之间没有交集,则返回 True。

18

Standard_EXPORT Standard_Boolean IsOut (const gp_Ax1& theLine, const Standard_Boolean isRay = Standard_False, const Standard_Real theOverthickness = 0.0) const;
// 检查给定的直线是否与当前盒子有交集。
// 如果没有交集,则返回 True。
// isRay==True 表示检查与正半线的交集
// theOverthickness 是对当前盒子的大小的附加
// (可以是负值)。如果为正值,可以将其视为直线 'theLine'
// 的厚度或沿着 'theLine' 的圆柱半径。

19

Standard_EXPORT Standard_Boolean IsOut (const gp_Ax3& thePlane) const;
// 检查给定的平面是否与当前盒子有交集。
// 如果没有交集,则返回 True。

20

Standard_Boolean IsIn (const Bnd_B3d& theBox) const;
// 检查盒子 'this' 是否在给定的盒子 'theBox' 内。返回
// True 如果 'this' 盒子完全在 'theBox' 内。

21

Standard_EXPORT Standard_Boolean IsIn (const Bnd_B3d& theBox, const gp_Trsf& theTrsf) const;
// 检查盒子 'this' 是否在通过 'theTrsf' 变换的给定盒子 'theBox' 内。
// 返回 True 如果 'this' 盒子完全在变换后的 'theBox' 内。

22

void SetCenter (const gp_XYZ& theCenter);
// 设置中心坐标。

23

void SetHSize (const gp_XYZ& theHSize);
// 设置半对角线(HSize)坐标。
// 所有 theHSize 的分量必须是非负的。
下面是 Bnd_B3d 类的使用示例代码,这些示例演示了如何创建、操作和查询 Bnd_B3d 对象。Bnd_B3d 是一个用于定义和操作三维边界盒的类。以下示例展示了如何使用该类的主要功能。

#include <Bnd_B3d.hxx>
#include <gp_XYZ.hxx>
#include <gp_Trsf.hxx>
#include <gp_Pnt.hxx>
#include <Standard_Real.hxx>
#include <Standard_Boolean.hxx>
#include <Standard_EXPORT.hxx>
#include <iostream>int main() {// 创建一个空的 Bnd_B3d 对象Bnd_B3d boundingBox1;// 创建一个 Bnd_B3d 对象,指定中心和半对角线gp_XYZ center1(1.0, 2.0, 3.0);gp_XYZ hSize1(4.0, 5.0, 6.0);Bnd_B3d boundingBox2(center1, hSize1);// 更新盒子,通过一个点gp_XYZ newPoint(7.0, 8.0, 9.0);boundingBox2.Add(newPoint);// 更新盒子,通过另一个 Bnd_B3d 对象gp_XYZ center2(2.0, 3.0, 4.0);gp_XYZ hSize2(1.0, 1.0, 1.0);Bnd_B3d boundingBox3(center2, hSize2);boundingBox2.Add(boundingBox3);// 查询盒子的下角点和上角点gp_XYZ minCorner = boundingBox2.CornerMin();gp_XYZ maxCorner = boundingBox2.CornerMax();std::cout << "Min Corner: (" << minCorner.X() << ", " << minCorner.Y() << ", " << minCorner.Z() << ")" << std::endl;std::cout << "Max Corner: (" << maxCorner.X() << ", " << maxCorner.Y() << ", " << maxCorner.Z() << ")" << std::endl;// 检查盒子是否为空if (boundingBox2.IsVoid()) {std::cout << "BoundingBox is void." << std::endl;} else {std::cout << "BoundingBox is not void." << std::endl;}// 扩展盒子boundingBox2.Enlarge(2.0);// 检查一个点是否在盒子内gp_XYZ testPoint(5.0, 6.0, 7.0);if (boundingBox2.IsOut(testPoint)) {std::cout << "Point is outside the bounding box." << std::endl;} else {std::cout << "Point is inside the bounding box." << std::endl;}// 使用变换变换盒子gp_Trsf transform;transform.SetRotation(gp_Ax1(gp_Pnt(0, 0, 0), gp_Vec(1, 0, 0)), M_PI / 4); // 旋转 45 度Bnd_B3d transformedBox = boundingBox2.Transformed(transform);// 检查变换后的盒子是否与另一个盒子相交if (boundingBox2.IsOut(transformedBox)) {std::cout << "Transformed bounding box is outside the original bounding box." << std::endl;} else {std::cout << "Transformed bounding box intersects with the original bounding box." << std::endl;}// 设置新的中心和半对角线gp_XYZ newCenter(10.0, 10.0, 10.0);gp_XYZ newHSize(5.0, 5.0, 5.0);boundingBox2.SetCenter(newCenter);boundingBox2.SetHSize(newHSize);return 0;
}

示例说明:

  1. 创建空的 Bnd_B3d 对象Bnd_B3d boundingBox1; 创建一个默认的、空的边界盒。

  2. 通过中心和半对角线创建 Bnd_B3d 对象Bnd_B3d boundingBox2(center1, hSize1); 使用中心点和半对角线初始化边界盒。

  3. 更新边界盒

    • boundingBox2.Add(newPoint); 通过新点更新边界盒。
    • boundingBox2.Add(boundingBox3); 使用另一个边界盒更新当前边界盒。
  4. 查询边界盒的下角点和上角点:通过 CornerMin()CornerMax() 方法获取。

  5. 检查边界盒是否为空boundingBox2.IsVoid() 判断边界盒是否未初始化。

  6. 扩展边界盒boundingBox2.Enlarge(2.0); 通过指定的差值扩展边界盒的大小。

  7. 检查点是否在边界盒内boundingBox2.IsOut(testPoint) 检查点是否在边界盒外部。

  8. 使用变换变换边界盒boundingBox2.Transformed(transform); 对边界盒应用变换。

  9. 检查变换后的边界盒是否与原边界盒相交boundingBox2.IsOut(transformedBox) 判断两个边界盒是否相交。

  10. 设置新的中心和半对角线:通过 SetCenter()SetHSize() 方法更新边界盒的中心和半对角线尺寸。

这些示例代码展示了 Bnd_B3d 类的基本操作,可以帮助你在实际应用中利用该类处理三维边界盒。

参考
参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/66324.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

法定每月计薪天数 vs 法定每月工作天数 All In One

法定每月计薪天数 vs 法定每月工作天数 All In One 法定每月记薪天数 21.75天/月, 用于计算工资的发放,缺勤、事假的工资扣除 法定每月工作天数 20.83天/月, 用于计算加班时长、加班费法定每月计薪天数 vs 法定每月工作天数 All In One法定每月记薪天数 21.75天/月, 用于计算工…

“你好BOE”重磅亮相首届上海国际光影节 打造“艺术x科技”顶级影像盛宴

黄浦江畔,北外滩胜地。作为首届上海国际光影节虹口区分会场的重点项目之一,9月29日-10月5日,BOE(京东方)年度标杆性品牌巡展IP“你好BOE”Super O SPACE影像科技展在上海北外滩滨江5米平台盛大启幕,BOE(京东方)携手上海电影、上影元、OUTPUT、新浪微博、海信、OPPO、京…

2024 最新 Navicat Premium 17.0.13 简体中文版(亲测可用)

步骤如下: 一、官网下载安装包:https://www.navicat.com.cn/download/navicat-premium二、安装Navicat Premium 17注意:安装完后不要打开已打开自行退出 三、补丁下载关注后发送“navicat17”即可获取补丁下载地址,无套路。 四、安装补丁 先将下载下来的压缩包里面的winmm…

第二十七讲: 读写分离有哪些坑?

今年秋招,面试官隔着电脑屏幕看着简历上“熟悉搭建过mysql集群,能排错” 对你说:在mysql集群中,一般是一主多从的方式,即一台mysql机器做公司业务的读,其他机器留给客户查询做负载均衡。 hr问你:“老板开了一家金融公司,他要求客户在频繁资金流动下,时刻要保证拿到最新…

【牛客训练记录】牛客周赛 Round 62

https://ac.nowcoder.com/acm/contest/91177#question赛后反思 一直都不会做期望,对于概率论相关的需要加强 A题 直接模拟字符串字符交换即可 #include <bits/stdc++.h> #define int long longusing namespace std;void solve(){string s; cin>>s;cout<<s[1…

Large_bins_attack

导言 在libc版本越来越高的情况下,许多旧的攻击方式已然失效,而large_bin_attack始终屹立不倒,是许多攻击方式的先决条件,这也是我们要学习它的原因 large_bin 概念 large_bin是一种堆分配的管理方式,是双向链表,用于管理大于某个特定大小阈值的内存块。一般而言,进入la…

直播的剪辑工作流/工具分享

基本流程获取素材 粗剪 导出音频识别成字幕文件 应用字幕并校准字幕 配bgm并进行精剪工具分享 一 获取直播素材高时效性-即录即拿:VLC media player、录屏软件(如Screen Record Pro等) 中时效性但解放双手-需要等待其录制/编码完成:biliup:如果想保持想保存为mp4,需要安装f…

AT_arc184_d [ARC184D] Erase Balls 2D

AT_arc184_d [ARC184D] Erase Balls 2D 首先,假定我们选定的行为 \(i_1,i_2,\cdots,i_k\),并有 \(i_1<i_2<\cdots<i_k\),则 \(p_{i_1}>p_{i_2}>\cdots>p_{i_k}\)。其中 \(p_x\) 表示 \((x,p_x)\) 的位置上有点。 最终状态形如下图。显然,这种状态与操作顺…