文章目录
- 工具步骤
- 应用场景
- 算法输入
- 算法输出
- 算法示意图
- 算法原理
工具步骤
选中待分割面,点击“线分割面”工具,绘制和面至少两个交点的线,双击结束,执行分割操作
应用场景
快速切分大型几何面,以降低面的复杂度,提升编辑效率。常与合并操作共同使用。
算法输入
待分割的面和一条绘制的线
算法输出
分割后的多面
算法示意图
算法原理
该算法参考该原理:几何计算-基于Turf.js实现多边形的拆分及合并
该原理示意图
上述方法存在以下问题:
- lineSplit方法利用lineIntersect的相交点,无法正确切割线,因为lineSplit对splitter取了7位精度
- 根据质心判断分割面是否在输入面内有局限性,特殊场景判断有误
因此,本算法主要在这两部分做出改进:
对1改进:
- 先利用lineIntersect方法,计算出面的外轮廓outerL和线L的交点intersects = [S0,S1]
- 遍历intersects,对每一个交点,利用nearestPointOnLine方法,算出交点在outerL和L中的索引outerLinds和Linds
- 对outerLinds和Linds按照距离线段起始点距离从小到大排序,得到outerLinds_sort和Linds_sort
- 遍历outerLinds_sort和Linds_sort,生成多个线段outerPieces和lPieces,全部放入pieceCollection中
- 利用polygonize处理pieceCollection,得到多面splittedCollection
对2改进:
- 遍历splittedCollection,利用intersect方法判断是否和outerP相交,如果相交,则保留,得到filterCollection(这里不能用booleanIntersect方法,有精度问题)
最终,遍历filterCollection,和孔洞做diff,得到finalCollection