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

IFS(迭代函数系统)是分形图像处理的重要分支,由M.F.Barnsley在1985年提出,用于生成自相似或自仿射的图像。算法通过设定起始点和迭代步数,结合仿射变换来创建复杂图案,如谢尔宾斯基三角形、皇冠、芦苇、万花筒、树和大脑等。
摘要由CSDN通过智能技术生成

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

     X1=(a * x0*cosf(c/180)) - (b * y0*sinf(d/180)) + e
     Y1=(a * x0*sinf(c/180)) + (b * y0*cosf(d/180)) + f
3.以W作用点(x0,y0),得到新坐标(x1,y1)。
4.令x0=x1,y0=y1。
5.在屏幕上打出(x0,y0)。
6.重返第2步,进行下一次迭代,直到迭代次数大于总步数为止。

(1)三角形

class IFSTriangle : public FractalEquation { public: IFSTriangle() { m_StartX = 0.0f; m_StartY = 0.0f; m_StartZ = 0.0f; m_ParamA = 0.0f; m_ParamB = 0.5f; //'IFS码赋值
        m[0][0] = 0.5f; m[0][1] = 0; m[0][2] = 0;  m[0][3] = 0.5f;  m[0][4] = 0;     m[0][5] = 0;    m[0][6] = 0.333f; m[1][0] = 0.5f; m[1][1] = 0; m[1][2] = 0;  m[1][3] = 0.5f;  m[1][4] = 0.5f;  m[1][5] = 0;    m[1][6] = 0.333f; m[2][0] = 0.5f; m[2][1] = 0; m[2][2] = 0;  m[2][3] = 0.5f;  m[2][4] = 0.25f; m[2][5] = 0.5f; m[2][6] = 0.334f; } void IterateValue(float x, float y, float z, float& outX, float& outY, float& outZ) const { float a, b, c, d, e, f;    //'仿射变幻中的系数

        float R = (float)rand()/RAND_MAX; if (R <= m[0][6]) { a = m[0][0]; b = m[0][1]; c = m[0][2]; d = m[0][3]; e = m[0][4]; f = m[0][5]; } else if (R <= m[0][6] + m[1][6]) { a = m[1][0]; b = m[1][1]; c = m[1][2]; d = m[1][3]; e = m[1][4]; f = m[1][5]; } else { a = m[2][0]; b = m[2][1]; c = m[2][2]; d = m[2][3]; e = m[2][4]; f = m[2][5]; } outX = (a * x) + (b * y) + e*FRACTAL_RADIUS; outY = (c * x) + (d * y) + f*FRACTAL_RADIUS; outZ = z; } bool IsValidParamA() const {
     return true;} bool IsValidParamB() const {
     return true;} void SetParamA(float v) { m_ParamA = v; m[2][1] = v; } void SetParamB(float v) { m_ParamB = v; m[2][0] = v; m[0][3] = v; } private: float m[3][7];      // '存放IFS码
};

这里生成的是谢尔宾斯基三角形,但可以通过参数设置对其变形

(2)皇冠

class IFSCrown : public FractalEquation { public: IFSCrown() { m_StartX = 0.0f; m_StartY = 0.0f; m_StartZ = 0.0f; m_ParamA = 2.0f; //'IFS码赋值
        m[0][0] = 0.5f;   m[0][1] = 0.5f;   m[0][2] = 0;  m[0][3] = 0;  m[0][4] = 0;    m[0][5] = 0;   m[0][6] = 0.2f; m[1][0] = 0.5f;   m[1][1] = 0.5f;   m[1][2] = 0;  m[1][3] = 0;  m[1][
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值