如何将生成的2D圆形图像转换为3D柱体对象?
将2D圆形图像转换为3D柱体对象
我已经编写了以下代码生成随机数据,并通过掩码将方形图像转为圆形图像:
import numpy as np import matplotlib.pyplot as plt xx, yy = np.meshgrid(np.linspace(0, 1, 32), np.linspace(0, 1, 32)) X = xx Y = yy Z = np.random.rand(32, 32) ##### MASK : SQUARE IMAGE => CIRCLE IMAGE ###### N = 32 m = (N-1)/2 mask = np.ones((N,N)) D = 80 a = D/N for i in range(N): for j in range(N): if (i-m)**2+(j-m)**2 < (D/2/a)**2: mask[i][j] = 0 ################################################ plt.imshow(np.ma.masked_array(Z, mask)) #plt.contourf(X, Y, np.ma.masked_array(Z, mask), zdir='z', offset=0.5, levels=100) plt.show()
当前代码输出的2D圆形图像如下:
我希望将这个2D圆形图像转换为3D柱体对象,也就是通过堆叠多个相同的圆形图像来形成柱体,效果类似以下示例:
实现方案
下面提供两种可行的实现方式,都能达成堆叠形成3D柱体的效果:
方法1:多层2D图像堆叠(模拟柱体)
直接在不同Z轴高度重复绘制带掩码的2D图像,快速实现柱体视觉效果:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 生成基础数据和掩码 xx, yy = np.meshgrid(np.linspace(0, 1, 32), np.linspace(0, 1, 32)) X = xx Y = yy Z_data = np.random.rand(32, 32) N = 32 m = (N-1)/2 mask = np.ones((N,N)) D = 80 a = D/N for i in range(N): for j in range(N): if (i-m)**2+(j-m)**2 < (D/2/a)**2: mask[i][j] = 0 masked_Z = np.ma.masked_array(Z_data, mask) # 创建3D绘图环境 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 定义柱体的高度层数 num_layers = 10 z_levels = np.linspace(0, 1, num_layers) # 在每个Z高度绘制带掩码的图像 for z in z_levels: ax.contourf(X, Y, masked_Z, zdir='z', offset=z, levels=100, cmap='viridis') # 设置坐标轴参数 ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') ax.set_zlim(0, 1) plt.show()
方法2:构建3D数据体渲染柱体
将2D数据扩展为3D数组,通过体渲染实现更真实的3D柱体效果:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm # 生成基础数据和掩码 xx, yy = np.meshgrid(np.linspace(0, 1, 32), np.linspace(0, 1, 32)) X = xx Y = yy Z_data = np.random.rand(32, 32) N = 32 m = (N-1)/2 mask = np.ones((N,N)) D = 80 a = D/N for i in range(N): for j in range(N): if (i-m)**2+(j-m)**2 < (D/2/a)**2: mask[i][j] = 0 # 将2D数据扩展为3D体数据 num_layers = 10 Z_3d = np.repeat(Z_data[np.newaxis, :, :], num_layers, axis=0) mask_3d = np.repeat(mask[np.newaxis, :, :], num_layers, axis=0) masked_3d = np.ma.masked_array(Z_3d, mask_3d) # 创建3D绘图环境 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 生成3D网格坐标 x, y, z = np.meshgrid(np.linspace(0,1,32), np.linspace(0,1,32), np.linspace(0,1,num_layers)) # 绘制3D柱体 ax.voxels(x, y, z, ~mask_3d, facecolors=cm.viridis(Z_3d/Z_3d.max()), edgecolor='none') # 设置坐标轴参数 ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') plt.show()
内容的提问来源于stack exchange,提问作者DiamondProx
相关产品推荐
相关产品推荐



