Python 3D绘图中两个相交曲面的裁剪及可视化实现问题
你可以通过**将需要裁剪的区域对应的Z值设为np.nan**实现效果,matplotlib的plot_surface会自动跳过值为NaN的网格点,不会渲染该区域,同时不影响colormap对剩余有效区域的颜色映射。
首先推导两个平面的交线判断条件:
两个平面的方程分别为:
- 平面1:
Z1 = -1.0716 * (Y + 1) - 平面2:
Z2 = 1.323 * (X - 2.5)
交线满足Z1 = Z2,整理后得到交线的XY坐标满足的关系:1.323*(X - 2.5) + 1.0716*(Y + 1) = 0
接下来分别对两个平面的网格做裁剪:
- 对平面1:仅保留满足
1.323*(X - 2.5) <= -1.0716*(Y + 1)的区域(也就是平面2在该位置高度不超过平面1的区域,避免重叠),其余区域的Z值设为NaN - 对平面2:仅保留满足
1.323*(X - 2.5) >= -1.0716*(Y + 1)的区域,其余区域的Z值设为NaN
修改后的完整代码如下:
import numpy as np import matplotlib.pyplot as plt from matplotlib import cm fig = plt.figure(figsize=(8,4)) ax = fig.add_subplot(projection='3d') ax.set_xlabel('x') ax.set_ylabel('y') ax.set_zlabel('z') # 绘制第一个平面并裁剪 x = np.linspace(-2.5,3.104,1000) y = np.linspace(-0.746,0,1000)-1 X, Y = np.meshgrid(x, y) Z = -1.0716*(Y+1) # 裁剪条件:保留平面2高度小于等于当前平面的区域 mask = 1.323*(X - 2.5) > Z Z[mask] = np.nan solid = ax.plot_surface(X,Y,Z,cmap=cm.coolwarm,linewidth=0, antialiased=True) # 绘制第二个平面并裁剪 y = np.linspace(-1.746,1,1000) x = np.linspace(0,0.604,1000) + 2.5 X, Y = np.meshgrid(x, y) Z = 1.323*(X-2.5) # 裁剪条件:保留平面1高度小于等于当前平面的区域 mask = -1.0716*(Y + 1) > Z Z[mask] = np.nan solid = ax.plot_surface(X,Y,Z,cmap=cm.coolwarm,linewidth=0, antialiased=True) plt.show()
如果交线的保留方向和你预期的不符,只需要把mask判断里的>改成<即可,你也可以替换成自己计算的交线坐标对应的判断条件,逻辑完全通用。
内容的提问来源于stack exchange,提问作者Mateus Forcelini
相关产品推荐
相关产品推荐

