vector - 在 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 网格的面、边缘或顶点上设置中心为球形源时,问题就出现了。有没有比为每个面、每个顶点和每个角重复上面的代码更好的方法?
解决方案
有没有更好的方法为每个面、每个顶点和每个角重复上面的代码?
我认为您实际上的意思是“有没有比为每个面、每个顶点和每个角重复上面的代码更好的方法?” - 这是另一种方式;由读者判断是否更好:
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;
}
推荐阅读
- c++ - 如何在构造函数中访问类变量以在不使用 C++ 中的 this 指针的情况下分配它们
- haskell - 从 Haskell 的列表中返回序列的第一次迭代
- r - 在R中将分组对组合成一个组
- php - 如何通过 sharedprefrence 保存列表数据
- rust - 为什么 Rust 迭代器的 FnMut 是谓词而不是 Fn?
- python - 不能将 2 定义为素数
- python-3.x - 如果python中相同值的条件不同
- java - 如何从 Firebase 列表视图中的管理员帐户中删除用户帐户?
- c - 在不使用繁忙等待实现的情况下休眠线程的最佳方法是什么?
- java - 控制器和检票口页面的设计模式帮助