关于三维布尔运算的思考(2)

server/2024/10/18 21:24:28/

1.前言

        三维布尔运算几何内核的核心算法之一,博主前述文章中提到过布尔算法有多种,可以根据几何数据表达方式分为Brep布尔运算CSG布尔运算网格布尔运算等,而网格布尔运算又又多种,如BSP方式、八叉树方式,详细可参考博主文章。

2.特点比较

        不同方式的布尔运算有其特点,其适应的几何数据表达方式不一样,同时带来的效果也不一样,当然也有优缺点。

2.1 Brep布尔运算

比较轻量,数据结构轻量,运算逻辑简便,结果数据简便,是一种使用范围较广的算法方案,但其也有我们不能忽略的特点:

  • 轻量,无论是数据还是算法效率;
  • 专业性强,对应处理Brep方式表达的几何数据,而实际工程中往往有很多网格化的数据或CSG方式数据,则无法处理。如OCC库不能进行网格化几何数据的布尔运算
  • 技术难度较高,对于曲面构件(如Nurbs曲面)需要进行曲面相交等复杂计算,计算方式可以采用统一nurbs表达的或转化为nurbs数据结构进行计算,也可以枚举曲面类型进行组合算法实现,不论采用哪种方式,其技术难度较高;

2.2 CSG布尔运算

数据比较重,CSG方式表达数据结构本身就比较重,因为要存储实体产生过程的中间实体信息;但其计算方式相对简单,基本的几何实体类型数量有限,且可以对应实现,

  • 数据较重,由于计算方式的简单特点,导致复杂造型的实体布尔操作要较多的组合串联基本运算来实现,这种方式有重(数据重、计算过程逻辑组合串联重)有轻(实现基本的实体类型运算),特点明显;
  • Brep方式一样,专业性较强;

2.3 网格布尔运算

2.3.1 BSP方式

BSP方式逻辑简单暴力,效率较低,会产生大量的零碎三角面,且对数据规范性要求较高,适用性较差,实际工程数据来源多,很难保证完全提供符合其要求的数据,不建议采用这种方式;

2.3.2 八叉树(OctTree)方式

逻辑简便,可以针对数据情况来调整八叉树的深度,以便提高效率;这种方式适用性较强,因为不论是何种方式表达的几何数据均可以转为网格数据,进而进行网格布尔运算

  • 逻辑简便,比较轻量;可以通过自适应八叉树深度来优化效率,同时结果数据的数据量不会庞大,注意也没有BSP方式的轻;
  • 适用性强,可以处理各种来源和表达方式的几何数据(通过处理为网格方式);
  • 由于结果数据是网格化的,难以还原原始的参数化信息,是其明显的特点,需要根据实际场景进行分析;

3. 总结

可以根据实际场景进行布尔运算方式的选择,需要考虑效果、效率、适应性、技术难度、几何数据表达方式等因素。当然也可以直接采用已有的几何内核,专注于应用开发,将应用做好做广,也是一种很好的选择。


http://www.ppmy.cn/server/124448.html

相关文章

FortiGate OSPF动态路由协议配置

1.目的 本文档针对 FortiGate 的 OSPF 动态路由协议说明。OSPF 路由协议是一种 典型的链路状态(Link-state)的路由协议,一般用于同一个路由域内。在这里,路由 域是指一个自治系统,即 AS,它是指一组通过统一的路由政策或路由协议互相交 换路由信息的网络。在这个 AS 中,所有的 …

刷题训练之队列与宽搜

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟练掌握字符串算法。 > 毒鸡汤:学习,学习,再学习 ! 学,然后知不足。 > 专栏选自:刷题…

Docker部署MongoDB教程

嘿,大家好!今天我在三丰云免费服务器上进行了一次激动人心的MongoDB部署测试。这款免费云服务器1核CPU、1G内存、10G硬盘、5M带宽,是不错的免费服务器选择。 首先,让我们简要介绍一下使用到的Docker和MongoDB软件。Docker是一个开…

鸿蒙开发(NEXT/API 12)【硬件(获取智慧出行连接状态)】车载系统

获取智慧出行连接状态,用于应用UI呈现或基于HiCar认证汽车摄像头的业务交互等。 接口说明 接口名描述[getSmartMobilityStatus] (type: SmartMobilityType): SmartMobilityInfo获取智慧出行连接状态。 开发步骤 导入Car Kit模块。 import { smartMobilityCommon …

C++学习9.27

1、顺序表、栈、队列都更改成模板类 &#xff08;1&#xff09;顺序表 #include <iostream> #include <cstring>using namespace std;template <typename T1,typename T2,typename T3> class My_string { private:T1 *ptr; //指向字符数组的指针T2…

Spark 任务与 Spark Streaming 任务的差异详解

Spark 任务与 Spark Streaming 任务的主要差异源自于两者的应用场景不同&#xff1a;Spark 主要处理静态的大数据集&#xff0c;而 Spark Streaming 处理的是实时流数据。这些差异体现在任务的调度、执行、容错、数据处理模式等方面。 接下来&#xff0c;我们将从底层原理和源…

组播基础-2-IGMP协议

文章目录 IGMPIGMPv1IGMPv2IGMPv3IGMP总结IGMP Snooping IGMP 运行于主机和路由器之间 因特网组管理协议&#xff0c;TCP/IP 协议族中负责 IP 组播成员管理的协议&#xff0c;用来在接收者与其他直接相邻的组播路由器之间建立、维护组播组成员关系 负责组播成员管理&#xf…

探索Python网络世界的利器:Requests-HTML库

文章目录 探索Python网络世界的利器&#xff1a;Requests-HTML库背景&#xff1a;为何选择Requests-HTML&#xff1f;什么是Requests-HTML&#xff1f;如何安装Requests-HTML&#xff1f;5个简单库函数的使用方法3个场景下库的使用示例常见Bug及解决方案总结 探索Python网络世界…