当前位置: 首页 > news >正文

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

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. 总结

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

相关文章:

  • 深入理解 WebSocket:实时通信的利器
  • 如何使用 DomCrawler 进行复杂的网页数据抓取?
  • InnoDB架构
  • Mavn解决依赖不重新下载,主动下载依赖
  • 什么?你想通过网络安全月入千万?看看AI的回答(包含注释版)
  • 自动化学习3:日志记录及测试报告的生成--自动化框架搭建
  • Django 数据库配置以及字段设置详解
  • 深入理解 Nuxt.js 中的 app:created 钩子
  • 打造备份一体机,群晖科技平台化战略再进阶
  • 网络安全科普之网络钓鱼,零基础入门到精通,收藏这一篇就够了
  • 栅极控制技术是什么?(MOSFET、IGBT)
  • 如何使用Kimi编写商品管理设计文档:包含流程图和用例图
  • OIDC6-OIDC 授权流程类型
  • Paddlets时间序列集成模型回测实战:MLPRegressor、NHiTSModel与RNNBlockRegressor
  • 15 Midjourney从零到商用·实战篇:建筑设计与室内设计
  • 2017 年终总结 —— 在路上
  • co模块的前端实现
  • FastReport在线报表设计器工作原理
  • IndexedDB
  • javascript 哈希表
  • JAVA之继承和多态
  • Map集合、散列表、红黑树介绍
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • PHP的Ev教程三(Periodic watcher)
  • Rancher如何对接Ceph-RBD块存储
  • SpingCloudBus整合RabbitMQ
  • spring-boot List转Page
  • tweak 支持第三方库
  • 闭包,sync使用细节
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 试着探索高并发下的系统架构面貌
  • 小程序开发之路(一)
  • 终端用户监控:真实用户监控还是模拟监控?
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • #、%和$符号在OGNL表达式中经常出现
  • #define
  • #define,static,const,三种常量的区别
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (6)STL算法之转换
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (rabbitmq的高级特性)消息可靠性
  • (二)windows配置JDK环境
  • (十八)Flink CEP 详解
  • (十三)Flask之特殊装饰器详解
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .bat批处理(一):@echo off
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @Autowired注解的实现原理
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @Documented注解的作用
  • @RequestMapping 和 @GetMapping等子注解的区别及其用法
  • []sim300 GPRS数据收发程序
  • [Angular] 笔记 18:Angular Router
  • [boost]使用boost::function和boost::bind产生的down机一例