gpt4 book ai didi

c++ - 用 map 填充数组的函数

转载 作者:太空狗 更新时间:2023-10-29 20:47:30 24 4
gpt4 key购买 nike

我是 C++ 的新手,所以我不确定我是否以正确的方式解决了这个问题。我正在处理 3D 体素数据数组,我想创建一个并行数据结构来存储等值面法 vector 。内存效率是一个问题,所以我想使用一个 2D map 数组,它由一个整数索引并包含一个 3D vector 。

想法是二维数组索引每个 x 和 y 坐标,而 map 仅​​索引包含一个值的 z 坐标(通常在 0 到 3 个值之间分布在 z 轴的每一行)。

问题 1:如何创建二维 map 数组,如 std::map<int, Vector3f> surfaceNormals;

问题 2:我的想法是声明二维数组为全局数组,然后用一个函数填充它,该函数通过指针处理它并为每个数组单元格创建一个映射,下面的代码是否在正确的轨道上? ?????? 表示鉴于我对问题 1 的不确定性,我不确定该放什么。

特别是我是否正确管理指针/引用/值,以便最终存储我需要的所有数据?

????? isoSurfaces1 [256][100];

????? *extractIS(float Threshold, ????? *pointy){

????? *surfacePointer = pointy;

for loop over x and y {

std::map<int, Vector3f> surfaceNormals;

for loop over z {

[ ... find surface voxels and their normal vectors ... ]

Vector3f newNormalVector(x,y,z);

surfaceNormals[zi] = newNormalVector;
}

surfacePointer[x][y] = surfaceNormals;
}

return surfacePointer;
}

extractIS(0.45, isoSurfaces1);

最佳答案

如果我没理解错的话,你想使用坐标作为 std::map 键?

您可以只创建一维 std::map,并将 XYZ 坐标转换为一维坐标系:

int pos1d = z*max_x*max_y+y*max_x+x;

然后将其放入 map 键。

编辑:或者您可以像 Space_C0wb0y 显示的那样使用 x、y、z 作为整数的结构,但这当然会为每个 std::map 键占用 3 倍的内存,还要注意我展示的示例将具有最大立方体大小:1625x1625x1625(如果是无符号整数),因此如果您需要更长的坐标,则使用结构,但请注意,对于结构,您必须为 std::map 键数据类型编写比较器函数。

编辑 3:我认为这就是您要找的东西,因为我注意到您使用了最大 256 坐标值,这是我想出的:

// NOTE: max 256x256x256 cube coordinates with this struct. change unsigned char to short or int etc if you need larger values.
// also note that if you change to something else than unsigned char, you cant use nor compare the union: v1.Pos > v2.Pos anymore.
// (unless you use unsigned short for each coordinate, and unsigned __int64 for the union Pos value)

union PosXYZ {
struct {
unsigned char x, y, z, padding; // use full 32bits for better performance
};
unsigned __int32 Pos; // assure its 32bit even on 64bit machines

PosXYZ(unsigned char x, unsigned char y, unsigned char z) : x(x), y(y), z(z), padding(0) {} // initializer list, also set padding to zero so Pos can be compared correctly.
};


inline bool operator>(const PosXYZ &v1, const PosXYZ &v2){
return v1.Pos > v2.Pos;
}


typedef map<PosXYZ, Vector3f, greater<PosXYZ> > MyMap;


void extractIS(float Threshold, MyMap &surfacePointer){
for loop over x and y {
for loop over z {
// [ ... find surface voxels and their normal vectors ... ]
Vector3f newNormalVector(x,y,z);

surfacePointer[PosXYZ(x,y,z)] = newNormalVector;
}
}
}


MyMap isoSurfaces1;

extractIS(0.45, isoSurfaces1);

另一种实现此 std::map 键结构的方法是仅使用纯整数值,您可以通过自己的函数生成类似于:((x << 16) | (y << 8) | z) ,这会稍微简化一些事情,因为您不再需要 std::map 的比较函数。

#define PosXYZ(x,y,z) (((x) << 16) | ((y) << 8) | (z)) // generates the std::map key for 256x256x256 max cube coords.

typedef map<unsigned __int32, Vector3f, greater<unsigned __int32> > MyMap;


void extractIS(float Threshold, MyMap &surfacePointer){
for loop over x and y {
for loop over z {
// [ ... find surface voxels and their normal vectors ... ]
Vector3f newNormalVector(x,y,z);

surfacePointer[PosXYZ(x,y,z)] = newNormalVector;
}
}
}


MyMap isoSurfaces1;

extractIS(0.45, isoSurfaces1);

关于c++ - 用 map 填充数组的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5489331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com