分形之科赫(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用於全屏切換.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM