数学图形之克莱因瓶(klein bottle)

克莱因瓶是一种内外两面在同一个曲面上的图形.

在数学领域中,克莱因瓶(德语:Kleinsche Flasche)是指一种无定向性的平面,比如二维平面,就没有“内部”和“外部”之分。克莱因瓶最初的概念提出是由德国数学家菲利克斯·克莱因提出的。克莱因瓶和我上一篇讲的莫比乌斯带非常相像。一个是内外两面是在同一个曲面上,另一个是里外两面在同一个曲面上.

克莱因瓶的形状是,一个瓶子底部有一个洞,现在延长瓶子的颈部,并且扭曲地进入瓶子内部,然后和底部的洞相连接。

下面将展示几种莫比乌斯带的生成算法和切图,使用自己定义语法的脚本代码生成数学图形.相关软件参见:数学图形可视化工具,该软件免费开源.

 

以下是从维基上查到的公式

克莱因瓶的参数十分复杂:

\begin{align}
&x(u,v) = -\frac{2}{15} \cos u (3 \cos{v}-30 \sin{u}+90 \cos^4{u} \sin{u} -60 \cos^6{u} \sin{u}+5 \cos{u} \cos{v} \sin{u}) \\
&y(u,v) = -\frac{1}{15} \sin u (3 \cos{v}-3 \cos^2{u} \cos{v}-48 \cos^4{u} \cos{v}+48 \cos^6{u} \cos{v}-60 \sin{u}+5 \cos{u} \cos{v} \sin{u}\\
&\quad\quad\quad\quad -5 \cos^3{u} \cos{v} \sin{u}-80 \cos^5{u} \cos{v} \sin{u}+80 \cos^7{u} \cos{v} \sin{u}) \\
&z(u,v) = \frac{2}{15} (3+5 \cos{u} \sin{u}) \sin{v}\\
&(0\le u < \pi,0\le v < 2\pi)
\end{align}

写成我的脚本代码为:

vertices = D1:80 D2:160
u = from 0 to PI D1
v = from 0 to (2*PI) D2
a = sin(u)
b = cos(u)
c = sin(v)
d = cos(v)
e = 3*d - 3*b*b*d - 48*pow(b, 4)*d + 48*pow(b, 6)*d - 60*a + 5*b*d*a - 5*pow(b, 3)*d*a - 80*pow(b, 5)*d*a + 80*pow(b, 7)*d*a
x = -2/15*b*(3*d - 30*a + 90*pow(b, 4)*a - 60*pow(b, 6)*a + 5*b*d*a)
y = -1/10*a*e
z = 2/15*(3 + 5*b*a)*c

u = u*5
v = v*2.5

公式好复杂,我竟然写对了:

 

还有一个较简单的

\begin{align}
&x(u,v)=\cos u(cos\frac{u}{2}(\sqrt{2}+\cos v)+\sin\frac{u}{2}\sin v\cos v)\\
&y(u,v)=\sin u(cos\frac{u}{2}(\sqrt{2}+\cos v)+\sin\frac{u}{2}\sin v\cos v)\\
&z(u,v)=-\sin\frac{u}{2}(\sqrt{2}+\cos v)+\cos\frac{u}{2}\sin v\cos v
\end{align}

写成我的脚本代码为:

vertices = D1:160 D2:160
u = from 0 to (4*PI) D1
v = from 0 to (2*PI) D2

a = sin(u)
b = cos(u)

c = sin(v)
d = cos(v)

e = sin(u/2)
f = cos(u/2)

x = b*(f*(sqrt(2) + d) + e*c*d)
z = a*(f*(sqrt(2) + d) + e*c*d)
y = -e*(sqrt(2) + d) + f*c*d

可惜这似乎是错的.生成的图形不是克莱因瓶.

此外,我还从别的地方找到关于克莱因瓶的公式.这两个公式生成的图形差不多,也不像克莱因瓶,而是一个8字形的曲线绕圈而成的曲面.

klein_bottle

#http://xahlee.info/surface/klein_bottle/klein_bottle.html

vertices = D1:100 D2:100

u = from 0 to (PI*2) D1
v = from 0 to (PI*2) D2

a = 3

x = (a+cos[v/2]*sin[u]-sin[v/2]*sin[2*u])*cos[v]
z = (a+cos[v/2]*sin[u]-sin[v/2]*sin[2*u])*sin[v]
y = sin[v/2]*sin[u]+cos[v/2]*sin[2*u]

klein

#http://www.mathcurve.com/surfaces/klein/klein.shtml
vertices = D1:100 D2:100
u = from 0 to (PI*2) D1
v = from 0 to (PI*2) D2
a = rand2(1, 10)
b = rand2(1, 10)
x = [a + b*(cos(u/2)*sin(v) - sin(u/2)*sin(2*v))]*cos(u)
z = [a + b*(cos(u/2)*sin(v) - sin(u/2)*sin(2*v))]*sin(u)
y = b*[sin(u/2)*sin(v) + cos(u/2)*sin(2*v)]

 

posted on 2014-08-06 16:48  叶飞影  阅读(6810)  评论(2编辑  收藏  举报