混沌分形之填充集

通过分形来生成图像,有一个特点是:不想生成什么样的图像就写出相应的算法,而是生成出来的图像像什么,那算法就是什么。总之,当你在写这个算法时或设置相关参数时,你几乎无法猜测出你要生成的图像是什么样子。而生成图像的时间又比较久,无法实时地调整参数。所以我这使用了填充集的方式,先计算少量的顶点,以显示出图像的大致轮廓。确定好参数后再进行图像生成。所谓填充集,就是随机生成顶点位置,当满足要求时顶点保留,否则剔除。这里将填充集的方式来生成Julia集,曼德勃罗集和牛顿迭代集.

(1)Julia集

// 填充Julia集
// http://www.douban.com/note/230496472/
class JuliaSet2 : public FractalEquation
{
public:
    JuliaSet2()
    {
        m_StartX = 0.0f;
        m_StartY = 0.0f;
        m_StartZ = 0.0f;

        m_ParamA = 0.11f;
        m_ParamB = 0.615f;

        m_nIterateCount = 80;
    }

    void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const
    {
        x = outX = yf_rand_real(-1.0f, 1.0f);
        y = outY = yf_rand_real(-1.0f, 1.0f);

        float lengthSqr;
        float temp;
        int count = 0;
        do
        {
            temp = x * x - y * y + m_ParamA;
            y = 2 * x * y + m_ParamB;
            x = temp;

            lengthSqr = x * x + y * y;
            count++;
        }
        while ((lengthSqr < 4.0f) && (count < m_nIterateCount));

        if (lengthSqr > 4.0f)
        {
            outX = 0.0f;
            outY = 0.0f;
        }

        outZ = z;
    }

    bool IsValidParamA() const {return true;}
    bool IsValidParamB() const {return true;}

private:
    int m_nIterateCount;
};

(2)曼德勃罗集

// 曼德勃罗集
// http://www.cnblogs.com/Ninputer/archive/2009/11/24/1609364.html
class MandelbrotSet : public FractalEquation
{
public:
    MandelbrotSet()
    {
        m_StartX = 0.0f;
        m_StartY = 0.0f;
        m_StartZ = 0.0f;

        m_ParamA = -1.5f;
        m_ParamB = 1.0f;
        m_ParamC = -1.0f;
        m_ParamD = 1.0f;

        m_nIterateCount = 100;
    }

    void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const
    {
        float cr = m_ParamA + (m_ParamB - m_ParamA)*((float)rand()/RAND_MAX);
        float ci = m_ParamC + (m_ParamD - m_ParamC)*((float)rand()/RAND_MAX);

        outX = 0.0f;
        outY = 0.0f;

        float lengthSqr;
        float temp;
        int count = 0;
        do
        {
            temp = outX * outX - outY * outY + cr;
            outY = 2 * outX * outY + ci;
            outX = temp;

            lengthSqr = outX * outX + outY * outY;
            count++;
        }
        while ((lengthSqr < 4.0f) && (count < m_nIterateCount));

        if (lengthSqr < 4.0f)
        {
            outX = cr;
            outY = ci;
        }
        else
        {
            outX = 0.0f;
            outY = 0.0f;
        }

        outZ = z;
    }

    bool IsValidParamA() const {return true;}
    bool IsValidParamB() const {return true;}
    bool IsValidParamC() const {return true;}
    bool IsValidParamD() const {return true;}

private:
    int m_nIterateCount;
};

(3)牛顿迭代集

// 牛顿迭代
// http://www.douban.com/note/230496472/
class NewtonIterate : public FractalEquation
{
public:
    NewtonIterate()
    {
        m_StartX = 0.0f;
        m_StartY = 0.0f;
        m_StartZ = 0.0f;

        m_ParamA = 1.0f;

        m_nIterateCount = 64;
    }

    void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const
    {
        x = outX = yf_rand_real(-m_ParamA, m_ParamA);
        y = outY = yf_rand_real(-m_ParamA, m_ParamA);

        float xx, yy, d, tmp;

        for (int i = 0; i < m_nIterateCount; i++)
        {
            xx = x*x;
            yy = y*y;
            d = 3.0f*((xx - yy)*(xx - yy) + 4.0f*xx*yy);
            if (fabsf(d) < EPSILON)
            {
                d = d > 0.0f ? EPSILON : -EPSILON;
            }
            tmp = x;
            x = 0.666667f*x + (xx - yy)/d;
            y = 0.666667f*y - 2.0f*tmp*y/d;
        }

        if (x < 0.0f)
        {
            outX = 0.0f;
            outY = 0.0f;
        }

        outZ = z;
    }

    bool IsValidParamA() const {return true;}

private:
    int m_nIterateCount;
};

(4)

关于基类FractalEquation的定义见:混沌与分形

再发几幅图像:

——

时间: 2024-10-27 07:55:57

混沌分形之填充集的相关文章

混沌分形之逻辑斯蒂(Logistic)映射系统

