如何计算网格索引
How to calculate grid index
我有一个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来检查一个单元格中的多个成员来改进它。
相关文章:
- 数组索引的值没有增加
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 查找最接近的大于当前数字的数字的索引
- 在C++中调整向量中的索引
- 重载元组索引运算符-C++
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为std::string的某个索引赋值
- 并行用于C++17中数组索引范围内的循环
- 跟随整数索引列表的自定义类迭代器
- 如何在for循环中包含两个索引值的测试条件
- D3D11-将混合权重和索引传递到顶点着色器
- 使用 glvertex4i 传递网格面索引时的顶点着色器错误
- 使用此网格函数的立方体的正确顶点和索引是什么
- 当我在网格/面中实现索引时,为什么它会返回OpenGl错误
- 用于存储网格(将具有负索引)的数据结构
- 如何在C++中创建一个网格,这将允许我将每个索引设置为一个向量,以便以后操作该向量,然后绘制它
- 国际象棋游戏的数学网格的 2D 索引
- OpenGL优化网格绘制(VAO?无索引?)
- 操纵网格对象中的索引
- 如何计算网格索引