zoukankan      html  css  js  c++  java
  • 分形之科赫(Koch)雪花

          科赫曲线是一种分形。其形态似雪花,又称科赫雪花、雪花曲线.瑞典人科赫于1904年提出了著名的“雪花”曲线,这种曲线的作法是,从一个正三角形开始,把每条边分成三等份,然后以各边的中间长度为底边。分别向外作正三角形,再把“底边”线段抹掉,这样就得到一个六角形,它共有12条边。再把每条边三等份,以各中间部分的长度为底边,向外作正三角形后,抹掉底边线段。反复进行这一过程,就会得到一个“雪花”样子的曲线。这曲线叫做科赫曲线或雪花曲线。

          给定线段AB,科赫曲线可以由以下步骤生成:
          (1)将线段分成三等份(AC,CD,DB)
          (2)以CD为底,向外(内外随意)画一个等边三角形DMC
          (3)将线段CD移去
          (4)分别对AC,CM,MD,DB重复1~3。
          反复进行这一作图过程,得到的曲线越来越精细。

      科赫曲线有着极不寻常的特性,不但它的周长为无限大,而且曲线上任两点之间的距离也是无限大。该曲线长度无限,却包围着有限的面积。很神奇的一个曲线,他说明了一个悖论:“无限长度包围着有限面积。”

          程序中实现了0~8级的科赫雪花分形.程序设计时,将这9级曲线的顶点数据全部放置在一个内存中.并使用如下结构体进行设置:

        struct SnowLevel
        {
            Yuint vertexStart;
            Yuint verticesCount;
        };
        SnowLevel m_snowLevels[SNOW_LEVELS_COUNT];
        Yuint m_currentLevel;

          分形图形的顶点生成算法代码如下:

    static void Zhe(const Vector3& vStart, const Vector3& vEnd, Vector3* pVertices)
    {
        Vector3 vSub = vEnd - vStart;
    
        pVertices[0] = vStart;
        pVertices[1] = vStart + vSub/3;
        pVertices[3] = vStart + vSub*2/3;
        pVertices[4] = vEnd;
    
        Yreal alfa = atan2f(vSub.y, vSub.x);
        alfa += YD_REAL_PI/3;
    
        Yreal l = D3DXVec3Length(&vSub)/3;
        pVertices[2].x = pVertices[1].x + cosf(alfa)*l;
        pVertices[2].y = pVertices[1].y + sinf(alfa)*l;
        pVertices[2].z = 0.0f;
    }
    
    void        CFractalSnowEntity::Fractal(Vector3* pVertices)
    {
        pVertices[0].x = 0.0f;
        pVertices[0].y = YD_SNOW_RADIUS;
        pVertices[0].z = 0.0f;
    
        pVertices[1].x = YD_SNOW_RADIUS*sinf(YD_REAL_PI/3);
        pVertices[1].y = -YD_SNOW_RADIUS*sinf(YD_REAL_PI/6);
        pVertices[1].z = 0.0f;
    
        pVertices[2].x = -pVertices[1].x;
        pVertices[2].y = pVertices[1].y;
        pVertices[2].z = 0.0f;
    
        for (Yuint i = 1; i < SNOW_LEVELS_COUNT; i++)
        {
            const Vector3* pSrc = pVertices + m_snowLevels[i - 1].vertexStart;
            Vector3* pDest = pVertices + m_snowLevels[i].vertexStart;
    
            Yuint c = m_snowLevels[i - 1].verticesCount;
    
            for (Yuint j = 0; j < c; j++)
            {
                Zhe(pSrc[j], pSrc[(j + 1)%c], pDest);
                pDest += 4;
            }
        }
    }

    下载地址:http://files.cnblogs.com/WhyEngine/FractalSnow.7z

    科赫雪花第0级

    科赫雪花第1级

    科赫雪花第2级

    科赫雪花第3级

    科赫雪花第4级

    科赫雪花第5级

    科赫雪花第6级

    科赫雪花第7级

    科赫雪花第8级

    软件使用说明
    键盘0~8,分别设置第0级到第8级分形.
    这是个3D程序,鼠标右键的拖动可以改变视角.
    键盘X用于恢复为默认视角.
    键盘F11用于全屏切换.

  • 相关阅读:
    转:PHP环境搭建
    证件号码
    3、SourceTree通过PUTTY连接GitLab
    2、gitlab 新建项目
    java基础31 List集合下的Vector集合
    java基础30 List集合下的LinkedList集合
    java基础29 迭代器 listIterator() 及各种遍历集合的方法
    java基础28 单例集合Collection下的List和Set集合
    java基础27 单例集合Collection及其常用方法
    错误/异常:The project cannot be built until build path errors are resolved 和 Unbound classpath container: 'JRE System Library [JavaSE-1.7]' in project 'MyJavaCode';的解决方法
  • 原文地址:https://www.cnblogs.com/WhyEngine/p/3981674.html
Copyright © 2011-2022 走看看