计算机图形学分形图生成

合集下载

分形图形的形成

分形图形的形成

实验课题:(六)分形图的生成
1. 用Matlab 编程,画出Cantor 三分集的图形。

2. 画出按下列各图所示方法生成的分形的图形,并计算出其自相似维数。

你自己构造出一些生成元,并由此绘出相应的分形图形。

3. Weierstrass 函数的定义是:
∑∞=-=1)2()sin()(k k k s x x W λλ
,1>λ,21<<s
试对不同的s 值,画出函数的图象,并观察图象的不规则性与s 的关系,。

4. 画出Levy 曲线的图象。

试着改变IFS 迭代中仿射变换的系数和概率的值,看看能否生成一些新的分形图。

5. 自己编写程序,画出Mandelbrot 集的图形。

然后任意选取它的一个局部将其放大,观察放大后的图形与原图形之间的关系。

6. Julia 集和Mandelbrot 集可以推广到高阶情形,即考虑下列n 次复变函数迭代:
c Z Z n k k +=+1, ,2,1,0=k
对固定的c ,使得上述迭代有界的初值0Z 构成的集合称为n 阶Julia 集;对固定的初值0Z ,使得上述迭代有界的参数c 构成的集合称为n 阶Mandelbrot 集。

对不同的n ,画出相应的Julia 集和Mandelbrot 集。

进而构造一些不同的迭代函数,如余弦函数z z f cos )(=和牛顿函数233/)12()(z z z f +=,画出类似的Julia 集和Mandelbrot 集。

生成元 初始元 生成元
初始元。

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

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

实验六分形图的生成班级 08信计学号60姓名杨平萍分数一、实验目的和要求:1、掌握分形基本原理2、熟悉分形的计算机模拟算法3、上机操作迭代函数系统算法4、编译并执行谢宾斯基(Sierpinski)三角形二、实验内容:1、编程实现分形的迭代函数系统算法,并输出图形;2、编译曼德布洛特集和可放大的曼德布洛特集。

.三、编程并实现Mandelbrot Set (曼德布洛特集)的运行程序:#include <graphics.h>#include <conio.h>struct COMPLEX{double re;double im;};COMPLEX operator * (COMPLEX a, COMPLEX b){COMPLEX c;c.re = a.re * b.re - a.im * b.im;c.im = a.im * b.re + a.re * b.im;return c;}COMPLEX operator + (COMPLEX a, COMPLEX b){COMPLEX c;c.re = a.re + b.re;c.im = a.im + b.im;return c;}void main(){initgraph(640, 480);COMPLEX z, c;int x, y, k; // 定义循环变量for(x = 0; x < 640; x++){c.re = -2.1 + (1.1 - -2.1) * (x / 640.0);for(y = 0; y < 480; y++){c.im = -1.2 + (1.2 - -1.2) * (y / 480.0);z.re = z.im = 0;for(k = 0; k < 180; k++){if ( z.re * z.re + z.im * z.im > 4.0 ) break;z = z * z + c;}putpixel(x, y, (k >= 180) ? 0 : HSLtoRGB((float)((k << 5) % 360), 1.0, 0.5));}}getch();closegraph();}程序截图可以无穷放大的Mandelbrot Set (曼德布洛特集)的运行程序:#include <graphics.h>#include <conio.h>#define ITERATIONS 1000#define MAXCOLOR 64struct COMPLEX{double re;double im;};COMPLEX operator * (COMPLEX a, COMPLEX b){COMPLEX c;c.re = a.re * b.re - a.im * b.im;c.im = a.im * b.re + a.re * b.im;return c;}COMPLEX operator + (COMPLEX a, COMPLEX b){COMPLEX c;c.re = a.re + b.re;c.im = a.im + b.im;return c;}int Color[MAXCOLOR];void InitColor(){int h1 = 240, h2 = 30;for(int i=0; i<MAXCOLOR/2; i++){Color[i] = HSLtoRGB((float)h1, 1.0f, i * 2.0f / MAXCOLOR);Color[MAXCOLOR-1-i] = HSLtoRGB((float)h2, 1.0f, i * 2.0f / MAXCOLOR);}}void Draw(double fromx, double fromy, double tox, double toy){COMPLEX z, c;int x, y, k;for(x = 0; x < 640; x++){c.re = fromx + (tox - fromx) * (x / 640.0);for(y = 0; y < 480; y++){c.im = fromy + (toy - fromy) * (y / 480.0);z.re = z.im = 0;for(k = 0; k < ITERATIONS; k++){if ( z.re * z.re + z.im * z.im > 4.0 ) break;z = z * z + c;}putpixel(x, y, (k >= ITERATIONS) ? 0 : Color[k % MAXCOLOR]);}}}void main(){initgraph(640, 480);InitColor();double fromx, fromy, tox, toy;fromx = -2.1; tox = 1.1;fromy = -1.2; toy = 1.2;Draw(fromx, fromy, tox, toy);MOUSEMSG m;bool isLDown = false;int selfx, selfy, seltx, selty;while(!kbhit()){m = GetMouseMsg();switch(m.uMsg){case WM_MBUTTONUP:fromx = -2.1; tox = 1.1;fromy = -1.2; toy = 1.2;Draw(fromx, fromy, tox, toy);break;case WM_MOUSEMOVE:if (isLDown){rectangle(selfx, selfy, seltx, selty);seltx = m.x;selty = m.y;rectangle(selfx, selfy, seltx, selty);}break;case WM_LBUTTONDOWN:setcolor(WHITE);setwritemode(R2_XORPEN);isLDown = true;selfx = seltx = m.x;selfy = selty = m.y;rectangle(selfx, selfy, seltx, selty);break;case WM_LBUTTONUP:rectangle(selfx, selfy, seltx, selty);setwritemode(R2_COPYPEN);isLDown = false;seltx = m.x;selty = m.y;if (selfx == seltx || selfy == selty) break;int tmp;if (selfx > seltx) {tmp = selfx; selfx = seltx; seltx = tmp;}if (selfy > selty) {tmp = selfy; selfy = selty; selty = tmp;}if ( (seltx - selfx) * 0.75 < (selty - selfy) ){selty += (3 - (selty - selfy) % 3);selfx -= (selty - selfy) / 3 * 4 / 2 - (seltx - selfx) / 2;seltx = selfx + (selty - selfy) / 3 * 4;}else{seltx += (4 - (seltx - selfx) % 4);selfy -= (seltx - selfx) * 3 / 4 / 2 - (selty - selfy ) / 2;selty = selfy + (seltx - selfx ) * 3 / 4;}double f, t;f = fromx + (tox - fromx) * selfx / 640;t = fromx + (tox - fromx) * seltx / 640;fromx = f;tox = t;f = fromy + (toy - fromy) * selfy / 480;t = fromy + (toy - fromy) * selty / 480;fromy = f;toy = t;Draw(fromx, fromy, tox, toy);break;}}getch();closegraph();}程序截图:四、实验结果分析分形的对称性即表现了传统几何的上下、左右及中心对称。

几个生成典型分形图形的计算机算法

几个生成典型分形图形的计算机算法

几个生成典型分形图形的计算机算法下面我们给出几个生成典型分形图形的计算机算法,这些算法在表述上较多地借助了C语言,读者也很容易用自己熟悉的其他计算机编程语言来实现,如Pascal、Basic等。

1.由高斯白噪声积分产生的一维布朗运动ALGORITHM WhiteGoiseBM(X,N,seed)Title Brownian motion by integration of white Gaussian noiseArguments X[] array of reals of size NN size of array Xseed seed value for random number generatorVariables I integerBEGINX[0]:=0InitGauss(seed)FOR i:=1 TO N-1 DOX[i]:=[i-1]+Gauss()/(N-1)END FORENDALGORITHM InitGauss(seed)Title Initialization of random number generatorsArguments seed seed value for random number generatorGlobals Arand rand()returns values between()and Arand,system dependentNrand number of samples of rand()to be taken in Gauss()GaussAdd real parameter for the linear transformationin Gauss()GaussFac real parameter for the linear transformation inGauss()Functions stand() initialization of system random numbersBEGINNrand:=4Arand:=power(2,31)-1GaussAdd:=sqrt(3*Nrand)GaussFac:=2*GaussAdd/(Nrand*Arand)srand(seed)ENDALGORITHM Gauss()Title Function retuming Gaussian random numberGlobals Nrand number of samples of rand()to be taken in Gauss()GaussAdd real parameter for the linear transformation in Gauss()GaussFac real parameter for the linear transformation in Gauss()Locals sum realI integerFunctions rand() system function for random numbersBECINsum:=0FOR i:=1 TO Nrand DOsum:=sum+rand()END FORRETURN(GaussFac*sum-GaussAdd)END2.Mandelbrot集生成算法ALGORITHM MSetCPM(Mset,nx,ny,xmin xman ymin,ymax,maxiter)Title Mandelbrot set via Continuous Potential Method(CPM)Arguments Mset[][] output array of real type,size nx by nynx,ny image resolution in x-and y-directionxmin,xmax low and high x-value of image windowymin,ymax low and high y-value of image window aspectratio of window is :nx by nymaxiter maximal number of iterationsVariables ix,iy integercx,cy realFunctions MsetPot() returns potetial of a pointBEGINFOR iy=0 TO ny-1 DOcy :=ymin+iy*(ymax-ymin)/(ny-1)FOR ix=0 TO nx-1 DOcx :=xmin+ix*(xmax-xmin)/(nx-1)MSet[ix][iy] :=MSetPot(cx,cy,maxiter)END FOREND FORENDALGORITHM MSetPot(cx,cy,maxiter)Title Function returning potential of a pointArguments cx,cy point to be testedmaxiter maximal number of iterationsVariables iter integerx,y,x2,y2 point coordinates and squarestemp real scratch variablepotential real variable,potentialBEGINx :=cx;x2:=x*yy :=cy;y2:=y*yiter :=0WHILE(iter<maxiter)AND(x2+y2<10000.0)DOtemp :=x2-y2+cxy :=2*x*y+cyx :=tempx2:=x*xy2:=y*yiter :=iter+1END WHILEIF(iter<maxiter)THENpotential :=0.5*log(x2+y2)/power(2.0,iter)ELSEpotential :=0.0END IFRETURN(potential)END3.由迭代函数系生成图像的算法其中),,(r y x w 即为迭代关系函数。

图形学实验一 三维分形(附源代码)

图形学实验一 三维分形(附源代码)

实验报告实验名称:三维分形算法姓名:陈怡东学号:09008406程序使用说明:程序打开后会呈现出3次分形后的四面体,因为考虑到观察效果的清晰所以就用了3次分形作为演示。

与用户的交互:1键盘交互:分别按下键盘上的数字键1,2,3,4可以分别改变四面体的4个面的颜色。

按下字母c(不区别大小写)可以改变视图函数,这里循环切换3种视图函数:glOrtho,glFrustum,gluPerspective,但是改变视图函数后要窗口形状变化后才能显现出来按下字母键q(不区别大小写)可以退出程序2鼠标交互:打开后在绘图的区域按下鼠标左键不放便可以拖动图形的视角,这里为了展现图形的3D效果因此固定了其中一点不放,这样就可以看到3D的效果。

鼠标右击则有弹出菜单显示,其中改变颜色则是同时改变4个面的颜色,本程序中运用了8组配色方案。

改变视图函数也是上述的3种函数,这里的效果立刻显现,但是还有很多问题达不到所要的效果,希望老师能帮忙解决一下。

设计思路:分形算法:把四面体细分成更小的四面体,先找出其6个棱的中点并连接起来,这样就在4个顶点处各有一个小的四面体,原来四面体中剩下的部分应当去掉。

仿效二维的生成方法,我们对保留的四个小四面体进行迭代细分。

这样细分结束后通过绘制4个三角形来绘制每一个剩下的四面体。

交互的实现:键盘交互,即通过对按键的响应写上响应函数实现对视图和颜色的改变。

鼠标交互:通过对鼠标左右按键的实现:该部分只做了必要的介绍,具体实现见代码(附注释)分形算法:void tetra(GLfloat *a,GLfloat *b,GLfloat *c,GLfloat *d)函数实现的是绘制四面体并且给四个面绘上不同的颜色。

以区别开来,函数的实现细节见代码,有注释介绍。

void triangle3(GLfloat *a,GLfloat *b,GLfloat *c)函数用来绘制每个平面细分后的三角形。

其中顶点设置为3维坐标glVertex3fv(a);void divide_tetra(GLfloat *a,GLfloat *b,GLfloat *c,GLfloat *d,int m)细分四面体的函数实现。

计算机本科毕业论文PPT - 三维分形图生成算法的研究及程序实现

计算机本科毕业论文PPT - 三维分形图生成算法的研究及程序实现



2. 递归算法——生成三维图形
Visual C++环境下生成三维Sierpinski海绵及其变形的研究 1 离散的海绵 若在控制立方体生成的函数中将立方体边长统一减小, 则生成的小立方体会缩小,不能再连结起来,整个海 绵就呈离散状态。 2带锯齿的海绵 如果使生成立方体的某一个角向外延伸,不断循环后, 将会使某一侧面的许多角向外,呈锯齿状;如果凸出 较长,则呈尾巴状。 3彗星与流星 将离散的海绵与带锯齿的海绵结合, 可以生成拖着长长尾巴的彗星与流星图形。

ax 1 by 1 e x 1 ' ' ax 2 by 2 e x 2 ' ax by e 植物形态
相似变换与仿射变换 相似变换是指在各个方向上变换的比率必须相同的一种比例变换,仿 射变换是指在不同方向上变化的比率可以不同的一种比例变换。 二维仿射变换的数学表达式为:

x' ax by e x r1 cos1 r2 sin 2 x e : 或 r sin 2 y f 1 r2 cos y 1 y' cx dy f

迭代函数系统的基本思想为:在仿射变换的意义下,几何对象的局部 与整体具有自相似的结构。根据这种自相似性,从一个点或一个简单 的几何图形出发,按一定的规则迭代,一生二,二生三,三生万物, 直到生成一幅复杂的图像。最终得到的目标点集与初始点集无关,而 只取决于迭代的规则,即一组仿射变换的系数,这一图像生成系统称 为迭代函数系统。
3. IFS迭代算法——模拟三维植物形态
用拼贴法确定IFS码 利用IFS方法生成分形图的关键是找出图形所对应的IFS码。

计算机图形学_Koch雪花的分形算法实现

计算机图形学_Koch雪花的分形算法实现

Koch雪花的分形算法实现1.内容介绍分形指具有多重自相似的对象,它可以是自然存在的,也可以是人造的,树木、山川、云朵、脑电图、材料断口等都是典型的分形。

分形是图形学中一门重要的理论,是最近20多年发展起来的新学科,其中Koch雪花则是分形曲线的典型代表。

本文通过对Koch雪花算法实现的详细论述与具体代码,进而分析分形的基本思想、实现方法以及实际应用等。

2.设计思想Koch雪花的实际结构为三条Koch曲线的拼接,这三条Koch曲线分别构成正三角形的三条边即可。

因此,在此详细论述Koch曲线的设计思想。

首先绘制一条线段,假设线段长度为L,则在线段L/3处至2L/3处以L/3为边长做一个正三角形,并去掉底边。

此时该图形变为四条线段,同理对每条线段继续上述步骤即可绘制出Koch曲线。

设计中的难点在于每条线段的端点坐标较难确定,根据已知的初始线段两个端点坐标,我们通过几何三角计算出每次迭代的端点坐标并进行递归即可。

如图1所示,每点的迭代算式为(x1,y1) (x3,y3)(x5,y5)(x4,y4)(x2,y2) α60°第 1 页共9 页图1 端点坐标推导计算32113211533321215333212111()()331c o s (60)31(c o s 60c o s s in 60s in )31[())]61c o s (60)31(s in 60c o s c o s 60s in )31)()]6x x x x y y y y x x L x L x x x y y y y L y L y x x y y αααααα=-+=-+=+︒+=+︒-︒=+---=+︒+=+︒+︒=+-+-在推导出每点的坐标计算后,即可通过编程实现Koch 雪花。

