将个人几何算法学习和实践情况进行记录,方便自己和有需要的人。欢迎联系交流。
学习和实践相结合,建立小项目进行练手,该项目包含几何工具库与图形显示两部分。
当前几何工具库主要包含以下6点:
数据结构和基础几何工具函数
BRep布尔运算:交、并、差
网格剖分
局部造型:倒角、圆角
切割
边线
(1)三维实体数据结构采用BRep表达,由基本的点、线、轮廓、面、体及拓扑数据构成。
(2)基础数学库可自行积累或采用相关开源库,包含点、线、面、向量、矩阵等数据结构及相关运算。
(3)几何工具函数包含求法向、面积、关系判断(点、线、轮廓、体等)、求交(线线、线轮廓、线面、面面、线体、面体等)、距离、射线相交、点合并、邻接关系计算等。
三维实体布尔运算有多种计算方法,如基于BRep、基于三角面等,博主采用的是基于BRep的。
基本运算是面面求交。
原始几何体:立方体和带矩形洞口的立方体
求交运算
求并运算
求减运算:实体1减实体2
求减运算:实体2减实体1
布尔运算效果概览
基础运算为轮廓的网格剖分,包括任意多边形轮廓、带若干洞口轮廓。
BRep实体的剖分可以分解为其组成面的剖分,当然对于曲面,博主采用了离散处理的方式,进而再进行剖分。
网格剖分算法有很多种,博主采用的耳切法,注意无需将三维轮廓转换为二维后进行剖分(剖分后,再还原到三维),可直接对三维轮廓进行剖分运算。
下面效果为在WPF中和OpenGL中显示效果。
几何算法开发和调试离不开显示,提升调试效率和开发体验,相关几何内核库均有显示模块,如OCC/Parasolid/ACIS等。
切割可以利用布尔运算进行实现,不过博主采用的是面切割实体的方式,可以提高运行效率、灵活性和准确性。当然切割和布尔运算公用很多几何工具函数,如面面求交、面切割体等。
对于BRep结构表示的实体,轮廓线是比较容易生成的。为减少内存数据量,可以在实体剖分的时候生成轮廓线。
基于OpenGL进行渲染显示。关于OpenGL学习的更多知识可参考LearnOpenGL CN。
包括几何、材质、光照、线渲染等。
OpenGL坐标系为右手坐标系,y up。为方便博主调试习惯,转换为z up。主要是对模型叠加转换矩阵。
相机是一个单独的话题,包括移动、缩放、旋转等操作,旋转实现了绕鼠标点旋转、绕原点旋转。
为便于操作和调试,增加了当前旋转点标识,即十字光标。
几何算法底层的原理很多是相通的,用到的也都是基础的工具函数,学习和积累非常重要。
多学习多实践,哪怕是基于学习用的小项目进行练手。可以研究学习相关开源库、书籍、论文博客等。
各种运算会导致精度损失,需要注意实现时影响精度的运算,控制和提高精度。
也需要注意渲染、数据方向的学习,应用方面的了解和学习,提高知识广度,更有助于几何算法的开发。
几何工具库维基础库,其效率很重要,在算法设计时需要分析其效率指标。
注:本文仅介绍练手用项目中涉及到的几何算法和显示,几何算法有专而精的特点,但其领域范畴仍然有较大的广度,如凸包、二维布尔运算、Delaunay、最小轮廓、连通性等方面,在相关工作中有广泛的应用。