论如何画一个标准的甜甜圈

​ 首先,要画一个封闭圆环状曲面,用参数方程是及其方便的。

​ 想象甜甜圈的样子,以O为原点建立空间直角坐标系。先在xy平面上画一个半径为R的圆,在圆上有一动点P,再以P为圆心画另一个半径为r的圆垂直于xy平面,使\overrightarrow{\rm OP}恰好也在这个圆所在的平面上。随着圆P的运动,封闭圆环状曲面就形成了。

​ 现在量化这个过程,设圆P上一点Q。我们要确定\overrightarrow{\rm OQ},有\overrightarrow{\rm OQ}=\overrightarrow{\rm OP} + \overrightarrow{\rm PQ}

​ 很容易确定\overrightarrow{\rm OP}=(R\cos t,R\sin t,0),其中0 \leq t \leq 2 \pi​

​ 对于\overrightarrow{\rm PQ},分解成z方向上投影\overrightarrow{\rm Q’Q}xy平面上的投影\overrightarrow{\rm PQ’}。显然\overrightarrow{\rm QQ’}=(0,0,\sin u)

​ 而\overrightarrow{\rm PQ’}模为\cos u,与\overrightarrow{\rm OP}共线,即\overrightarrow{\rm PQ’}=(r \cos (u) \cos (t),r \cos(u)\sin(t),0),其中0 \leq u \leq 2 \pi

​ 至此,\overrightarrow{\rm OQ}​就确定了。

​ 注意到u,v​都是参量,所以有

\vec{f}(u,t)=\left[\begin{array}{c}{R\cos (t)+r\cos (u) \cos (t)} \\ {R \sin (t)+r\cos (u) \sin (t)} \\ {\sin (u)}\end{array}\right],0 \leq u \leq 2 \pi ,0 \leq t \leq 2 \pi

现在检验一下结果,用python的matplotlib画一下:)

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np

r1=1
r2=3

t=s=np.linspace(0,2*np.pi,100)
t,s=np.meshgrid(t,s)

x=r1*np.cos(t)*np.cos(s)+r2*np.cos(t)
y=r1*np.sin(t)*np.cos(s)+r2*np.sin(t)
z=np.sin(s)

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_surface(x,y,z,cmap=cm.coolwarm)

plt.show()

看上去很好吃的样子

弄成空心的:

...
ax.plot_wireframe(x,y,z)
# ax.get_proj = lambda: np.dot(Axes3D.get_proj(ax), np.diag([kx, ky, kz, 1]))
...

上面注释掉的行是调坐标轴比例用的

很好看对吧~

关于 “论如何画一个标准的甜甜圈” 的 2 个意见

发表评论

电子邮件地址不会被公开。 必填项已用*标注