zoukankan      html  css  js  c++  java
  • 数学图形之克莱因瓶(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)]

  • 相关阅读:
    数据结构之c++感悟
    常见linux系统中RPM包的通用命名规则
    scripts
    http
    iscsi
    RHCE认证经典考题
    数据库
    配置空客户端邮件
    配置nfs服务
    Python版本的7大排序
  • 原文地址:https://www.cnblogs.com/WhyEngine/p/3895153.html
Copyright © 2011-2022 走看看