在程序中,首先通过初始化定义正三角形底边的两个端点坐标,然后通过计算得出顶点坐标。

对每一条边进行Koch 曲线递归绘制,最终就可以得到Koch 雪花。

fractal02二维空间上的分形图形生成法

fractal02二维空间上的分形图形生成法

gi Di
变量:ax,ay(线段端点坐标) ls bx,by(线段端点坐标) ta cx,xy (线段端点坐标) dx,dy(线段端点坐标) ex,ey (线段端点坐标) L (线段长度) alpha (基线与水平线正 方向夹角)
5
ne to
参考书:《分形算法与程序设计》
2.2 Koch曲线的递归算法
gi Di
ls ta
ne to
参考书:《分形算法与程序设计》
2.5 分支结构分形递归算法
算法:Ramus (x,y,alpha,L,n) 标题:分支结构递归算法 分支结构 参数: PI(π值) 变量:n (递归深度) L (线段长度) x,y (线段起点坐标) x1,y1 (线段终点坐标) alpha (主干生成角度) alpha_L(左支干生成角度) alpha_R(右支干生成角度)
gi Di
ls ta
ne to
参考书:《分形算法与程序设计》
13
2.6 分形树递归算法
算法:tree (x,y,L,alpha) 标题:分形树递归算法 分形树 参数: PI(π值) A(主干生长方向) B(侧干与主干的夹角) C(主干偏转角度) s1(长度小量,控制递归深度) s2(主干与侧干之比) s3(上一级主干与下一级主干之比)
函数: plot(x1,y1) –(x2,y2) (画直线函数) sin( ) (正弦函数) cos( ) (余弦函数) sqrt( ) (开平方函数)
gi Di
ls ta
ne to
参考书:《分形算法与程序设计》
8
2.3 Sierpinski垫片的递归算法
BEGIN IF (n=1) THEN BEGIN x1=x-L/2 x01=x-L/4 y1=y+L*(sin(PI/6)/cos(PI/6))/2 y01=y+L*(sin(PI/6)/cos(PI/6))/4 x2=x+L/2 x02=x-L/4 y2=y+L*(sin(PI/6)/cos(PI/6))/2 y02=y+L*(sin(PI/6)/cos(PI/6))/4 x3=x x03=x y3=y-L*(sin(PI/6)/cos(PI/6)) y03=y- L*(sin(PI/6)/cos(PI/6))/2 plot(x1,y1)-(x1,y1) Sierpinski(x01,y01,L/2,n-1) plot(x2,y2)-(x2,y2) Sierpinski(x02,y02,L/2,n-1) plot(x3,y3)-(x3,y3) Sierpinski(x03,y03,L/2,n-1) END END ELSE 9 参考书:《分形算法与程序设计》 END BEGIN

