c++ - 可扩展的邻居循环

标签 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(for square mesh four)语句在一个循环中?

问题“如何在多边形网格中找到一个瓦片的所有邻居?”使用图表快速解决。但我想使用数组,这样我就可以使用 CUDA 将它们复制到显卡。

网格示例:

  1. Triangular
  2. Pentagonal
  3. Hexagonal

最佳答案

I want to generalize this algorithm for any type of regular polygon grid (i.e. triangle, square, pentagonal, hexagonal etc.)

您对正多边形网格的定义很不寻常。通常,您可能不会旋转或镜像网格(平铺)的面,因为它被认为是规则的。只有 3 种规则拼贴(三角形、正方形、六边形)。所有五边形拼贴都需要镜像或旋转或两者兼而有之。

让我们将您的问题简化为:“如何在多边形网格中找到一张脸的所有邻居?”一旦你弄明白了这一点,在每个邻居上调用一个函数就很简单了。

网格是具有一定局限性的图形。可以通过用通用图表示网格来概括对邻居的搜索。图的顶点代表面,它们有到邻居的边。网格图是 planar graph .当网格由图表示时,问题就变成了:“给定图中的一个顶点,我如何找到所有相邻的顶点?”

请注意,图的顶点和边与网格的顶点和边不是一回事。例如,六边形网格的网格顶点有 3 条相连的边,而面有 6 个相邻的面,因此每个图顶点有 6 条边。

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

But I want to use arrays

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

但是,如果您想要一个通用算法来处理网格的任何 表格表示,那么我认为您已经将自己逼入绝境。每种表示形式都不同,您需要针对每种表示形式使用不同的算法。

关于c++ - 可扩展的邻居循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33546645/

相关文章:

c++ - 我在fwrite()和fread()上遇到了一些麻烦

c++ - Arduino相当于VB WITH

c++ - 使用共享库与单个可执行文件

c++ - 如何在 C++ 中调用 void foo(int (&)[]) {}?

c++ - 条件运算符(<、>)在 gsl 插值函数中不起作用

c++ - 将数组的内容复制到 C++ 中调整大小的数组

c# - 为什么我不能在 C# 中创建一个 object = bool?

python - R 和 Python 中的 LU 分解结果不一致

java - Java中使用旋转矩阵旋转矩形

ios - 在 iOS/Swift 中,MatrixHelper 属于哪个模块?