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

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:仅保留满足 1.323*(X - 2.5) <= -1.0716*(Y + 1) 的区域(也就是平面2在该位置高度不超过平面1的区域,避免重叠),其余区域的Z值设为NaN
  2. 对平面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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:45:03