几个简单分形图形的C语言实现

几个简单分形图形的C语言实现
几个简单分形图形的C语言实现

基于分形几何的分形图绘制与分析

基于分形几何的分形图绘制与分析 摘要:基于分形几何的分形图绘制方法源于l系统、迭代函数系统ifs、复动力系统等。在运用分形原理及算法编程绘制多种分形图的基础上,重点对ifs参数进行实验分析,ifs吸引集实现了对原图形的几何变换。分形图的演变具有渐变性。 关键词:分形几何迭代函数系统分形图绘制渐变 1 分形几何学 现代数学的一个新的分支——,它是由美籍法国数学家曼德勃罗(b.b.mandelbrot)1973年在法兰西学院讲课时,首次提出了分形几何的设想。分形(fractal)一词,是曼德勃罗创造出来的,其原意具有不规则、支离破碎等意义,分形几何学是一门以非规则几何形态为研究对象的几何学。由于不规则现象在自然界是普遍存在的,因此分形几何又称为描述大自然的几何学。分形几何的诞生无论是在理论上还是在实践上都具有重要价值。 2 分形的定义 目前分形还没有最终的科学定义,曼德勃罗曾经为分形下过两个定义: (1)分形是hausdorff-besicovitch维数严格大于拓扑维数的集合。因为它把许多hausdorff维数是整数的分形集合排除在外,例如,经典分形集合peano曲线分形维数 (2)局部与整体以某种方式自相似的形,称为分形。 然而,经过理论和应用的检验,人们发现这两个定义很难包括分形

如此丰富的内容。实际上,对于什么是分形,到目前为止还不能给出一个确切的定义,正如生物学中对“生命”也没有严格明确的定义一样,人们通常是列出生命体的一系列特征来加以说明。对分形的定义也可同样的处理。 (ⅰ) 分形集合在任意小尺度下,它总有复杂的细节,或者说它具有精细的结构。 (ⅱ) 分形集合是非常不规则的,用传统的几何语言无法来描述它的局部和整体,它既不是满足某些条件的点的轨迹,也不是某些简单方程的解集。 (ⅲ) 分形集具有某种自相似形式,可能是近似的自相似或者统计的自相似。 (ⅳ) 以某种方式定义的分形集合的“分形维数”,严格大于它相应的拓扑维数。 (ⅴ) 在大多数令人感兴趣的情形下,分形集合是以非常简单的递归的方法产生的。 3 分形研究的对象 几何学的研究对象是物体的形状,在自然界中,许多物体的形状是极不规则的,例如:弯弯曲曲的海岸线,起伏不平的山脉,变化无偿的浮云,以及令人眼花缭乱的满天繁星,等等。这些物体的形状有着共同的特点,就是极不规则,极不光滑。但是,所有的经典几何学都是以规则而光滑的形状为其研究对象的,例如:初等平面几何的主要研究对象是直线与圆;平面解析几何的主要研究对象是一

C语言写的各种心形图案

C语言写的各种心形图 案 集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988)

C语言写的各种心形图案 1./* 高手在民间,只能说这个是人才写的 */ #include "stdio.h" void main() { printf(" 我我\n 爱爱爱爱\n 你你你你\n"); printf(" 我我我\n爱 爱\n 你你\n"); printf(" 我我\n 爱 爱\n 你你\n"); printf(" 我我\n 爱爱\n 你你\n"); printf(" 我我\n 爱爱\n 你\n"); } /* 输出结果: ---------------------- 我我

爱爱爱爱 你你你你 我我我爱爱你你我我 爱爱 你你 我我 爱爱 你你 我我 爱爱 你 ---------------------- */ 2./* 结合课本输出几何图形 */ #include int main() {

int i,j; printf(" ****** ******\n" " ********** **********\n" " ************* *************\n"); //前三排的规律性不强所以直接显示就好了 for(i=0;i<3;i++)//显示中间三排{ for(j=0;j<29;j++) printf("*"); printf("\n"); } for(i=0;i<7;i++)//显示呈递减趋势规律的中间7排 { for(j=0;j<2*(i+1)-1;j++) printf(" "); for(j=0;j<27-i*4;j++) printf("*"); printf("\n"); } for(i=0;i<14;i++)//最后一个星号*与上面的规律脱节了所以独立显示 printf(" "); printf("*\n"); return 0; } /*

心形C语言代码

#include #include #define uint unsigned int #define uchar unsigned char uchar code table0[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//P0-P7依次点亮uchar code table1[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//P0-P7依次熄灭uchar code table2[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//P7-P0依次点亮uchar code table3[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};//P7-P0依次熄灭uchar temp,aa,bb,temp,temp1; void delay(uint z); void h(); void hh(); void hhh(); void hhhh(); void init(); void main()//主函数 { init(); while(520)//大循环 { h(); hh(); hhh(); hhhh(); } } void delay(uint z)//延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void h() { for(aa=0;aa<3;aa++) { for(bb=0;bb<8;bb++) { P0=table0[bb]; delay(50); } for(bb=0;bb<8;bb++) { P1=table0[bb];

