将任意数量的多边形组合在一起

时间:2012-12-01 23:02:12

标签: algorithm hex polygon hexagonal-tiles

我有随机排列的任意数量的多边形(在这种情况下是格式),但它们都接触到另一个十六进制。

enter image description here

每个单独的十六进制具有6 x,y顶点。所有的六边形都知道顶点。

有人能指出我将所有六边形组合成一个多边形的算法方向吗?基本上我只是在寻找一个函数来吐出一个顶点位置数组,这些顶点位置的排序方式是当从一个绘制线到另一个时,它会形成多边形。

到目前为止,这是我的方法:

  1. 为所有六边形创建所有顶点的数组。
  2. 确定数组中顶点出现的次数
  3. 如果顶点在数组中的次数超过3次,则从数组中删除顶点。
  4. 如果顶点在数组中2次,请删除其中一个。
  5. 下一步很棘手。我正在使用画布来绘制这些多边形,这主要涉及从一个顶点到下一个顶点绘制一条线。因此,最终数组中顶点的顺序很重要。它无法任意排序。

    另外,我不是在寻找“凸包”算法,因为它不能正确绘制多边形。

    那里有没有做过这样的事情?我是在正确的轨道还是有更好的更有效的方式?

3 个答案:

答案 0 :(得分:5)

我会做这样的事情:

  1. 列出所有方面。一侧由两对坐标定义。
  2. 如果任何一方出现多次,请删除该方的所有实例。
  3. 选择一个任意一面,从那一侧选择一个点。
  4. 将该点放在数组中。
  5. 按照当前的一面,将另一个点放在数组中。
  6. 删除您刚刚关注的一面。
  7. 然后找到另一侧有一个与数组中最后一个点相同的点。只会有一个这样的一面。如果没有,那就完成了。
  8. 返回第5步。
  9. 现在你应该有一个点数组,按顺序组成你想要的形状。

    请注意,这不会处理漏洞。形状必须可以通过单一路径定义。

答案 1 :(得分:0)

没有跟踪构成线条的坐标对,就无法确定形状的外边界

如果您知道构成线的坐标对,那么

  1. 创建2个列表,其中一个顶点(列表1),一个行(列表2)
  2. 从顶点列表中删除所有重复的顶点
  3. 创建一个新列表(列表3),其中包含连接3行的所有顶点
  4. 使用列表3,删除列表3中包含2个顶点的所有行作为其两个坐标对
  5. 是时候遍历形状了,剩余的线条列表应该形成你想要的形状 然后从任意坐标开始 对于每个坐标 对于所有线路     如果(x1,y1)=当前坐标,则添加(x2,y2)以堆叠并从列表中删除该行          打破     elseif(x2,y2)=当前坐标然后添加(x1,y1)以堆叠并从列表中删除该行          破

答案 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)=>什么都没有。

一旦消除了重复边缘,就会有一个列表用于多边形的逆时针外边缘,也可能有一个或多个列表用于孔的顺时针内边缘。