圆的绘制
首先一个球体可以看作无数个小圆组合而成的,那么,我们是否能够使用这个想法将其绘制出来呢?答案是肯定的,同二维图的绘制不同的是,三维图的绘制较为复杂一点,需要采用网格的思想才能够将其绘制出来,在二维图中我们可以轻松的绘制出一个圆,如下图,使用圆的参数方程采用theta函数作为极坐标的参数绘制圆,代码如下:
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111)#一个画板一张图
r=1#直径为1
ax.set(xlim=[-r, r], ylim=[-r, r], title='circle',ylabel='Y-Axis', xlabel='X-Axis')
theta = np.arange(0, 2*np.pi, 0.01)#极坐标参数 取样间隔0.01
x = np.cos(theta)#坐标x
y = np.sin(theta)#坐标y
ax.plot(x,y)#绘制二维图
plt.show()#图片展示
结果:
球体的绘制
参考二维圆的画法我们可以采用柱面坐标系的方法,在z轴上用依次绘制不同半径的圆来形成一个球,在这个过程中我们要用到矩阵外积的思想,将圆的余弦值或者正弦值与半径进行外积,形成一个二维矩阵,矩阵的第二维度中的每个向量储存每个小圆的信息。
矩阵外积( matC = numpy.outer(matA,matB) ):在求解矩阵matA,matB的外积的过程中,matA和matB先被变成一维向量vectorA,vectorB,然后再对两个向量进行内积np.dot(vectorA,vectorB)得到分别于vectorB每个元素相乘得到的二维矩阵matC。
在绘图的过程中,plot_surface(x,y,z)中要求的x,y,z矩阵必须是二维矩阵,也即是x,y,z的在z轴上的网格信息(用二维矩阵存储)。
代码如下:
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()#创建画板
ax = fig.add_subplot(111, projection='3d')#分画板选项
o = np.array([0,0,0]) #圆心坐标
R = 1 #圆的直径为1
h = np.arange(-R,R,0.0001) # 把高度按0.0001进行采样
r = np.sqrt(R-h**2)#每个小圆对应的半径r
theta = np.arange(0, 2*np.pi, 0.01)#取样间隔0.01
x = np.outer(np.cos(theta),r)+o[0]#和每个小圆的半径进行外积得到每个小圆的x坐标,每个高度对应一个小圆的x
y = np.outer(np.sin(theta),r)+o[1]#和每个小圆的半径进行外积得到每个小圆的y坐标,每个高度对应一个小圆的y
z = np.outer(np.ones(len(theta)),h)+o[2]#和高度进行外积得到每个小圆的z坐标
ax.plot_surface(x, y, z, cmap=plt.get_cmap('rainbow'))#绘制球体
plt.show()#展示画板
结果