我有一个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了。
答案 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来改进它,以检查单元格中的多个成员。