c++ - 如何对占用网格进行下采样?
问题描述
我有一个以行主要形式的向量形式存储的占用网格。假设细胞由它们的数字表示
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 是行号
解决方案
这里重要的可能是 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;
}
}
推荐阅读
- redis - Yii2 RBAC Redis - 怎么了?
- macos - 错误:CFSocketSetAddress 绑定失败:1
- jenkins - 多个 Jenkins 作业与 Cucumber 注释并行
- c++ - 使用光流进行人脸地标和稳定化
- ms-access - 在动态报告中创建组级别 (MS Access)
- docker - /bin/bash: 脚本/script.sh: 权限被拒绝
- gradle - 如何将模块的 jar 作为依赖项包含在 Gradle 中的另一个模块中?
- css - 如何获得 Angular 的
使用 CSS 网格 - json - 当数据不可用时,如何在 Google 表格中解析带有后备的嵌套 JSON 结构?
- pdf-generation - 如何防止 cairo 栅格化我的图案填充?