问题是这样的:求以下线段所围成的封闭外轮廓。
以下图形在Revit软件中进行模拟实现
涉及算法:向量夹角-逆时针排序法
实现思路:
1.线段打断,线与线之间的相交关系,将长线段在交点处打断重组。效果如下:
打断前:
打断后:
2.去除一端未与其他线段连接的线(称为:孤立线)
3.至此,图面前处理完成,可以进行求外轮廓啦。这里是借助求凸包的思想,用向量逆时针排序的方法循环求取整个外轮廓。具体如下:
3.1 首先定义一个起始点,这里选用坐下角的点(x升序->再y升序)
3.2 确定起始点与其所在的线段后,就可以进行迭代了
3.3迭代关键部分:
当前迭代到P点,记录P点的上一个端点(黄色箭头指向的端点),用上一个端点-当前P点,作为初始向量;
然后,根据前面图面整理的信息,与P有相交关系的三个端点用绿色表示。三个点分别-P,形成三个绿色向量,作为下一个端点的备选方案。
这里,我们就可以根据与a向量逆时针夹角最大的向量作为P的运动方向,相应的端点作为下次迭代的端点P‘。
这里自行体会一下为什么这么做,其实也可以按照顺时针最小来做,关键的核心在于理清上条线段的方向与接下来可走线段方向的夹角关系。
3.4至此,一直迭代到下一个端点与起点重合结束。
3.5最后,获得逆时针外轮廓。效果如下:
PS:这里顺便提一下,点集、线集求外轮廓问题的思路有许多相似之处。下期将介绍一些常用情境下的凸包算法、凹包算法。
最后主要代码部分如下:有些引用方法可能需要读者自行实现(一些简单的点集去重、线段求交之类的)。
由于某些安全性原因,代码后续会通过自己电脑重新写再整理上传。重要的是思路嘛