邻居可扩展的循环

时间:2015-11-05 14:05:53

标签: c++ arrays matrix cuda convex-polygon

众所周知,如果想要布置实数的方格(又称矩阵),他可以使用array行主要顺序。让我们绘制一些元素的邻域i:

...................................
...|i-width-1|i-width|i-width+1|...
...|   i-1   |   i   |   i+1   |...
...|i+width-1|i+width|i+width+1|...
...................................

让我们简单地假设我在方格网格的中间,所以没有边界问题。(我们可以添加%(width*height)并在边框网格上连接)。因此,如果想要对第i个元素中的每个元素做一些事情,那么应该做:

//function which does something with element at idx
void DoSomethinWithElement(size_t idx);

//left neighbour
DoSomethinWithElement(i-1);
//right neighbour
DoSomethinWithElement(i+1);
//top neighbour
DoSomethinWithElement(i-width);
//bottom neighbour
DoSomethinWithElement(i+width);

我想概括这个算法的任何类型的正多边形网格(即三角形,正方形,五边形,六边形等)。规则意味着它只构造一种类型的多边形(即仅来自三角形)。

如何推广任何类型的多边形网格:  1.阵列中其他网格的布局?  2.循环中的这些N(对于方形网格四)语句?

问题"如何在多边形网格中找到瓷砖的所有邻居?"使用图表快速解决。但我想使用数组,所以我可以用CUDA将它们复制到显卡。

网格示例:

  1. Triangular
  2. Pentagonal
  3. Hexagonal

2 个答案:

答案 0 :(得分:3)

  

我想对任何类型的正多边形网格(即三角形,正方形,五边形,六边形等)推广该算法。

您对常规多边形网格的定义很不寻常。通常,您可能无法旋转或镜像网格(平铺)的面以使其被视为常规。只有3个常规倾斜(三角形,正方形,六边形)。所有五边形倾斜都需要镜像或旋转或两者兼而有之。

让我们简化你的问题:“如何找到多边形网格中面部的所有邻居?”一旦你弄明白了,在每个邻居上调用一个函数是微不足道的。

网格是具有某些限制的图形。通过用一般图表表示网格,可以概括搜索邻居。图的顶点表示面,它们与邻居有边。网格图是planar graph。当网格由图形表示时,问题变为:“给定图形中的顶点,如何找到所有相邻顶点?”

请注意,图形的顶点和边缘与网格的顶点和边缘不同。例如,六边形网格的网格顶点有三个连接边,而面有六个相邻面,因此图顶点各有六条边。

表示图表的一种方法是adjacency list。在此表示中,您只需要查找顶点的邻接列表以找到它的所有邻居。

  

但我想使用数组

因为每个邻接列表的大小是不变的,所以可以使用像decltype_auto的答案那样的数组来实现它们。或者您可以使用邻接矩阵表示图形。

但是如果你想要一个用于任何网格的表格表示的通用算法,那么我认为你已经把自己描绘成了一个满足这个要求的角落。每种表示方式都不同,每种方法都需要不同的算法。

答案 1 :(得分:1)

您可以通过N * K长度的1D向量v或2D NxK矩阵M来表示多边形数N的K多边形网格的邻接关系。使用std::size_t -1,nullptr或任何套件参考类型你已经存储在v或M中,表示边界上有失踪的邻居。

给定这样的NxK矩阵M:

对于多边形n的邻居,你从M [n] [0]迭代到M [n] [K-1],通过你存储在M中的任何参考来获取邻居,并应用你想要的任何函数他们。