分形造型的常用模型,C构造简单的IFS图形
分形造型的常用模型
- 随机插值模型
- 迭代函数系统(IFS)
- L系统
随机插值模型
该模型是1982年由Alain Fournier, DonFussell和Loren Carpenter提出的,它能有效地模拟海岸线和山等自然景象。
为了克服传统模型技术中依赖观察距离的局限性,随机插值模型不是事先决定各种图素和尺度,而是用一个随机过程的采样路径作为构造模型的手段。例如,构造二维海岸线的模型可以
- 选择控制大致形状的若干初始点;
- 在相邻两点构成的线段上取其中点,并沿垂直连线方向随机偏移一个距离;
- 再将偏移后的点与该线段两端点分别连成两条线段。
这样下去可得到一条曲折的有无穷细节回归的海岸线,其曲折程度由随机偏移量控制。它也决定了分数维的大小:
图一
在三维情况下可通过类似过程构造山的模型,一般通过多边形(简单的如三角形)细分的方法。可以在一个三角形的3条边上随机各取一点,并沿垂直方向偏移一定距离后得到新的3个点,再连接成4个三角形,如此继续,即可形成褶皱的山峰。山的褶皱程度由分数维控制:
图二
下面以画出Sierpinski三角形举例
步骤
a.给三角形的3个顶点,和一个当前点;
b.随机选择三角形的某一个顶点,计算出它与当前点的中点位置;
c.将计算出的中点做为当前点,再重新执行操作a。
#include<stdio.h>
#include<time.h>
#include<math.h>
#include<graphics.h>#define PI 3.14159265int max_iter=10000;//迭代次数 double point[3][2]={0,100*tan(PI/3),100,0,200,100*tan(PI/3)
};//三角形三个顶点坐标 void Sierpinski(double x0,double y0,int k){if(k>max_iter) return;int rnum=rand()%3;//设置概率 if(rnum==0){x0=(x0+point[0][0])*0.5;y0=(y0+point[0][1])*0.5;}else if(rnum==1){x0=(x0+point[1][0])*0.5;y0=(y0+point[1][1])*0.5;} else{x0=(x0+point[2][0])*0.5;y0=(y0+point[2][1])*0.5;}k++;putpixel(x0,y0,YELLOW);Sierpinski(x0,y0,k);
}
int main(){initgraph(1000,1000);double x0=100,y0=0;//给一个当前点 x0,y0 Sierpinski(x0,y0,0);getch();closegraph();return 0;
}
运行:
迭代函数系统(IFS)
概念:
迭代函数系统是从一个坐标系到另一个坐标系的映射系统。迭代函数系统是以下述方式工作的:取空间中任一点Z0Z_0Z0,以PiP_iPi 概率选取变换MiM_iMi,作变换ZiZ_iZi=MiM_iMi(Z0Z_0Z0),再以PiP_iPi的概率选取变换MiM_iMi,对Z1Z_1Z1做变换Z2Z_2Z2=MiM_iMi(Z1Z_1Z1),以此下去,得到一个无数点集。
IFS 的压缩映射 wiw_iwi 的参数设计 :
由分形图的相似结构, 每一个压缩映射 wiw_iwi是 由平移、 旋转和比例 3 种变换以及它们的复合变换构成的仿射变换, 二维形式为 :
三种变换是:
其中参数 aia_iai , bib_ibi , cic_ici , did_idi 由旋转 、 比例变换所决定的实数 ;eie_iei, fif_ifi 由平移变换所决定的实数 。三维形是由相应的三维空间几何变换复合而成。
IFS 吸引子自然景观的模拟总是在一个矩形区域内进行 , 取度量空间 ([ 0 , 1] × [ 0 , 1] , d), 由于wiw_iwi 是压缩变换, wiw_iwi ([ 0 , 1] × [ 0 , 1] ) [ 0 , 1] × [ 0 , 1] 。因此, 参数 aia_iai , bib_ibi , cic_ici , eie_iei, fif_ifi的取值范围在 [ -1 , 1] ;eie_iei 的取值影响植物x 方向的偏离程度,fif_ifi,的取值影响植物在竖直y方向的生长程度 , 一般取值为正。
IFS 中概率 p1 , … , pn 的参数设计:
p1 , p2 , …, pn 的大小分配并不影响最终吸引子, 也就是绘制的图形完全由 wiw_iwi (i =1 , 2 , …, n)确 定 , 与 p1 , p2 , … , pn 无关 , p1 , p2 , …, pn 只是为计算机编程绘图提供了极大的方便 , p1 , p2 , …, pn 的大小分配只影响绘图的速度, 即迭代次数。
IFSP码举例:
Sierpinski 三角形的IFS代码:
w | a | b | c | d | e | f | p |
---|---|---|---|---|---|---|---|
1 | 0.5 | 0 | 0 | 0.5 | 0 | 0 | 0.33 |
2 | 0.5 | 0 | 0 | 0.5 | 0.5 | 0 | 0.33 |
3 | 0.5 | 0 | 0 | 0.5 | 0.25 | 0.5 | 0.34 |
《分形图的 IFS 码设计》这篇文章中包含IFS 参数设计的详细介绍,可参阅【直接下载】
https://download.csdn.net/download/qq_43606914/12446875
下面使用IFS画出蕨类植物
#include<stdio.h>
#include<time.h>
#include<graphics.h>
int Iter=10000;double a[4][7]={0, 0, 0, 0.170, 0, 0, 0.01 ,0.155,-0.235,0.196,0.186,0,0.9,0.07,-0.155,0.235,0.196,0.186,0,0.4,0.07,0.850,0.025,-0.025,0.850,0,0.9,0.85
};void IFS_Tree(double x0,double y0,int k){if(k>Iter) return;int tmp=rand()%100;if(tmp<=1){x0=a[0][0]*x0+a[0][1]*y0+a[0][4];y0=a[0][2]*x0+a[0][3]*y0+a[0][5];}else if(tmp<=8){x0=a[1][0]*x0+a[1][1]*y0+a[1][4];y0=a[1][2]*x0+a[1][3]*y0+a[1][5];} else if(tmp<=15){x0=a[2][0]*x0+a[2][1]*y0+a[2][4];y0=a[2][2]*x0+a[2][3]*y0+a[2][5];}else{x0=a[3][0]*x0+a[3][1]*y0+a[3][4];y0=a[3][2]*x0+a[3][3]*y0+a[3][5];}putpixel(x0*100+300,600-y0*100,WHITE);k++;IFS_Tree(x0,y0,k);
}
int main(){initgraph(1000,1000);srand((unsigned)time(NULL));double x0,y0=0; x0 = rand()%200+1;y0 = rand()%200+1;IFS_Tree(x0,y0,0);getch();closegraph();return 0;
}
运行:
L系统
L系统(short for Lindenmayer systems)是比较新的制作分形的方法。这项技术是Aristrid Lindenmayer在1968提出来的,最早是用来研究植物生长的生物模型。原理即是用字符串来描述一棵树,一朵花,甚至雪花等等。
L-system 包含三个部分:
- Alphabet: L系统的字母由可以包含的有效字符组成。例如,字母是“
ABC”,那么L系统中的任何有效字符串只能包含这三个字符。 - Axiom:描述系统初始状态的句子(由字母中的字符组成)。
- Rule: L系统的规则被应用于Axiom,然后被递归地应用,一遍又一遍地产生新的句子。L系统规则包含两个句子。例如,使用规则“ A —> AB”,只要在字符串中找到“ A”,就会将其替换为“ AB”。
L系统通常使用以下字母:“ FG ±[]”,表示:
F:画一条线并向前移动
G:前进(不画线)
+:右转
-:左转
[:保存当前位置
]:恢复上一个位置
分形造型的常用模型,C构造简单的IFS图形相关推荐
- 简单介绍一下R中的几种统计分布及常用模型
统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...
- ⅰcp经济模型_简单介绍一下R中的几种统计分布及常用模型
统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...
- 风控知识点一:常用模型介绍
参考链接:https://zhuanlan.zhihu.com/p/56175215 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 一. 算法 逻辑回归 决策树 集成学习(随机 ...
- 深度学习之四:常用模型和方法
九.Deep Learning的常用模型或者方法 9.1.AutoEncoder自动编码器 Deep Learning最简单的一种方法是利用人工神经网络的特点,人工神经网络(ANN)本身就是具有 ...
- 机器学习常用模型:决策树_fairmodels:让我们与有偏见的机器学习模型作斗争
机器学习常用模型:决策树 TL; DR (TL;DR) The R Package fairmodels facilitates bias detection through model visual ...
- springBoot整合rabbitmq并测试五种常用模型
之前我们记录了原生java代码使用rabbitmq的方法,很简单,类似于原生jdbc代码一样,将连接对象抽离出来作为工具类,生产者和消费者通过工具类获取连接对象,进而获取通道对象,再注册交换机或者是队 ...
- 快速掌握 深度学习(Deep Learning) 常用概念术语,常用模型
1.什么是深度学习? 深度学习的概念: 深度学习是机器学习的一个分支,深度学习是使用了深度神经网络的机器学习 . 所以深度学习=深度神经网络+机器学习. 神经网络,也叫作人工神经网络 .是一种模拟人脑 ...
- 2-2 组合优化问题-常用模型与通用求解器
组合优化问题常用模型 组合优化问题常常难以求解,我们可以把这些转化为目前已经有成熟求解器的模型. 1. 可满足性问题(Satisfiability, SAT) 上一节已经讲过,SAT 是一个 NPC ...
- 【数学建模】常用模型算法及MATLAB代码汇总
大家好,我是程序员史迪仔. 这篇文章是在大学准备数学建模比赛时,整理的学习笔记,没想到阅读量.点赞量和收藏量还是可以的,很高兴我的文章能给大家带来帮助! 一.蒙特卡洛算法 二.数据拟合 三.数据插值 ...
最新文章
- 反式自动微分autodiff是什么?反向传播(Back Propagation)是什么?它是如何工作的?反向传播与反式自动微分autodiff有什么区别?
- 写一个sql实现以下查询结果_SQL 优化极简法则,你掌握了几个?
- Spring MVC 中自定义视图 @Component 及 配置 多个视图解析器 Excel视图
- python进阶学啥书籍_2018年Python学习进阶书籍推荐
- Android开发之assets目录下资源使用总结
- C语言 字符串转结构体,字符串指针转化为结构体指针!
- VC++网络安全编程范例(2)-创建自签名证书
- Redis之利用锁机制来防止缓存过期产生的惊群现象
- html5 video标签嵌入视频
- css重复,css3重复渐变效果
- 求两个圆公切线的模板
- Python3 打印26个英文字母
- linux mv命令例子,linux命令mv
- Flink 入门教程
- 3Dunet 降假阳性模型预处理
- response.getWriter()
- Word Embedding与Word2Vec学习
- amd服务器主板文件,AMD服务器主板全攻略--Opteron篇
- 字符串与16进制的转换
- CycleGan人脸转为漫画脸,牛掰的知识又增加了!| 附代码