我有随机排列的任意数量的多边形(在这种情况下是格式),但它们都接触到另一个十六进制。
每个单独的十六进制具有6 x,y顶点。所有的六边形都知道顶点。
有人能指出我将所有六边形组合成一个多边形的算法方向吗?基本上我只是在寻找一个函数来吐出一个顶点位置数组,这些顶点位置的排序方式是当从一个绘制线到另一个时,它会形成多边形。
到目前为止,这是我的方法:
下一步很棘手。我正在使用画布来绘制这些多边形,这主要涉及从一个顶点到下一个顶点绘制一条线。因此,最终数组中顶点的顺序很重要。它无法任意排序。
另外,我不是在寻找“凸包”算法,因为它不能正确绘制多边形。
那里有没有做过这样的事情?我是在正确的轨道还是有更好的更有效的方式?
答案 0 :(得分:5)
我会做这样的事情:
现在你应该有一个点数组,按顺序组成你想要的形状。
请注意,这不会处理漏洞。形状必须可以通过单一路径定义。
答案 1 :(得分:0)
没有跟踪构成线条的坐标对,就无法确定形状的外边界
如果您知道构成线的坐标对,那么
答案 2 :(得分:0)
对于每个十六进制,您有一个包含6个顶点的列表。如有必要,对列表进行排序,以便按逆时针顺序排列顶点(这是数学约定)。
现在你有了一组多边形(最初是六边形)。我们的想法是将多边形组合起来,直到只有一个(或尽可能少)。
选择多边形的边缘,并在其他多边形中查找相同的边(即同一对顶点)。如果有两个实例,则在该边缘处组合两个多边形,例如(a,b,c,d,e,f)+(g,h,d,c,i,j)=> (a,b,c,i,j,g,h,d,e,f)。 (如果两个顶点在两个多边形中的顺序相同,或者边缘有三个或更多个实例,则报告错误并中止。)迭代所有边。如果六边形确实形成一个连续的组,则只剩下一个多边形。
多边形可能有重复的边缘。如果边缘出现多次,则通过将列表拆分为两个来消除它,例如, (a,b,c,d,b,a,e,f,g)=> (b,c,d)+(a,e,f,g)。或者如果边缘相邻,则将它们移除:(a,b,c,b,d,e)=> (a,b,d,e)。或者,如果该列表仅包含该边缘,请删除列表:(a,b)=>什么都没有。
一旦消除了重复边缘,就会有一个列表用于多边形的逆时针外边缘,也可能有一个或多个列表用于孔的顺时针内边缘。