一次性布尔多个复杂图形
Bentley Ottmann 扫描线法
比较传统的老办法,只能求交不能布尔。
目前最好的文章是这篇。
建议先依据该算法把扫描线的结构搭出来。
Martinez 扫描线法
相关论文。
还可以看一下 Boost::polygon 的源码,虽然我没看完,但是感觉用的就是 Martinez 扫描线法(流程很相似),而且它论文上也说它用的是扫描线。
还在网上找到唯一一篇讲解 Martinez 扫描线法的中文文章。
求交
求交不需要考虑特殊情况,唯有一些需要人为调控的精度误差,具体思路在论文中已经介绍的很详细了,就不赘述了。
- 按照 Bentley Ottmann 扫描线法的逻辑将所有点事件加入优先队列中,并依次处理;
点事件排序时,对于坐标值相同的节点事件,应把终点放在起点前面,其次如果都是起点再继续比较另一个端点(终点)的纵坐标(优先)和横坐标。
- 如果存在线段相交,应将其裁剪并将新的点事件加入优先队列,同时根据布尔规则选取有效线段加入集合中。
布尔
因为最近在忙别的任务,暂时只研究了一些。
代码
代码讲解。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.