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

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

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

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

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

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

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

egin{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}\
&quadquadquadquad -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}\
&(0le u < pi,0le v < 2pi)
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

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

还有一个较简单的

egin{align}
&x(u,v)=cos u(cosfrac{u}{2}(sqrt{2}+cos v)+sinfrac{u}{2}sin vcos v)\
&y(u,v)=sin u(cosfrac{u}{2}(sqrt{2}+cos v)+sinfrac{u}{2}sin vcos v)\
&z(u,v)=-sinfrac{u}{2}(sqrt{2}+cos v)+cosfrac{u}{2}sin vcos 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)]

原文地址:https://www.cnblogs.com/WhyEngine/p/3895153.html