计算机本科毕业论文全文 - 三维分形图生成算法的研究及程序实现

计算机本科毕业论文全文 - 三维分形图生成算法的研究及程序实现

中文摘要本文主要研究三维分形图的生成技术。

首先探讨了原理简单的递归算法,该算法适于生成各种三维图形。

分析了二维与三维分形递归算法的主要步骤、部分实现代码并在此基础上生成了三维图和图的变形。

接着讨论了迭代函数系统(IFS)的原理及相关算法,分析了IFS码的获取方法以及各IFS码在图像生成中的地位和作用。

重点研究二维的IFS算法如何扩展到三维,介绍了生成三维植物分形图的算法思路和主要步骤。

最后还介绍了能逼真再现山和云等自然景物的随机中点位移算法和分形插值算法。

关键词:分形图形学,递归算法,IFS迭代函数系统,随机中点位移算法,分形插值算法。

ABSTRACTThis thesis does research on three-dimensional fractal graphics.At first, it probes into Recursion Arithmetic, which has very simple principle but is able to create all kinds of three-dimensional graphics. It analyses the main steps of two-dimensional and three-dimensional fractal Recursion Arithmetic, part of the program and some ameliorations of the graphics.Then it discusses the principle and the related arithmetic for Iteration Function System (IFS). It analyses the ways that how to get IFS codes and their status and function in fractal graphics. It pays attention to the research on how to make two-dimensional IFS Arithmetic expand to three-dimensional IFS Arithmetic. It introduces the arithmetic and main steps of creating three-dimensional foliage fractal graphics.At last, it introduces Stochastic Midpoint Displacement Arithmetic and Detached Data Input Arithmetic, which can simulate scenery very naturally.Keywords: Fractal graphics, Recursion Arithmetic, Iteration Function System (IFS), Stochastic Midpoint Displacement Arithmetic, Detached Data Input Arithmetic.目录1. 绪论1.1引言 (1)1.2分形图形学简介 (1)1.3研究意义 (3)1.4研究背景 (4)1.5本文工作 (5)2. 递归算法——生成三维图形2.1自相似性 (6)2.2递归原理 (6)2.3二维中Sierpinski地毯的递归算法 (7)2.4三维中Sierpinski海绵的递归算法 (8)2.5 Visual C++环境下生成三维Sierpinski海绵及其变形的研究 (11)3. IFS迭代算法——模拟三维植物形态3.1相似变换与仿射变换 (12)3.2用拼贴法确定IFS码 (13)3.3 二维IFS迭代算法得到植物形态 (15)3.4三维IFS迭代算法逼真模拟植物形态 (17)3.5 二维IFS迭代与三维IFS迭代的比较 (20)4. 其它三维分形算法——逼真再现山和云4.1随机中点位移算法实现三维分形 (20)4.2分形插值算法实现三维分形 (23)5.结论5.1工作总结 (26)5.2有待改进之处 (26)附录 (28)参考文献 (34)三维分形图生成算法的研究及程序实现1. 绪论1.1 引言事实上,无论从美学的观点还是从科学的观点,许多人在第一次见到分形时都有新的感受。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六分形图的生成
班级信计二班学号 20080502066 姓名陈铁映分数
一、实验目的和要求:
1、掌握希尔宾斯基三角形和Julia Set (茱莉亚集)的基本原理。

