gpt4 book ai didi

python - 在 3D numpy 数组中绘制和/或获取 2D 平面的索引

转载 作者:行者123 更新时间:2023-12-04 07:20:59 24 4
gpt4 key购买 nike

我有一个 3D numpy 数组,例如形状(200,200,200) .
我还有一个 2D 平面,我可以用以下形式表达ax + by + cz + d = 0(x,y,z)点和方向向量的三个 x,y,z轴。
我想在 3D numpy 数组上“绘制”这个平面,方法是将位于这个平面上的所有点的值更改为一个常数值。
像这样,但只有一种颜色:
enter image description here
对此(我认为)最通用的解决方案是获取沿这条线的所有点的整数索引。然后我可以使用它来索引 numpy 数组。然而,如果一个库提供了直接绘制平面的能力,而不提供索引,那么这会很好。
我在这个站点上看到了一些表面上与我的问题相似的问题,例如找到沿着 x,y,z 分布的值的方法。矢量使用 scipy.ndimage.map_coordinates ,但当然我正在处理一个平面而不是一条线(这也只是返回值,而不是索引)。
我考虑过的另一种方法,但似乎很难(而且可能很慢)类似于 this question其中回复显示了如何在 3D 空间中绘制 2D 三角形。我可以改为在 3D 空间中绘制一个正方形,但这表明填充这个正方形并非微不足道,而且如果至少一个轴平行于 x、y 或 z(或“角”),则正方形只会填充整个平面将保持未填充)。
有没有人知道我如何实现这一目标?

最佳答案

如果平面接近水平,您可以为 x 和 y 赋值并计算 z:

a, b, c, d = 1, 2, 3, -600                     # Plane parameters
v = np.arange(200)
x, y = np.meshgrid(v, v) # All xy combinations
z = np.rint((a*x + b*y + d) / -c).astype(int) # Rounded
plane_voxels = np.dstack([x,y,z]).reshape(-1,3)
print(plane_voxels)
结果是:
[[  0   0 200]
[ 1 0 200]
[ 2 0 199]
...
[197 199 2]
[198 199 1]
[199 199 1]]
对于一般情况,您需要找到可变性较小的维度,这将是计算变量,并为其他两个提供值:
a, b, c, d = 1, 2, 3, -600
v = np.arange(200)
dim = np.argmax(np.abs((a, b, c)))
if dim == 0:
y, z = np.meshgrid(v, v)
x = np.rint((b*y + c*z + d) / -a).astype(int)
elif dim == 1:
x, z = np.meshgrid(v, v)
y = np.rint((a*x + c*z + d) / -b).astype(int)
elif dim == 2:
x, y = np.meshgrid(v, v)
z = np.rint((a*x + b*y + d) / -c).astype(int)
plane_voxels = np.dstack([x,y,z]).reshape(-1,3)

关于python - 在 3D numpy 数组中绘制和/或获取 2D 平面的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68502227/

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