谁创立了分形几何学

谁创立了分形几何学? 1973年,曼德勃罗(B.B.Mandelbrot)在法兰西学院讲课时,首次提出了分维和分形几何的设想。分形(Fractal)一词,是曼德勃罗创造出来的,其原意具有不规则、支离破碎等意义,分形几何学是一门以非规则几何形态为研究对象的几何学。由于不规则现象在自然界是普遍存在的,因此分形几何又称为描述大自然的几何学。分形几何建立以后,很快就引起了许多学科的关注,这是由于它不仅在理论上,而且在实用上都具有重要价值。 分形几何与传统几何相比有什么特点: ⑴从整体上看,分形几何图形是处处不规则的。例如,海岸线和山川形状,从远距离观察,其形状是极不规则的。 ⑵在不同尺度上,图形的规则性又是相同的。上述的海岸线和山川形状,从近距离观察,其局部形状又和整体形态相似,它们从整体到局部,都是自相似的。当然,也有一些分形几何图形,它们并不完全是自相似的。其中一些是用来描述一般随即现象的,还有一些是用来描述混沌和非线性系统的。 什么是分维? 在欧氏空间中,人们习惯把空间看成三维的,平面或球面看成二维,而把直线或曲线看成一维。也可以梢加推广,认为点是零维的,还可以引入高维空间,但通常人们习惯于整数的维数。分形理论把维数视为分数,这类维数是物理学家在研究混沌吸引子等理论时需要引入的重要概念。为了定量地描述客观事物的“非规则”程度,1919年,数学家从测度的角度引入了维数概念,将维数从整数扩大到分数,从而突破了一般拓扑集维数为整数的界限。 分维的概念我们可以从两方面建立起来:一方面,我们首先画一个线段、正方形和立方体,它们的边长都是1。将它们的边长二等分,此时,原图的线度缩小为原来的1/2,而将原图等分为若干个相似的图形。其线段、正方形、立方体分别被等分为2^1、2^2和2^3个相似的子图形,其中的指数1、2、3,正好等于与图形相应的经验维数。一般说来,如果某图形是由把原图缩小为1/a的相似的b个图形所组成,有: a^D=b, D=logb/loga 的关系成立,则指数D称为相似性维数,D可以是整数,也可以是分数。另一方面,当我们画一根直线,如果我们用0维的点来量它,其结果为无穷大,因为直线中包含无穷多个点;如果我们用一块平面来量它,其结果是0,因为直线中不包含平面。那么,用怎样的尺度来量它才会得到有限值哪?看来只有用与其同维数的小线段来量它才会得到有限值,而这里直线的维数为1(大于0、小于2)。与此类似,如果我们画一个Koch曲线,其整体是一条无限长的线折叠而成,显然,用小直线段量,其结果是无穷大,而用平面量,其结果是0(此曲线中不包含平面),那么只有找一个与Koch曲线维数相同的尺子量它才会得到有限值,而这个维数显然大于1、小于2,那么只能是小数(即分数)了,所以存在分维。其实,Koch 曲线的维数是1.2618……。 Fractal(分形)一词的由来

分形实例

2、对一条横向线段,先将其等分成4段,然后再将第二段向上移,将第三段向下移,再将第四段的相邻端点连接起来,迭代一次后变成图3-21.继续迭代得到的分形图,称为Minkouski (1)编辑实现上述迭代的函数 在Matlab中,编制一个函数来绘制Minkouski香肠的图形。具体代码如下:function frat1(k) p=[0,0;10,0]; A=[0,1;-1,0]; n=1; for s=1:k j=0; for i=1:n; q1=p(i,:); q2=p(i+1,:); d=(q2-q1)/4; j=j+1;r(j,:)=q1; j=j+1;r(j,:)=q1+d; j=j+1;r(j,:)=q1+d+d*A; j=j+1;r(j,:)=q1+2*d+d*A; j=j+1;r(j,:)=q1+2*d+d*A'; j=j+1;r(j,:)=q1+3*d+d*A'; j=j+1;r(j,:)=q1+3*d; end n=n*7; clear p p=[r;q2]; end

plot(p(:,1),p(:,2)) axis equal 将这个文件保存,文件名记为frat1.m. (2)绘制Minkouski香肠的图形 代码:frat(3) 运行结果: 代码:frat(5) 运行结果:

