如何使用matplotlib将3D曲面转换为指定y轴取值下的2D线图
解决方案
你的每个曲面都是由y坐标固定为114.5和1535.5的两条边构成的双线性平面,我们可以通过线性插值快速计算任意y值下的截线坐标:
- 对每个曲面,先获取y方向的上下边界值
y_low=114.5、y_high=1535.5 - 计算插值系数
t = (目标y值 - y_low) / (y_high - y_low) - 用
t分别对上下边的x、z坐标做线性插值,得到截线的两个端点 - 把每个曲面的截线绘制在同一张2D图上即可得到目标意大利面图
以下是可直接运行的完整代码:
import numpy as np import matplotlib.pyplot as plt # 原始点数据 points = np.array ([[[472.983284, 114.5,-1792.], [720.65216064, 1535.5, -1792.], [1500.20385742, 1535.5, -1008.], [1252.39562988, 114.5, -1008.]], [[590.38764954, 114.5, -1792.], [652.08530426, 1535.5, -1792.], [1405.10574341, 1535.5, -1008.], [1343.39660645, 114.5, -1008.]], [[679.80918884, 114.5, -1792.], [568.60767365, 1535.5, -1792.], [1323.85253906, 1535.5, -1008.], [1435.00518799, 114.5, -1008.]]]) # 自定义目标y值,可任意修改 target_y = 114.5 # 验证y值是否在曲面的y范围内 y_min, y_max = 114.5, 1535.5 if not (y_min <= target_y <= y_max): raise ValueError(f"目标y值需在[{y_min}, {y_max}]范围内") # 计算插值系数 t = (target_y - y_min) / (y_max - y_min) plt.figure(figsize=(8, 4)) # 遍历每个曲面计算截线 for idx, surf in enumerate(points): # 取y=114.5边的两个点(点0和点3)、y=1535.5边的两个点(点1和点2) low_p1, low_p2 = surf[0], surf[3] high_p1, high_p2 = surf[1], surf[2] # 线性插值得到截线的两个端点 cut_p1_x = low_p1[0] * (1 - t) + high_p1[0] * t cut_p1_z = low_p1[2] * (1 - t) + high_p1[2] * t cut_p2_x = low_p2[0] * (1 - t) + high_p2[0] * t cut_p2_z = low_p2[2] * (1 - t) + high_p2[2] * t # 绘制截线,label可选,方便区分不同曲面 plt.plot([cut_p1_x, cut_p2_x], [cut_p1_z, cut_p2_z], label=f'曲面{idx+1}', linewidth=2) plt.xlabel('X') plt.ylabel('Z') plt.title(f'y={target_y}处曲面截线图') plt.legend() plt.grid(alpha=0.3) plt.show()
效果说明
当target_y=114.5时,插值系数t=0,计算结果就是y=114.5边的原始点坐标,和参考效果图完全一致。如果修改target_y为其他有效值(比如800),就能得到对应y值的截线图。如果需要生成多组y值的截线叠加图,只需要在外层加一层target_y的循环,给不同y值的曲线设置不同颜色或透明度即可。
内容的提问来源于stack exchange,提问作者Link_tester
相关产品推荐
相关产品推荐