2、熟悉两个图形的生成算法。

3、掌握希尔宾斯基三角形和和Julia Set (茱莉亚集)的绘制.。

4、提高分形图形生成的理解应用能力。

二、实验内容:
1、对于第一个图形在平面内随机的设置种子,并由此而设定三角形的三个顶点。

形成初始化模式后,绘制三万个点,使规则传递下去。

2、对于第二个图形则运用逃逸时间法后设定一个常数c的值。

3、对两图形分别进行分析对比其局部与整体的自相似性。

三、实验结果分析:
1、该程序实现了递归算法和逃逸时间法的图形绘制
2、比较每一小部分与整体的关系:
图形的层次是无限的、分形往往可以从局部“看出”整体、虽然看上
去十分复杂,但其背后的规则却是相当简单。

四、程序代码:
1、希尔宾斯基三角形为:
#include <graphics.h>
#include <conio.h>
#include <time.h>
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++)
{
n = rand() % 3;
p.x = (p.x + P[n].x) / 2;
p.y = (p.y + P[n].y) / 2;
putpixel(p.x, p.y, GREEN);
}
// 按任意键退出
getch();
closegraph();
}
运行结果为:
2、Julia Set (茱莉亚集)的程序代码为:
#include <graphics.h>
#include <conio.h>
// 定义复数及乘、加运算
// 定义复数
struct COMPLEX
{
double re;
double im;
};
// 定义复数“乘”运算
COMPLEX operator * (COMPLEX a, COMPLEX b) {
COMPLEX c;
c.re = a.re * b.re - a.im * b.im;
c.im = a.im * b.re + a.re * b.im;
return c;
}
// 定义复数“加”运算
COMPLEX operator + (COMPLEX a, COMPLEX b)
{
COMPLEX c;
c.re = a.re + b.re;
c.im = a.im + b.im;
return c;
}
// 主函数
void main()
{
// 初始化绘图窗口
initgraph(640, 480);
// 绘制Julia Set (茱莉亚集)
COMPLEX z, c;
c.re = -0.75, c.im = 0; // 设置迭代初值
int x, y, k; // 定义循环变量
for(x = 0; x < 640; x++)
{。

相关文档
最新文档