首页 > 解决方案 > 在 3D 矢量中填充周围的单元格

问题描述

我需要以某种方式填充 3d 向量,一旦 x、y、z 固定,代码必须在所有最近的邻居中写入数字(即所有具有 x+/-1、y+/-1、z+/ 的单元格) -1)。当然,我不希望边界外的单元格成为填充物。到目前为止,我已经尝试了以下方法

void setSphericalSource(int x, int y, int z, float sigma, vector<vector<vector<float>>>& vec, float maxAct) {

float total_activity = 0.0;
vec[z][y][x] = maxAct ; //hotspot
total_activity += maxAct;

if (x > 0 && x < vec[0][0].size() && y > 0 && y < vec[0].size() && z > 0 && z < vec.size()) {
    
    //cells with face in common
    vec[z][y][x + 1] = maxAct/2;
    vec[z][y][x - 1] = maxAct/2;
    vec[z][y + 1][x] = maxAct/2;
    vec[z][y - 1][x] = maxAct/2;
    vec[z + 1][y][x] = maxAct/2;
    vec[z - 1][y][x] = maxAct/2;


    //cells with edge in common
    vec[z][y + 1][x + 1] = maxAct/3;
    vec[z][y + 1][x - 1] = maxAct/3;
    vec[z][y - 1][x + 1] = maxAct/3;
    vec[z][y - 1][x - 1] = maxAct/3;
    vec[z + 1][y][x + 1] = maxAct/3;
    vec[z + 1][y][x - 1] = maxAct/3;
    vec[z - 1][y][x + 1] = maxAct/3;
    vec[z - 1][y][x - 1] = maxAct/3;
    vec[z + 1][y + 1][x] = maxAct/3;
    vec[z + 1][y - 1][x] = maxAct/3;
    vec[z - 1][y + 1][x] = maxAct/3;
    vec[z - 1][y - 1][x] = maxAct/3;


    //cells with a vertex in common
    vec[z + 1][y + 1][x + 1] = maxAct/4;
    vec[z + 1][y + 1][x - 1] = maxAct/4;
    vec[z + 1][y - 1][x - 1] = maxAct/4;
    vec[z - 1][y - 1][x - 1] = maxAct/4;
    vec[z + 1][y - 1][x + 1] = maxAct/4;
    vec[z - 1][y + 1][x + 1] = maxAct/4;
    vec[z - 1][y - 1][x + 1] = maxAct/4;
    vec[z - 1][y + 1][x - 1] = maxAct/4;

}

}

在实践中,我首先检查 x,y,z 是否属于 3d 向量的内部,然后转到外部单元格,依此类推,直到填充所选中心周围的球形体积(跳过超出边界的单元格) .

当我想在 3D 网格的面、边缘或顶点上设置中心为球形源时,问题就出现了。有没有比为每个面、每个顶点和每个角重复上面的代码更好的方法?

标签: vector3dnearest-neighbor

解决方案


有没有更好的方法为每个面、每个顶点和每个角重复上面的代码?

我认为您实际上的意思是“有没有为每个面、每个顶点和每个角重复上面的代码更好的方法?” - 这是另一种方式;由读者判断是否更好:

    for (int k = -1; k <= 1; ++k)
    for (int j = -1; j <= 1; ++j)
    for (int i = -1; i <= 1; ++i)
    {
        int d = abs(i)+abs(j)+abs(k)+1;
        x += i, y += j, z += k;
        if (0 <= x && x < vec[0][0].size()
         && 0 <= y && y < vec[0]   .size()
         && 0 <= z && z < vec      .size()
           ) vec[z][y][x] = maxAct/d;
        x -= i, y -= j, z -= k;
    }

推荐阅读