如何计算网格索引

How to calculate grid index

本文关键字:网格 索引 计算 何计算      更新时间:2023-10-16

我有一个C++光线投射器,它在(-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。但我不知道该怎么解决。我已经在使用无符号双精度。

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

如何在C++中初始化3D阵列

此外,x * y * z对数组进行索引的方法也不起作用,因为同一索引有多个解决方案(3*4*5=4*3*5)。

假设你的点(x,y,z)有整数坐标,你可以将它们重写为三元系统中的数字。基本上,它只是意味着将+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

不客气!)

感谢您的回答。我在解决方案中遗漏了一些内容,现在重新进行了处理。

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

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来检查一个单元格中的多个成员来改进它。