对具有半径的二维阵列进行运算的算法



试图用我的2d游戏想出处理这个问题的最佳方法。我希望能够指定一个坐标对(x,y(和一个半径值。有了这些信息,我想对gameMap[][]的所有元素进行操作。

因此,如果半径=0:

X

如果半径=1:

xxx
xxx
xxx

如果半径=2:

xxxxx
xxxxx
xxxxx
xxxxx
xxxxx

这就是我目前所拥有的,如果半径>1 ,它就会崩溃

for(int i = 1; i < radius; i++) {
                // right
                setAreaObject(locX+i, locY+i);
                setAreaObject(locX+i, (locY+i)-1);
                setAreaObject(locX+i, locY-i);
                // center
                setAreaObject((locX+i)-1, locY+i);
                setAreaObject((locX+i)-1, (locY+i)-1);
                setAreaObject((locX+i)-1, locY-i);
                // left
                setAreaObject(locX-i, locY+i);
                setAreaObject(locX-i, (locY+i)-1);
                setAreaObject(locX-i, locY-i);
            }

感谢您的任何想法或想法

for(int x = locX - radius; x <= locX + radius; x++)
{
    for(int y = locY - radius; y <= locY + radius; y++)
    {
            setAreaObject(x, y);
    }
}

如果希望半径在二维中起作用,则需要在二维中循环。您的代码只在一个方向上循环,然后手动处理Y方向上的+/-1,这就是为什么它不能缩放的原因。手动遍历循环,一次一次迭代,并手动写下对setAreaObject的调用,以更好地理解循环的评估方式。

这应该有效:

for (int x = locX - radius; x <= locX + radius; ++x) {
    for (int y = locY - radius; y <= locY + radius; ++y) {
        setAreaObject(x, y);
    }
}

我们有一个嵌套循环来在两个维度上迭代radius次。基本上,您可以将问题视为在radius乘以radius大小的正方形上调用setAreaObject。这样想,你可以看到,我们可以通过在正方形中每个x坐标的每个y坐标上迭代,总共进行radius*radius次迭代。

最新更新