如何使用Python绘制参数自定义的非对称3D棱台(平截头体)曲面图
Python绘制非对称3D棱台的实现思路
第一步:参数定义与顶点坐标推导
先明确所有自定义参数的物理意义,建立统一的坐标系完成8个顶点的坐标计算:
- 基础参数定义:B为下底宽度、L为棱台纵深长度,alpha、beta分别为左右侧面与底面的倾斜角,H为棱台的垂直高度(上底切平面的z轴坐标)
- 坐标系设定:将下底放置在z=0平面,x轴沿下底宽度方向,y轴沿棱台纵深方向,z轴为垂直高度方向
- 8个顶点坐标计算:
下底4个顶点(z=0):p0 = (-B/2, 0, 0)、p1 = (B/2, 0, 0)、p2 = (B/2, L, 0)、p3 = (-B/2, L, 0)
上底4个顶点(z=H):
上底左侧x坐标为-B/2 + H / np.tan(alpha),右侧x坐标为B/2 - H / np.tan(beta),因此四个顶点为:p4 = (x_upper_left, 0, H)、p5 = (x_upper_right, 0, H)、p6 = (x_upper_right, L, H)、p7 = (x_upper_left, L, H)
第二步:曲面网格生成
基于顶点坐标生成6个面的网格数据:
- 上下底面:直接根据对应x、y范围生成网格,z值固定为对应高度即可
- 四个侧面:可以通过两个对角顶点的坐标做线性插值,生成对应面的x、y、z网格。以左侧侧面为例,连接p0-p3-p7-p4四个顶点,沿y和z方向做线性插值即可得到整个侧面的坐标点集
第三步:3D可视化绘制
推荐使用matplotlib的mplot3d模块实现快速绘制,核心代码逻辑参考:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 自定义参数 B = 10 L = 15 alpha = np.radians(30) beta = np.radians(45) H = 5 # 计算上底左右边界x坐标 x_upper_left = -B/2 + H / np.tan(alpha) x_upper_right = B/2 - H / np.tan(beta) fig = plt.figure() ax = fig.add_subplot(111, projection='3d') # 绘制下底面 x_bottom, y_bottom = np.meshgrid(np.linspace(-B/2, B/2, 20), np.linspace(0, L, 20)) z_bottom = np.zeros_like(x_bottom) ax.plot_surface(x_bottom, y_bottom, z_bottom, color='lightblue', alpha=0.7) # 绘制上底面 x_upper, y_upper = np.meshgrid(np.linspace(x_upper_left, x_upper_right, 20), np.linspace(0, L, 20)) z_upper = np.full_like(x_upper, H) ax.plot_surface(x_upper, y_upper, z_upper, color='lightgreen', alpha=0.7) # 其他侧面绘制逻辑类似,通过线性插值生成网格后调用plot_surface即可 ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') plt.show()
注意事项
- 计算三角函数前需要将角度转换为弧度,避免计算错误
- 要提前做参数合法性校验:确保
H / np.tan(alpha) + H / np.tan(beta) < B,否则上底宽度会出现负数,参数无效 - 如果需要交互性更好的渲染效果,可以改用
plotly或者mayavi库实现
内容的提问来源于stack exchange,提问作者Mateus Forcelini
相关产品推荐
相关产品推荐

