如何用笛卡尔坐标绘制完整球体?np.sqrt致半球问题
如何用笛卡尔坐标绘制完整球体(解决np.sqrt仅返回正值的问题)
我懂你说的痛点!用np.sqrt默认只能拿到正的z值,所以画出来自然是上半球,而且当x²+y²超过1的时候,根号里的数变成负数,还会弹出那个烦人的RuntimeWarning: invalid value encountered in sqrt警告。
既然你只关注基于x²+y²+z²=1的笛卡尔坐标实现方案,那我们可以通过绘制上下两个半球来解决这个问题,同时还能消除警告,具体步骤如下:
- 先计算z的平方项,把其中小于0的部分替换为
NaN(这样np.sqrt就不会处理无效的负数,警告也就消失了) - 分别计算上半球的正z值和下半球的负z值
- 调用两次
plot_surface分别绘制上下半球,组合起来就是完整的球体
下面是修改后的完整代码:
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np fig = plt.figure(figsize=(20, 10)) ax = fig.add_subplot(1,2,1, projection='3d') xs = np.linspace(-1, 1, 100) ys = np.linspace(-1, 1, 100) xs, ys = np.meshgrid(xs, ys) # 计算z的平方项,将小于0的部分设为NaN,避免无效计算 z_squared = 1 - xs**2 - ys**2 z_squared[z_squared < 0] = np.nan # 分别计算上下半球的z值 zs_upper = np.sqrt(z_squared) zs_lower = -np.sqrt(z_squared) # 绘制上半球和下半球 ax.plot_surface(xs, ys, zs_upper, lw=0, antialiased=True) ax.plot_surface(xs, ys, zs_lower, lw=0, antialiased=True) plt.show()
这样修改后,你就能得到完整的单位球体,而且不会再出现那个RuntimeWarning,完全符合你要求的基于笛卡尔坐标方程的实现方式。
内容的提问来源于stack exchange,提问作者runo
相关产品推荐
相关产品推荐

