如何在python中用平面快速剪切三维空间



我在python中有一个3D矩阵:

mat = np.zeros((512,512,480))

每个元素的索引是空间中每个点的坐标。

还有一架飞机:

center = np.array([251.7, 150.2, 200.1])
normal = np.array([-0.07017233, -0.99284769,  0.09658831])

我想要一个mat的面具。如果对应点与法线方向在同一侧,则每个元素的值为1,否则,将值设置为0

好吧,这是我认为最有效的解决方案:

center = np.array([251.7, 150.2, 200.1])
normal = np.array([-0.07017233, -0.99284769,  0.09658831])
x = np.arange(512)
y = np.arange(512)
z = np.arange(480)
xmesh, ymesh, zmesh = np.meshgrid(x,y,z)
xm = xmesh - center[0]
ym = ymesh - center[1]
zm = zmesh - center[2]
p = xm*normal[0] + ym*normal[1] + zm*normal[2]
mat = np.where(p>0,1,0)

这遵循了与另一个答案中描述的相同的数学思想,但是,使用网格和np.where命令,我们可以检查点相对于平行平面的位置。

我实现了一个有3个4个循环的版本,它运行时间超过6分钟,这个版本运行时间为30秒。我希望它能帮助你。

设n=(nx,ny,nz(为法向量,c=(xo,yo,zo(为平面的一点。

并且给定一个点p,其位置向量为r=(x,y,z(。

如果(r-c(和n的点积为正,则点p在平面上方,否则,点在平面下方。

可以通过分析几何图形进行检查。但这只是数学,实现这一点的一种方法是通过对矩阵的索引进行循环,生成它们的向量,减去center,然后使用np.dot()在if语句中生成与normal的点积,该语句将决定值是0还是1

最新更新