随笔 - 373  文章 - 1  评论 - 771  阅读 - 137万

数学图形之克莱因瓶(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   叶飞影  阅读(6873)  评论(2编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示