我有一个以行为主的矢量形式存储的占用网格。假设细胞是用数字来表示的
v = [1, 2, 3, ...... , width * height ]
其中宽度和高度是占用栅格的尺寸
0 1 2 3 4 5
6 7 8 9 10 11
12 13 14 15 16 17
18 19 20 21 22 23
24 25 26 27 28 29
30 31 32 33 34 35
如果我们有一个6 x 6的占用网格。
我现在想做的是将6 x 6的占用网格降采样为2 x 2(或3 x 3)的占用网格。这样做的方法是分别检查以下几组单元格:
0 1 2
6 7 8
12 13 14
3 4 5
9 10 11
15 16 17
18 19 20
24 25 26
30 31 32
21 22 23
27 28 29
33 34 35
,如果单个组中的任何单元都被占用,则 下采样网格中的新单元也将被占用。因此,我获得以下占用网格,其中单元格1,2,3,4的占用率由上方
的4组单元格确定1 2
3 4
如何在C ++中编写for循环以完成任意大小的网格的上述工作?我设法弄清楚的唯一模式是,每行上第一个元素的索引是i * width,其中i是行号
答案 0 :(得分:0)
这里重要的事情可能是2D到1D映射:
idx = x + width * y
有了这个,我们便可以进行下采样:
input:
originalOccupancy[]
originalWidth, originalHeight
newWidth, newHeight
int downsampleFactorX = originalWidth / newWidth;
int downsampleFactorY = originalHeight / newHeight;
for(int y = 0; y < newHeight; ++y)
{
for(int x = 0; x < newWidth; ++x)
{
int bool occupied = false;
//now check all the relevant original cells
for(int oy = 0; oy < downsampleFactorY; ++oy)
{
int originalRowStartIdx = (y * downsampleFactorY + oy) * originalWidth + x * downsampleFactorX;
for(int ox = 0; ox < downsampleFactorX; ++ox)
occupied = occupied || originalOccupancy[originalRowStartIdx + ox];
}
newOccupancy[x + y * newWidth] = occupied;
}
}