根据迭代规律得到:形似形个数m=7,边长放大倍数c=4,故维数d=1.4037.因此,Minkouski香肠的维数介于1与2之间。具体计算如下: d=ln m/ln c=ln 7/ln 4=1.4037 5、自己构造生成元(要有创意),按照图形迭代的方式产生分形图,用计算机编制程序绘出它的图形,并计算维数。 function frat2(k) p=[-5,5;5,5;5,-5;-5,-5;-5,5]; A=[1.5,-0.5;0.5,1.5]; n=4; for s=1:k j=0; for i=1:n; q1=p(i,:); q2=p(i+1,:); d=(q2-q1)/3; j=j+1;r(j,:)=q1; j=j+1;r(j,:)=q1+d; j=j+1;r(j,:)=q1+d+d*A; j=j+1;r(j,:)=q1+2*d; end n=n*4;

数学实验分形实例

数学实验报告 学院: 班级: 学号: 姓名: 完成日期:

实验二分形 (一)练习题1 一.实验目的 1.了解分形几何的基本情况; 2.了解通过迭代方式,产生分形图的方法; 3.了解matlab软件中简单的程序结构。 二. 问题描述 对一个等边三角形,每条边按照Koch曲线的方式进行迭代,产生的分形图称为Koch雪花。编制程序绘制出它的图形,并计算Koch雪花的面积,以及它的分形维数。 三.实验过程 仿照Koch曲线代码对三角形的每条边进行Koch曲线化,建立函数“snow”的输入参数有三角形的边长R和迭代次数k,输出Koch雪花图形以及雪花所围面积S. 源代码如下: function snow(R,k) p=[0;R/2+1i*R*sin(pi/3);R;0]; S=0; n=3; A=exp(1i*pi/3); for s=1:k

j=0; for i=1:n q1=p(i,:); q2=p(i+1,:); d=(q2-q1)/3; j=j+1;r(j,:)=q1; j=j+1;r(j,:)=q1+d; j=j+1;r(j,:)=q1+d+d*A; j=j+1;r(j,:)=q1+2*d; end n=4*n; clear p p=[r;q2]; end figure q(:,1)=real(p(:,1)); q(:,2)=imag(p(:,1)); plot(q(:,1),q(:,2)) fill(q(:,1),q(:,2),'b') for i=0:k S=S+(3.^(0.5-i))*0.25*(R.^2); end

S axis equal 按照以上程序,输入参数,有以下结果:>> snow(1,1) S =0.5774 图形如下: >>snow(1,2) S =0.6255 图形如下: >>snow(1,3) S =0.6415 图形如下:

最美C语言情书(输出心形图案)

/***C语言心形图案***/ # include < stdio.h > # include < math.h > int main ( void ) { double y; unsigned m, i, j; for (y = 1; y >=0; y -= 0.1) { m = asin (y) * 10; for (i = 0; i < m; i++) { putchar (' '); } putchar ('*'); for (; i < 31 - m; i++) { if(15 == i || 16 == i) putchar('|'); else if (i > 15 && i < 27 && 0 == m) putchar('|'); else

putchar (' '); } putchar ('*'); for (; i < 62; i++) { if (31 + m == i || 62 - m == i) putchar('*'); else if (46 - sqrt(25-(5-m)*(5-m)) == i || 46 + sqrt(25-(5-m)*(5-m)) == i || 45 - sqrt(25-(5-m)*(5-m)) == i || 45 + sqrt(25-(5-m)*(5-m)) == i) putchar('o'); else putchar(' '); } putchar ('\n'); } for ( y = 0, j = 0; y >= -2; y -= 0.1 ) { int yy = fabs(y) * 10; m = (acos(y*0.5) * 20) - 31; if (!(yy % 6)) j++; for (i = 0; i < 63; i++) { if (m + j == i || 63 - m - j == i) putchar('*'); else if (y >= -0.6 && ( 38 - yy == i || yy + 26 == i)) putchar('v'); else if (y >= -1.6 && y < -0.7 && (31 - sqrt(25-(12-yy)*(12-yy)) == i || 32 + sqrt(25-(12-yy)*(12-yy)) == i)) putchar('e'); else if (-1.2 == y && i > 28 && i < 35) putchar('e'); else if ((yy == 17 && i == 31) || ((i == 26) && yy == 14) || ((i == 28 || i == 34) && yy == 16)) putchar('e'); else putchar(' '); } printf("\n"); } return 0; }

基于51单片机心形流水灯C语言源程序

基于51单片机心形流水灯C语言源程序

#include unsigned int x,y; void delayms(unsigned int z) //延时 { unsigned int i,j; for(i=z;i>0;i--) for(j=150;j>0;j--); } void On_all() //开启所有灯 { P0=0x00; P1=0x00; P2=0x00; P3=0x00; } void Off_all()//关闭所有灯 { P0=0xff; P1=0xff; P2=0xff; P3=0xff; } void ls()//正向流水灯 { P0=0x00; delayms(400); P2=0x00; delayms(400); P3=0x00; delayms(400); P1=0x00; delayms(400); P0=0x01; delayms(50);

