1.前言
整理下二维几何算法相关内容,简单记录,方便你我他。欢迎交流探讨。
几何算法是一个和数学紧密联系的学科范畴,具有专而精的特点,但仍不失其广阔性,尤其是应用范围。
几何算法本身没有严格的二三维区分,很多原理可由二维推广到三维,一些复杂三维算法可以分解为二维实现,但由于目标或应用范畴的需要,仍然可以关注到二维几何算法部分。
2.几何工具算法
2.1. 基础算法
点、线、轮廓、向量/矩阵数据结构及运算、法向、面积、形心、弧长、共线合并、点投影、点线轮廓关系、拟合、线分割、区域寻找、路径寻找、凸包、最近点寻找、凹多边形分割为若干凸多边形、轮廓外扩内缩、二维几何型体识别、几何型体比较、任意环分割等实现以及其他既有及相关算法库维护。
2.2. 凸包
2.3. 几何型体比较
其实二三维几何型体比较思路是一样的,可以提取若干几何特征数据进行比对。当然如果涉及到几何型体识别就是另一回事了,需要提取目标几何型体的若干特征数据与多种源几何型体特征数据进行比对或搜索。
2.4. 布尔运算
布尔运算有多种算法方式,其中两种方式可参考博主的另一篇博文:https://blog.csdn.net/baidu_38621657/article/details/99173958
也可研究学习clipper等开源库。
2.5. Delaunay剖分
2.6. 网格剖分
博主采用耳切法进行任意多边形的网格剖分,包括带多个洞口的多边形。
如果轮廓有弧线、椭圆弧、贝塞尔曲线、样条曲线等,可以将其离散,进而作为多边形进行处理。
关于椭圆弧离散的方案可参考博主另一篇博文:https://blog.csdn.net/baidu_38621657/article/details/87907829
2.7. 线切割轮廓
与布尔运算原理类似。
2.8. 提取最小轮廓/最大轮廓
利用向量点乘运算,结合极角规则,可进行最小轮廓/最大包围轮廓的提取。
2.9.点合并
点合并算法有多种,需要考虑效率和内存,合理利用短路运算、红黑树搜索、动态生长等原理,可缩减运行时间,降低内存占用。
详细参考博主博文:https://blog.csdn.net/baidu_38621657/article/details/120276469
2.1.0.轮廓线提取
对于三角网格数据,提取其外观轮廓,类似于网格剖分的逆向过程。有多种方法可采用,同样需考虑效率和内存,如计算邻接关系通过共边和法向的判断来消除内部边、或转换为哈希表或红黑树搜索来“搜索”外观轮廓。
2.11.关系判断
包括点、线、轮廓关系判断,如点线关系、点与轮廓关系、线与轮廓关系等,同样有多种成熟的算法可以采用,需要注意运行效率。
2.12.捕捉吸附
捕捉吸附为CAD算法中核心内容之一,涉及到点投影、最短距离、点线关系等内容。
https://blog.csdn.net/baidu_38621657/article/details/88255754
2.12.其他
可参考博主博文或了解相关几何工具算法。
3.显示
几何算法离不开渲染显示话题,博主之前使用过GDI+、基于软件的二次开发、WPF、OpenGL等方式。
当然几何算法的应用往往也离不开显示,如果要开发CAD/CAE/CAM软件,显示模块非常重要,可以说是图形引擎。
4.总结
几何算法底层的原理很多是相通的,用到的也都是基础的工具函数,学习和积累非常重要。
很多原理可由二维推广到三维,一些复杂三维算法可以分解为二维实现。
多学习多实践,哪怕是基于学习用的小项目进行练手。可以研究学习相关开源库、书籍、论文博客等。
各种运算会导致精度损失,需要注意实现时影响精度的运算,控制和提高精度。
也需要注意渲染、数据方向的学习,应用方面的了解和学习,提高知识广度,更有助于几何算法的开发。
几何工具库维基础库,其效率很重要,在算法设计时需要分析其效率指标。
注:本文仅介绍部分常用的二维几何算法和显示,几何算法有专而精的特点,但其领域范畴仍然有较大的广度,在相关工作中有广泛的应用。