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

基于Matplotlib实现两球体融合可视化的相关问题

问题解答

Matplotlib本身没有内置的3D几何相交/裁剪功能来自动移除两个球体的重叠表面——它的3D绘图基于离散点的表面渲染,不支持复杂的布尔运算。不过你可以通过手动筛选每个球体上的点,只保留位于另一个球体外的部分来实现需求。

具体实现方法

核心思路:对每个球体的表面点,计算该点到另一个球心的距离,只保留距离大于等于球体半径的点(重叠区域的点到另一个球心的距离会小于半径)。由于plot_surface会自动忽略nan值,我们可以把重叠区域的点设为nan来隐藏它们。

修改后的代码如下:

import numpy as np 
import matplotlib.pyplot as plt 

fig = plt.figure()
ax = fig.add_subplot(projection='3d')

r = 10
Init = [0,0,0]
Final = [5,5,5]

# 绘制第一个球体,移除与第二个球重叠的部分
u, v = np.mgrid[0:2 * np.pi:30j, 0:np.pi:20j]
x = Init[0] + r*np.cos(u) * np.sin(v)
y = Init[1] + r*np.sin(u) * np.sin(v)
z = Init[2] + r*np.cos(v)

# 计算每个点到第二个球心的距离,生成掩码
dist_to_final = np.sqrt((x - Final[0])**2 + (y - Final[1])**2 + (z - Final[2])**2)
mask = dist_to_final >= r
# 将重叠区域的点设为nan
x[~mask] = np.nan
y[~mask] = np.nan
z[~mask] = np.nan

ax.plot_surface(x, y, z, color='r', alpha=0.5, linewidth=0)

# 绘制第二个球体,移除与第一个球重叠的部分
u, v = np.mgrid[0:2 * np.pi:30j, 0:np.pi:20j]
x = Final[0] + r*np.cos(u) * np.sin(v)
y = Final[1] + r*np.sin(u) * np.sin(v)
z = Final[2] + r*np.cos(v)

dist_to_init = np.sqrt((x - Init[0])**2 + (y - Init[1])**2 + (z - Init[2])**2)
mask = dist_to_init >= r
x[~mask] = np.nan
y[~mask] = np.nan
z[~mask] = np.nan

ax.plot_surface(x, y, z, color='r', alpha=0.5, linewidth=0)

plt.show()

注意事项

  • 裁剪后的边缘平滑度取决于表面点的密度,点越多边缘越自然;点太少的话会出现明显锯齿。
  • 如果需要更复杂的3D模型布尔运算,Matplotlib不是最优选择,建议用专业3D可视化库(如Mayavi),但针对简单球体重叠裁剪,上述方法完全够用。

内容的提问来源于stack exchange,提问作者Batman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:22:37