P0=0x04; delayms(50); P0=0x08; delayms(50); P0=0x10; delayms(50); P0=0x20; delayms(50); P0=0x40; delayms(50); P0=0x80; delayms(50); P0=0x00; P2=0x01; delayms(50); P2=0x02; delayms(50); P2=0x04; delayms(50); P2=0x08; delayms(50); P2=0x10; delayms(50); P2=0x20; delayms(50); P2=0x40; delayms(50); P2=0x80; delayms(50); P2=0x00; P3=0x80; delayms(50); P3=0x40; delayms(50); P3=0x20; delayms(50); P3=0x10; delayms(50); P3=0x08; delayms(50); P3=0x04; delayms(50);

c语言心形代码及图形

#include #include #include #define r 10 #define R 172 int main(void) { FILE *fp; int n; if((fp=fopen("LOVE.txt","w"))==NULL) { printf("File open error!\n"); exit(0); } int i,j,e; int a; for(i=1,a=r;i0;j--) { printf(" "); fprintf(fp,"%s"," "); } for(e=1;e<=2*sqrt((r*r-(a-i)*(a-i)));e++)

{ printf("\3"); fprintf(fp,"%s"," * "); } for(j=(int) ( 2*( r-sqrt((r*r-(a-i)*(a-i)))) );j>0;j--) { printf(" "); fprintf(fp,"%s"," "); } for(e=1;e<=2*sqrt( (r*r-(a-i)*(a-i)) );e++) { printf("\3"); fprintf(fp,"%s"," * "); } printf("\n"); fprintf(fp,"%s","\n"); } for(i=1;i<40;i++) { if(i==6) { printf("(∩_∩)I LOVE MY MOTHER(∩_∩)"); i+=30; } printf("\3"); fprintf(fp,"%s"," * "); } printf("\n"); for(i=1;i<=R/2;i++) { if(i%2||i%3)continue; for(j=(int) ( R-sqrt( (double) (R*R-i*i) ) );j>0;j--) { printf(" "); fprintf(fp,"%s"," "); } for(e=1;e<=2*( sqrt( (double)(R*R-i*i) ) - (R-2*r) );e++) { printf("\3"); fprintf(fp,"%s"," * " ); } printf("\n");

分形图形与分形的产生

分形图形 分形理论是非线性科学的主要分支之一,它在计算机科学、化学、生物学、天文学、地理学等众多自然科学和经济学等社会科学中都有广泛的应用。分形的基本特征是具有标度不变性。其研究的图形是非常不规则和不光滑的已失去了通常的几何对称性;但是,在不同的尺度下进行观测时,分形几何学却具有尺度上的对称性,或称标度不变性。研究图形在标度变换群作用下不变性质和不变量对计算机图形技术的发展有重大的意义。 说到分形(fractal),先来看看分形的定义。分形这个词最早是分形的创始人曼德尔布诺特提来的,他给分形下的定义就是:一个集合形状,可以细分为若干部分,而每一部分都是整体的精确或不精确的相似形。分形这个词也是他创造的,含有“不规则”和“支离破碎”的意思。分形的概念出现很早,从十九世纪末维尔斯特拉斯构造的处处连续但处处不可微的函数,到上个世纪初的康托三分集,科赫曲线和谢尔宾斯基海绵。但是分形作为一个独立的学科被人开始研究,是一直到七十年代曼德尔布诺特提出分形的概念开始。而一直到八十年代,对于分形的研究才真正被大家所关注。 分形通常跟分数维,自相似,自组织,非线性系统,混沌等联系起来出现。它是数学的一个分支。我之前说过很多次,数学就是美。而分形的美,更能够被大众所接受,因为它可以通过图形化的方式表达出来。而更由于它美的直观性,被很多艺术家索青睐。分形在自然界里面也经常可以看到,最多被举出来当作分形的例子,就是海岸线,源自于曼德尔布诺特的著名论文《英国的海岸线有多长》。而在生物界,分形的例子也比比皆是。 近20年来,分形的研究受到非常广泛的重视,其原因在于分形既有深刻的理论意义,又有巨大的实用价值。分形向人们展示了一类具有标度不变对称性的新世界,吸引着人们寻求其中可能存在着的新规律和新特征;分形提供了描述自然形态的几何学方法,使得在计算机上可以从少量数据出发,对复杂的自然景物进行逼真的模拟,并启发人们利用分形技术对信息作大幅度的数据压缩。它以其独特的手段来解决整体与部分的关系问题,利用空间结构的对称性和自相似性,采用各种模拟真实图形的模型,使整个生成的景物呈现出细节的无穷回归的性质,丰富多彩,具有奇妙的艺术魅力。分形对像没有放大极限,无论如何放大,总会看到更详细的结构。借助于分形的计算机生成,从少量的数据生成复杂的自然景物图形,使我们在仿真模拟方面前进了一大步。在分形的诸多研究课题中,分形的计算机生成问题具有明显的挑战性,它使传统数学中无法表达的形态(如山脉、花草等)得以表达,还能生成一个根本“不存在”的图形世界。分形在制造以假乱真的景物方面的进展和潜在的前途,使得无论怎样估计它的影响也不过分。可以肯定,分形图案在自然界真实物体模拟、仿真形体生成、计算机动画、艺术装饰纹理、图案设计和创意制作等具有广泛的应用价值。 分形图形简介一、关于分形与混沌 关于分形的起源,要非常准确的找出来是非常困难的。研究动态系统、非线形数学、函数分析的科学家,已数不胜数。尽管分形的早期线索已非常古老,但这一学科却还很年轻。比如关于动态系统和细胞自动机的大部分工作可以追溯到冯-诺依曼;但是,直到Mandelbrot 才如此清楚地将自然现象和人工现象中的混沌及分形同自相似性联系在一起。大家如果对此感兴趣,可进一步查阅有关资料。下面我们看一看分形的概念。 什么是分形呢?考虑到此文的意图,我们无意给出它严格的定义,就我们的目的而言,一个分形就是一个图象,但这个图象有一个特性,就是无穷自相似性。什么又是自相似呢?在自然和人工现象中,自相似性指的是整体的结构被反映在其中的每一部分中。比如海岸线,常举的例子,你看它10公里的图象(曲线),和一寸的景象(曲线)是相似的,这就是自相似性。 与分形有着千差万屡的关系的,就是混沌。混沌一词来源与希腊词汇,原意即“张开咀”,但是在社会意义上,它又老爱和无序联系在一起。解释分形和混沌的联系,要注意到分形是

Visual C++茱莉亚分形图形绘制

1.绘制茱莉亚图 (1)绘制窗口 首先在VC中建一个新的Projects,选择项目类型为MFC AppWizard(exe),在项目名称中键入DrawJulial,按下OK。 在随后的窗口中选择Single Document,选中Document/View architecture support,在语言中选中中文。 在Step 2 of 6窗口中不要数据库支持(None)。 在Step 3 of 6窗口中选中不要复合文档支持(None),将Automation的ActiveX Controls 选项都取消 在Step 4 of 6窗口中将默认选项中的Printing and print preview 和Docking toolbar去除,接下Next。 对Step 5 of 6窗口和Step 6 of 6窗口不作修改,按下Finish。 此时VC已经自动将我们想要的程序框架建立完毕。 然后将VC框架建立的菜单中的编辑菜单完全删去,将文件菜单中除退出一项外全部删去,在查看后面加入一个菜单项,去掉其Pop-up属性,命其ID号为ID_DRAWJULIAL,Caption为绘制茱莉亚图。 (2)定义消息映射函数 在Class Wizard中选择Message Maps栏,在Class Name 栏中选择CDrawJulialView,在Object IDs中选择

ID_DRAWJULIAL,为其COMMAND消息建立一个消息映射函数。 (3)建立代码 1.类CBaseDraw是一个基本的绘图函数,可以作为基类使用。CJulial类就是从CBaseDraw继承下来的类。由于在CBaseDraw的成员函数sleep中调用了系统函数timeGetTime(),因此要做以下工作: 选择主菜单的Project项中的Setting,在弹出的对话框中选择Link页,在Object/library modules项中加入“winmm.lib”。 源程序BaseDraw.h代码如下: //BaseDraw.h: interface for the CBaseDraw class #if !defined(AFX_BASEDRAW_H__CB43CA20_175A_11D4_81F F_94DCC6655E1C__INCLUDED_) #define AFX_BASEDRAW_H__CB43CA20_175A_11D4_81FF_94DCC6655E1 C__INCLUDED_ #if _MSC_VER > 1000 #pragma once # endif //_MSC_VER >1000 #define pi 3.141592654 //基本绘图类 class CBaseDraw

分形图形学实验指导

分形图形学实验指导

————————————————————————————————作者: ————————————————————————————————日期: ?

分形图形学实验指导 实验一二维空间上的分形图形生成 实验目的 1.Mandelbrot集与Julia集的计算机实现 2.掌握用L系统语言生成分形 实验内容及步骤 1.编写程序生成Mandelbrot集 在复迭代中影响最大的当属迭代z→z^2+c,实际上它只是形式更一般的复解析迭代z_(n+1)=F(z_n)+c的一种, F是一个非线性函数。显然z→z^2+c也是最简单的一种,它在复迭代中的地位相当于逻辑斯蒂映射x_(n+1)=ax_n(1- x_n)在实迭代中的地位(见第八章)。 考虑一般形式的F,令z=x+iy,c=c_( X)+ic_(Y),其中i表示虚数,i=SQRT(-1)。 分离实部与虚部,具体化迭代关系便有: x→f(x,y)+c_(X),y→g(x,y)+c_(Y). 通常所说的M集是迭代二次函数z→z^2+c产生的,此函数具体化就是 x→x^2-y^2+c_(X),y→2xy+c_(Y). 其中z=x+i y,c=c_(X)+i c_(Y ),以横轴x记录实数的实部,以纵轴y记录实数的虚部。M集合实际上是常数c=(c_(X),c_(Y))构成的图象。让c从屏幕左上角开始变化,逐行增加,一直变到屏幕右下角。如果取的区域是200×200,则一共要计算40,000个点,把计算的结果用不同的颜色标记下来,就得到一幅图象,这就是M 集。对于不同的c值,如何得到表征迭代性质的不同的结果呢? 容易知道,无穷远处肯定是迭代的一个吸引子,即对于复平面上相当多的初始条件,迭代最终都跑到无穷远处。但研究发现,在原点附近还存在一个奇特的区域,在迭代过程中此区域永远不会跑掉。在非严格的意义上,这个不变的集合就是M集,我们的主要任务就是画出这个集合的边界——实际上边界是分形曲线,极其复杂,M集图象的全部魅力就在这里。

计算机图形学分形图生成

实验六分形图的生成 班级信计二班学号 20080502066 姓名陈铁映分数 一、实验目的和要求: 1、掌握希尔宾斯基三角形和Julia Set (茱莉亚集)的基本原理。 2、熟悉两个图形的生成算法。 3、掌握希尔宾斯基三角形和和Julia Set (茱莉亚集)的绘制.。 4、提高分形图形生成的理解应用能力。 二、实验内容: 1、对于第一个图形在平面内随机的设置种子,并由此而设定三角形的三个顶点。形成初始化模式后,绘制三万个点,使规则传递下去。 2、对于第二个图形则运用逃逸时间法后设定一个常数c的值。 3、对两图形分别进行分析对比其局部与整体的自相似性。 三、实验结果分析: 1、该程序实现了递归算法和逃逸时间法的图形绘制 2、比较每一小部分与整体的关系: 图形的层次是无限的、分形往往可以从局部“看出”整体、虽然看上 去十分复杂,但其背后的规则却是相当简单。 四、程序代码: 1、希尔宾斯基三角形为: #include #include #include void main() { srand((unsigned)time(NULL)); // 设置随机种子 POINT P[3] = {{320, 50}, {120, 400}, {520, 400}}; // 设定三角形的三个顶点 POINT p = {rand() % 640, rand() % 480}; // 随机产生当前点 // 初始化图形模式 initgraph(640, 480); // 绘制三万个点 int n; for(int i = 0; i <= 30000; i++) {

分形图程序

(1)Koch曲线程序koch.m function koch(a1,b1,a2,b2,n) %koch(0,0,9,0,3) %a1,b1,a2,b2为初始线段两端点坐标,n为迭代次数 a1=0;b1=0;a2=9;b2=0;n=3; %第i-1次迭代时由各条线段产生的新四条线段的五点横、纵坐标存储在数组A、B中 [A,B]=sub_koch1(a1,b1,a2,b2); for i=1:n for j=1:length(A)/5; w=sub_koch2(A(1+5*(j-1):5*j),B(1+5*(j-1):5*j)); for k=1:4 [AA(5*4*(j-1)+5*(k-1)+1:5*4*(j-1)+5*(k-1)+5),BB(5*4*(j-1)+5*(k-1)+1:5*4*(j-1)+5*(k-1)+5)]=sub_koch1(w(k,1),w(k,2),w(k,3),w(k,4)); end end A=AA; B=BB; end plot(A,B) hold on axis equal %由以(ax,ay),(bx,by)为端点的线段生成新的中间三点坐标并把这五点横、纵坐标依次分别存%储在数组A,B中 function [A,B]=sub_koch1(ax,ay,bx,by) cx=ax+(bx-ax)/3; cy=ay+(by-ay)/3; ex=bx-(bx-ax)/3;

ey=by-(by-ay)/3; L=sqrt((ex-cx).^2+(ey-cy).^2); alpha=atan((ey-cy)./(ex-cx)); if (ex-cx)<0 alpha=alpha+pi; end dx=cx+cos(alpha+pi/3)*L; dy=cy+sin(alpha+pi/3)*L; A=[ax,cx,dx,ex,bx]; B=[ay,cy,dy,ey,by]; %把由函数sub_koch1生成的五点横、纵坐标A,B顺次划分为四组,分别对应四条折线段中 %每条线段两端点的坐标,并依次分别存储在4*4阶矩阵k中,k中第i(i=1,2,3,4)行数字代表第%i条线段两端点的坐标 function w=sub_koch2(A,B) a11=A(1);b11=B(1); a12=A(2);b12=B(2); a21=A(2);b21=B(2); a22=A(3);b22=B(3); a31=A(3);b31=B(3); a32=A(4);b32=B(4); a41=A(4);b41=B(4); a42=A(5);b42=B(5); w=[a11,b11,a12,b12;a21,b21,a22,b22;a31,b31,a32,b32;a41,b41,a42,b42];

六个分形图形的matlab实现(6)

几个分形的matlab 实现 摘要:给出几个分形的实例,并用matlab 编程实现方便更好的理解分形,欣赏其带来的 数学美感 关键字:Koch 曲线 实验 图像 一、问题描述: 从一条直线段开始,将线段中间的三分之一部分用一个等边三角形的两边代替,形成山丘形图形如下 图1 在新的图形中,又将图中每一直线段中间的三分之一部分都用一个等边三角形的两条边代替,再次形成新的图形如此迭代,形成Koch 分形曲线。 二、算法分析: 考虑由直线段(2个点)产生第一个图形(5个点)的过程。图1中,设1P 和5P 分别为原始直线段的两个端点,现需要在直线段的中间依次插入三个点2P ,3P ,4P 。显然2P 位于线段三分之一处,4P 位于线段三分之二处,3P 点的位置可看成是由4P 点以2P 点为轴心,逆时针旋转600 而得。旋转由正交矩阵 ? ???? ? ? ? -=)3cos() 3 sin()3sin( )3 cos(ππ ππ A 实现。 算法根据初始数据(1P 和5P 点的坐标),产生图1中5个结点的坐标。结点的坐标数组形成一个25?矩阵,矩阵的第一行为1P 的坐标,第二行为2P 的坐标……,第五行为5P 的坐标。矩阵的第一列元素分别为5个结点的x 坐标,第二列元素分别为5个结点的y 坐标。 进一步考虑Koch 曲线形成过程中结点数目的变化规律。设第k 次迭代产生的结点数为 k n ,第1+k 次迭代产生的结点数为1+k n ,则k n 和1+k n 中间的递推关系为341-=+k k n n 。 三、实验程序及注释: p=[0 0;10 0]; %P 为初始两个点的坐标,第一列为x 坐标,第二列为y 坐标 n=2; %n 为结点数 A=[cos(pi/3) -sin(pi/3);sin(pi/3) cos(pi/3)]; %旋转矩阵 for k=1:4

计算机图形学 分形图的生成936

实验六分形图的生成 班级08信计二学号52 姓名刘丽杰分数 一、实验目的和要求: 1、掌握分形基本原理,熟悉分形的计算机模拟算法。 2、学习调试程序及分析运行结果。 3、上机操作迭代函数系统算法。 二、实验内容: 1、编程实现分形的贝塞尔算法,并输出图形。 2、编程实现一棵树,先按某一方向画一条直线段,然后在此线段上找到一系列节点,在每一节点处向左右偏转60度各画一条分支。节点位置和节点处所画分支的长度的比值各按0.618分割。 三、程序执行和运行结果: 1、贝塞尔程序: #include #include #define WIDTH 640 #define HEIGHT 480 #define NUMPTS 6 HDC hdc; float animpts[NUMPTS * 2]; float deltas[NUMPTS * 2]; void Init() { for (int i = 0; i < NUMPTS * 2; i += 2) { animpts[i ] = (float)rand() / RAND_MAX * WIDTH; animpts[i + 1] = (float)rand() / RAND_MAX * HEIGHT; deltas[i ] = (float)rand() / RAND_MAX * 4 + 2; deltas[i + 1] = (float)rand() / RAND_MAX * 4 + 2; if (animpts[i ] > WIDTH / 6.0f) deltas[i ] = -deltas[i ]; if (animpts[i + 1] > HEIGHT / 6.0f) deltas[i + 1] = -deltas[i + 1];

数学实验之分形图的绘制

钦州学院数学与计算机科学学院 数学实验报告 专业 : 数学与应用数学班级姓名:学号: 实验完成日期 :2010 年 11 月 1 日,第 10 周,星期一 成绩等级(五级分制)评阅教师评阅日期年月日数学实验报告填写要求:思路清晰,中间结果和最终结果真实;字迹工整,报告完整。[实验题目及内容] 实验题目:分形图形的绘制 实验内容:利用二叉树的画法对生成元带参数进行迭代绘制分形图。 [问题描述](用自己组织的相关数学语言重述现实问题;注意对约定的条件作说明) 分形图是由一个简单的枝杈不断向周围延伸增加枝干而成,由简单元素生成整体,其中包含有旋转、带参数深层迭代等步骤,对生成元的张开角度和线段长度也有所控制才能绘制出多彩的图形,所以就要设计几个能控制生成图的角度的圆,随时改动分形图的伸张。 [模型建立或思路分析](建立合理,可解释的数学模型,通过公式、表格或图形直观明确地描述模型的结构;无法通过建立模型解决的,给出解题的思路及办法。) 整个分形图就由几个简单的枝杈进行带参数深层迭代而成,所以先做一个作为整棵树的树主干,做线段AB,以一个B端点作为旋转中心,做两个能控制角度旋转的圆,以圆上所选的角度做适当旋转将线段AB及端点A向上旋转得到两条线段,将得到的线段进行缩放到原来的三分之二,三条线段就组成一个树杈,再继续做另外两个圆选好角度将由线段AB旋转得到的两条线段再向上旋转得到另两条线段,将得到的线段进行缩放到原来的一半。新建参数n=1,对AB两点和参数n进行深度迭代,使得旋转得到的线段的起始点对应

线段AB的起始点,改变n值,即可得到一棵参天大树,即分形图完成。 [实验结果](通过数学表达式、列表或图形图像的方式显示实验结果。) [结果分析及结论](对实验结果进行定量分析、合理性分析或误差分析;对所讨论的问题重新认识或提出相关类似问题的拓延;给出自己的意见和合理建议。) 得出的分形图伸张程度和倾斜程度都可以由原先做出的角度控制,改变圆上的角度的大小就可以改变树的弯曲倾斜程度,改变三层基层线段的粗细和颜色可以让分形图更形象,分形图的迭代情况有参数n控制,改变n值增加迭代次数,让树的枝丫伸展使得分形图更多彩。也可以改变生成元的构成,可以在基层增加枝干,进行深层迭代后得出不同形象的分形图。 [求解方法或解题步骤](针对所建模型或解题思路,给出具体的求解方法或解题步骤。对通过编程解决的问题,画出流程图,给出细节部分的算法,给出相关软件的代码;其他方法解决的,给出详细的解题步骤。)

1分形图基本图形以及源程序

分形图基本图形以及源程序 第一部分 本人新手,如有错误请指正。程序完成于2011/6/17晚间到2011/6/18。 很多变量名称采用的是同学的姓名拼音,为的是告诉大家这些都是可以随意命名的变量或函数名,一般大写字母开头的是系统定义的变量不可以随意更改。 一、(*雪花*) 源程序 lovelyduwangen[zhengguojie_List]:=Block[{weihuayan={},i,wuxiaonan=Length[zhe ngguojie],gengping=60Degree,sa=Sin[gengping],ca=Cos[gengping],c,d,e,T={{ca,-sa} ,{sa,ca}}}, For[i=1,i< wuxiaonan,i++,c=zhengguojie[[i]]*2/3+zhengguojie[[i+1]]/3; e=zhengguojie[[i]]/3+zhengguojie[[i+1]]*2/3; d=c+T.(e-c); weihuayan=Join[weihuayan,{zhengguojie[[i]],c,d,e,zhengguojie[[i+1]]}]]; weihuayan] dongquanfa={{0,0},{1/2,Sqrt[3]/2},{1,0},{0,0}}; Show[Graphics[Line[Nest[lovelyduwangen,dongquanfa,0]],AspectRatio→Sqrt[3]/2]] Show[Graphics[Line[Nest[lovelyduwangen,dongquanfa,5]],AspectRatio→Sqrt[3]/2]] 基本生成元

计算机图形学--分形图的生成

实验六分形图的生成 班级08信计二学号90 姓名张进分数 一、实验目的和要求: 1、掌握分形基本原理,熟悉分形的计算机模拟算法。 2、学习调试程序及分析运行结果。 For personal use only in study and research; not for commercial use 3、上机操作迭代函数系统算法。 二、实验内容: 1、编程实现分形的自相似法,并输出图形。 For personal use only in study and research; not for commercial use 2、编程实现一棵树,先按某一方向画一条直线段,然后在此线段上找到一系列节点,在每一节点处向左右偏转60度各画一条分支。节点位置和节点处所画分支的长度的比值各按0.618分割。 三、程序执行和运行结果: 1、自相似图形程序: #include #include #include #include void star1(int x,int y,int r); void star2(int x, int y , int r); void main() {

int graphdriver,graphmode,x,y,r; graphdriver=DETECT; initgraph(&graphdriver,&graphmode," "); setcolor(LIGHTMAGENTA); star1(160,160,80); getch(); star2(480,320,80); getch(); } void star1(int x,int y,int r) { if(r>0) { star1(x-r,y+r,r/2); star1(x+r,y+r,r/2); star1(x-r,y-r,r/2); star1(x+r,y-r,r/2); bar(x-r,y+r,x+r,y-r); } } void star2(int x, int y , int r) {

相关文档
最新文档