几何算法学习实践(三维)

1.前言

将几何算法小项目进行记录,方便自己和有需要的人。欢迎联系交流。

2.实践项目简介

学习和实践相结合,建立小项目进行练手,该项目包含几何工具库与图形显示两部分。

2.1几何工具库

当前几何工具库主要包含以下6点:

  • 数据结构和基础几何工具函数

  • BRep布尔运算:交、并、差

  • 网格剖分

  • 局部造型:倒角、圆角

  • 切割

  • 边线

2.1.1数据结构和基础几何工具函数

(1)三维实体数据结构采用BRep表达,由基本的点、线、轮廓、面、体及拓扑数据构成。

(2)基础数学库可自行积累或采用相关开源库,包含点、线、面、向量、矩阵等数据结构及相关运算。

(3)几何工具函数包含求法向、面积、关系判断(点、线、轮廓、体等)、求交(线线、线轮廓、线面、面面、线体、面体等)、距离、射线相交、点合并、邻接关系计算等。

2.1.2 BRep布尔运算

三维实体布尔运算有多种计算方法,如基于BRep、基于三角面等,博主采用的是基于BRep的。

基本运算是面面求交。

原始几何体:立方体和带矩形洞口的立方体

求交运算

求并运算

求减运算:实体1减实体2

求减运算:实体2减实体1

布尔运算效果概览

2.1.3网格剖分

基础运算为轮廓的网格剖分,包括任意多边形轮廓、带若干洞口轮廓。

BRep实体的剖分可以分解为其组成面的剖分,当然对于曲面,博主采用了离散处理的方式,进而再进行剖分。

网格剖分算法有很多种,博主采用的耳切法,注意无需将三维轮廓转换为二维后进行剖分(剖分后,再还原到三维),可直接对三维轮廓进行剖分运算。

下面效果为在WPF中和OpenGL中显示效果。

几何算法开发和调试离不开显示,提升调试效率和开发体验,相关几何内核库均有显示模块,如OCC/Parasolid/ACIS等。

2.1.4局部造型:倒角、圆角

2.1.5切割

切割可以利用布尔运算进行实现,不过博主采用的是面切割实体的方式,可以提高运行效率、灵活性和准确性。当然切割和布尔运算公用很多几何工具函数,如面面求交、面切割体等。

2.1.6边线

对于BRep结构表示的实体,轮廓线是比较容易生成的。为减少内存数据量,可以在实体剖分的时候生成轮廓线。

2.2 OpenGL显示

基于OpenGL进行渲染显示。关于OpenGL学习的更多知识可参考LearnOpenGL CN

2.2.1基础渲染

包括几何、材质、光照、线渲染等。

2.2.2 y-up to z-up

OpenGL坐标系为右手坐标系,y up。为方便博主调试习惯,转换为z up。主要是对模型叠加转换矩阵。

2.2.3相机:绕鼠标点旋转

相机是一个单独的话题,包括移动、缩放、旋转等操作,旋转实现了绕鼠标点旋转、绕原点旋转。

为便于操作和调试,增加了当前旋转点标识,即十字光标。

3.总结

几何算法底层的原理很多是相通的,用到的也都是基础的工具函数,学习和积累非常重要。

多学习多实践,哪怕是基于学习用的小项目进行练手。可以研究学习相关开源库、书籍、论文博客等。

各种运算会导致精度损失,需要注意实现时影响精度的运算,控制和提高精度。

也需要注意渲染、数据方向的学习,应用方面的了解和学习,提高知识广度,更有助于几何算法的开发。

几何工具库维基础库,其效率很重要,在算法设计时需要分析其效率指标。


注:本文仅介绍练手用项目中涉及到的几何算法和显示,几何算法有专而精的特点,但其领域范畴仍然有较大的广度,如凸包、二维布尔运算、Delaunay、最小轮廓、连通性等方面,在相关工作中有广泛的应用。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值