You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:06:07