混沌與分形


      混沌與分形理論的關系密切,混沌中有時包容有分形,而分形中有時又孕育着混沌。分形更注重形態或幾何特性,圖形的描述。混沌偏重於數理的動力學及動力學與圖形結合的多方位的描述和研究。分形則更看中有自相似性的系統。混沌涉及面似乎比分形更廣,對所有的有序與無序,有序與有序現象都感興趣。特別是混沌中的分叉,分支現象與分形關系最密切。分形可以是混沌研究中一種手段或方法。一般認為非線性,隨機性,以及耗散性是出現分形結構的必要物理條件。 非線性是指運動方程中含有非線性項(迭代),狀態演化(相空間軌跡)發生分支,是混沌的根本原因。

      太理論的東西這里就不多說了,我將開辟新的一個版塊,來講下我在研究混沌分形時,實現的一些DEMO。在我之前的博客中,已有兩個與混沌相關的版塊混沌點集混沌曲線。與前兩個類似,這里也主要以DEMO的方式直觀的介紹一些由混沌所生成的分形圖形。DEMO中生成的圖形都是以點集的方式存在,具體地講就是:我將通過某種數學方程和參數設置,以得到65535個頂點坐標的位置。這65535個頂點的集合構成最終的分形圖形。混沌是無序的,而分形又是有序的,在我的DEMO中可以看到如何將隨機的數據生成有規律的圖形。

(1)分形方程基類

首先介紹下我寫的分形方程基類,之后所有的圖形生成類都是它的派生類。

#define SET_GET_FLOAT_PROPERTY(name) \
    virtual void Set##name##(float v)\ {\ m_##name## = v;\ }\ float Get##name##() const\ {\ return m_##name##;\ } #define PI                  3.14159265f
#define FRACTAL_RADIUS      5.0f
#define EPSILON             0.0001f

// --------------------------------------------------------------------------------------

class FractalEquation { public: FractalEquation() { m_StartX = 0.0f; m_StartY = 0.0f; m_StartZ = 0.0f; m_ParamA = 0.0f; m_ParamB = 0.0f; m_ParamC = 0.0f; m_ParamD = 0.0f; m_ParamE = 0.0f; } // 求迭代值
    virtual void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const = NULL; // 計算點集的Y軸與X軸坐標
    virtual void CalculatePoints(void* curveVerticesPtr, unsigned int stride, unsigned int count) { char* xPtr = (char*)curveVerticesPtr; char* yPtr = (char*)curveVerticesPtr + sizeof(float); char* zPtr = (char*)curveVerticesPtr + 2*sizeof(float); float x, y, z; float nx, ny, nz; x = m_StartX; y = m_StartY; z = m_StartZ; for (unsigned int i = 0; i < count; i++) { *(float*)xPtr = x; *(float*)yPtr = y; *(float*)zPtr = z; IterateValue(x, y, z, nx, ny, nz); x = nx; y = ny; z = nz; xPtr += stride; yPtr += stride; zPtr += stride; } } SET_GET_FLOAT_PROPERTY(StartX); SET_GET_FLOAT_PROPERTY(StartY); SET_GET_FLOAT_PROPERTY(StartZ); SET_GET_FLOAT_PROPERTY(ParamA); SET_GET_FLOAT_PROPERTY(ParamB); SET_GET_FLOAT_PROPERTY(ParamC); SET_GET_FLOAT_PROPERTY(ParamD); SET_GET_FLOAT_PROPERTY(ParamE); virtual bool IsValidParamA() const {return false;} virtual bool IsValidParamB() const {return false;} virtual bool IsValidParamC() const {return false;} virtual bool IsValidParamD() const {return false;} virtual bool IsValidParamE() const {return false;} virtual bool Is3D() const {return false;} protected: float m_StartX; float m_StartY; float m_StartZ; float m_ParamA; float m_ParamB; float m_ParamC; float m_ParamD; float m_ParamE; };

其子類中需要實現如下函數:

    // 求迭代值
    virtual void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const = NULL;

其思想與混沌曲線中的相似,通過當前點位置生成下一個點的位置。外部需要調用CalculatePoints函數以生成所有頂點的位置坐標。

父類中有8個成員變量,這個可以在DEMO的UI界面上看到:

    float m_StartX;
    float m_StartY;
    float m_StartZ;

    float m_ParamA;
    float m_ParamB;
    float m_ParamC;
    float m_ParamD;
    float m_ParamE;

用於設置與方程相關的參數。

(2)DEMO介紹

ChaosFractal.exe和ChaosFractalFS.exe都可以啟動程序。

DEMO啟動后,窗體右上角的選擇列表用於選擇不同的分形圖形。

窗體下方有兩個滑動條,一個用於控制顯示頂點的范圍:

另一個用於顯示指點頂點的位置:

窗體的左上角是顯示當前狀態的文字信息和設置相關參數的控件。

軟件下載:http://files.cnblogs.com/WhyEngine/ChaosFractal.zip

(3)章節目錄

混沌分形之謝爾賓斯基(Sierpinski)

混沌分形之朱利亞集(JuliaSet)

混沌分形之填充集

混沌分形之迭代函數系統(IFS)

混沌分形之邏輯斯蒂(Logistic)映射系統

混沌分形之電子雲

混沌分形之馬丁(Martin)迭代

 


免責聲明!

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



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