前几天,有个同事看到我生成的一幅逻辑斯蒂分岔图像后,问我:“这是咪咪吗?”我回答:“淫者见淫.”好吧,这里将生成几种分岔映射图形,包括逻辑斯蒂映射系统,正弦映射系统和曼德勃罗映射系统.实际上这几种图形算不上分形,只不过它与我写的其他分形对象使用相同的基类,所以也将其列入混沌分形的范畴. 关于基类FractalEquation的定义及相关软件见:混沌与分形 (1)逻辑斯蒂映射系统 // 逻辑斯蒂映射系统 class LogisticMap : public FractalEquation { pu

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

朱利亚集合是一个在复平面上形成分形的点的集合.以法国数学家加斯顿·朱利亚(Gaston Julia)的名字命名.我想任何一个有关分形的资料都不会放过曼德勃罗集和朱利亚集.这里将以点集的方式生成出朱利亚集的图形. 关于基类FractalEquation的定义及相关软件见:混沌与分形 class JuliaSet : public FractalEquation { public: JuliaSet() { m_StartX = 0.0f; m_StartY = 0.0f; m_StartZ = 0

混沌分形之迭代函数系统(IFS)

IFS是分形的重要分支.它是分形图像处理中最富生命力而且最具有广阔应用前景的领域之一.这一工作最早可以追溯到Hutchinson于1981年对自相似集的研究.美国科学家M.F.Barnsley于1985年发展了这一分形构型系统,并命名为迭代函数系统(Iterated Function System,IFS),后来又由Stephen Demko等人将其公式化,并引入到图像合成领域中.IFS将待生成的图像看做是由许多与整体相似的(自相似)或经过一定变换与整体相似的(自仿射)小块拼贴而成.算法: 1.

混沌分形之电子云

      电子云是物理学中的一项概念.电子在原子核外很小的空间内作高速运动,其运动规律跟一般物体不同,它没有明确的轨道.根据量子力学中的测不准原理,我们不可能同时准确地测定出电子在某一时刻所处的位置和运动速度,也不能描画出它的运动轨迹.因此,人们常用一种能够表示电子在一定时间内在核外空间各处出现机会的模型来描述电子在核外的的运动.在这个模型里,某个点附近的密度表示电子在该处出现的机会的大小.密度大的地方,表明电子在核外空间单位体积内出现的机会多:反之,则表明电子出现的机会少.由于这个模型很像在

混沌分形之谢尔宾斯基(Sierpinski)

本文以使用混沌方法生成若干种谢尔宾斯基相关的分形图形. (1)谢尔宾斯基三角形 给三角形的3个顶点,和一个当前点,然后以以下的方式进行迭代处理: a.随机选择三角形的某一个顶点,计算出它与当前点的中点位置: b.将计算出的中点做为当前点,再重新执行操作a 相关代码如下: class SierpinskiTriangle : public FractalEquation { public: SierpinskiTriangle() { m_StartX = 0.0f; m_StartY = 0.0

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

我不记得从什么地方看到的这种分形图形生成方式,再到网上找竟然一时没查到任何相关资料.没关系,总之这种图形也很漂亮多变,并且其算法比较简单.只是我最后生成的图像有点瘆人,密集恐惧症患者慎入. 相关代码如下: class MartinIterate : public FractalEquation { public: MartinIterate() { m_StartX = 1.0f; m_StartY = 1.0f; m_StartZ = 0.0f; m_ParamA = 0.68f; m_Par

混沌与分形

混沌与分形理论的关系密切,混沌中有时包容有分形,而分形中有时又孕育着混沌.分形更注重形态或几何特性,图形的描述.混沌偏重于数理的动力学及动力学与图形结合的多方位的描述和研究.分形则更看中有自相似性的系统.混沌涉及面似乎比分形更广,对所有的有序与无序,有序与有序现象都感兴趣.特别是混沌中的分叉,分支现象与分形关系最密切.分形可以是混沌研究中一种手段或方法.一般认为非线性,随机性,以及耗散性是出现分形结构的必要物理条件. 非线性是指运动方程中含有非线性项(迭代),状态演化(相空间轨迹)发生分支,是混

混沌图像---马丁迭代【密集恐惧症患者慎入】

马丁迭代是我必需要讲的一个方程,因为之前看到一段由它生成图像的代码,我才开始研究混沌生成图像,并写了这个软件:YChaos生成混沌图像.马丁迭代图像的生成过程,如同生物的生长,一层层,一圈圈不停地变大变深变粗.虽然最终生成的图像看上去都差不多,但每一个参数下的图像的生成过程都不一样.最能体现混沌的是,马丁迭代的参数中,只要对任意一项,哪怕是极小的修改也会导致最终生成的数据完全不一样. 似乎网上关于它的资料很少,我只找到这么几句: 受Mandelbrot集产生思想的影响,Martin提出了一对公式

【分享】近4000份数学学习资源免费分享给大家

一直以来喜欢收集数学类的教程资源,于是费了好大劲从万千合集站上扒拉了下来,总结归类了一下,一共有将近4000本电子书.经测试,均可免费下载,可能会弹出小广告,可不必理会之.[仅供学术学习和交流,请无用于商业用途.]另外,如有可能,还请尽量支持正版纸质书.   数学史(54)     数学史.rar 55.6 MB   数学的起源与发展.rar 4.3 MB   费马大定理—一个困惑了世间智者358年的谜.pdf 9.5 MB   通俗数学名著译丛14-无穷之旅:关于无穷大的文化史.pdf 14.