对于同时计算所有值的循环



所以我有一个元胞自动机,我可以在图像上放置像素,它们只需每个"刻度"向下移动一个像素。现在的问题是因为for循环是这样的:

for(int x = 0; x < 100; x++){
for(int y = 0; y < 100; y++){
//Check if nothing below (x,y) pixel and move it down if so
}
}

然后像素被传送到底部,因为它们在y循环的每一次迭代中都会向下移动。我通过让y循环从100向下到0而不是从0到100来解决这个问题,所以它向上迭代,但如果我想在某些情况下让像素向上移动,它就不起作用。

也许是一个双循环,它列出了要移动的像素和第一个像素的位置,并在第二个像素中实际移动,但这似乎相当高性能,我相信有更好的解决方案

附言:如果你对这个问题有更好的标题,请告诉我

您需要两个单元格副本。在伪代码中:

int[] currentCells = new int[...];
int[] nextCells = new int[...];
Initialize(currentCells);
while (true) {
Draw(currentCells);
Calculate next state by using currentCells as source and store result into nextCells;
// exchange (this copies only references and is fast).
var temp = currentCells;
currentCells = nextCells;
nextCells = temp;
}

请注意,我们循环遍历目标(nextCells(的每个单元格,为其获取一个新值。在整个过程中,我们从不查看nextCells中的单元格,因为这些单元格可能已经被移动了。我们的源是严格意义上的currentCells,它现在表示以前的(冻结的(状态。

// Calculate next state.
for(int x = 0; x < 100; x++){
for(int y = 0; y < 100; y++){
if(currentCells[x, y] == 0 && y > 0) { // Nothing here
// Take value from above
nextCells[x, y] = currentCells[x, y - 1];
} else {
// Just copy
nextCells[x, y] = currentCells[x, y];
}
}
}

例如,在康威的《生命的游戏》中,你通过分析周围细胞的值来计算细胞的状态。这意味着向上和向下都不起作用。通过有两个缓冲区,您总是有一个在计算下一个状态时不会更改的源缓冲区。

假设您已经在内部for循环中完成了想要做的事情,那么这样的操作是否正确?

static void MovePixels(bool moveUp)
{
for (int x = 0; x < 100; x++)
{
if (moveUp)
{
for (int y = 0; y < 100; y++)
{
}
}
else
{
for (int y = 100; y > 0; y--)
{
}
}
}
}

相关内容

  • 没有找到相关文章

最新更新