如何计算网格索引

时间:2015-06-28 15:40:11

标签: c++ arrays floating-point-precision

我有一个C ++ raycaster,它将数百万个点插入(-1,-1,-1)到(1,1,1)的范围内。为避免将重复点插入顶点缓冲区,我想检查某个范围是否已经存在一个点。

这就是我如何设置我的网格:

const int size = 500 * 500 * 500;
bool *grid = new bool[size];

for(int i = 0; i < size; i++)
  grid[i] = false;

unsigned double divide = 2.0 / size;

现在我想检查要添加的交叉点:

// In my code i handle negative and positive cases
int  x = intersection.X / divide;
int  y = intersection.Y / divide;
int  z = intersection.Z / divide;

if(!grid[x * y *z])
  //insert
else
  //discard

我面临的问题是,除非总是为0,因为尺寸过高。但我无法得到如何解决这个问题。我已经使用unsigned double了。

3 个答案:

答案 0 :(得分:2)

您需要使用三维数组来存储布尔值。

How to initialize 3D array in C++

此外,您的x * y * z索引数组的方法将无效,因为同一索引有多个解决方案(3 * 4 * 5 = 4 * 3 * 5)。

答案 1 :(得分:0)

假设您的点(x,y,z)具有整数坐标,您可以在3-nary系统中将它们重写为数字。基本上,它只是意味着为每个坐标添加+1

(x,y,z) --> x+1,y+1,z+1
(-1,1,0) --> 021
(1,1,1) ---> 222
(-1,-1,-1) --> 000

通过这种方式,每个点都是唯一的,值的范围从000到222,即3 ^ 3 = 27个不同的值。

所以,你可以存储一个包含27个值的数组:

bool grid[27];
/* initialize to false, e.g. memset(grid, false, sizeof(grid)) */

if(!grid[9*(x+1) + 3*(y+1) + z]) // converting to ternary
   //insert
else
   //discard

欢迎你! ;)

答案 2 :(得分:0)

感谢您的回答。我在我的解决方案中遗漏了一些内容并现在重新修改。

我现在使用3D网格并计算我的网格大小,其名称为

const int value = 500;

bool ***grid = new bool**[value];
for(int i = 0; i < value; ++i)
{
  grid[i] = new bool*[value];
  for(int j = 0; j < value; ++j)
  {
    grid[i][j] = new bool[value];
  }
}

double divide = 2.0 / value;

因为我的点云区域从(-1,-1,-1)变为(1,1,1),所以我将它从(0,0,0)变为(2,2,2)并计算网格数量。演员阵容很脏,当我知道我的确切分辨率时,我会避开他们。

     Vector3F gridIntersection(intersection.X + 1.0f, intersection.Y + 1.0f, intersection.Z + 1.0f);

      x = (int) ((double) gridIntersection.X / divide);
      y = (int) ((double) gridIntersection.Y / divide);
      z = (int) ((double) gridIntersection.Z / divide);

      if(!grid[x][y][z])
      {
        grid[x][y][z] = true;
      }

我有一个~119 MB的内存使用量。我还将通过使用char而不是bool来改进它,以检查单元格中的多个成员。