分形图_Visual C++简单步骤
- 格式:pdf
- 大小:1.22 MB
- 文档页数:8
实验六分形图的生成班级 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();}程序截图:四、实验结果分析分形的对称性即表现了传统几何的上下、左右及中心对称。
实验1 Visual C++图形程序设计一、实验目的Visual C++是在Microsoft C的基础上发展而来的,随着计算机软、硬件技术的快速发展,如今Visual C++已成为集编辑、编译、运行、调试于一体功能强大的集成编程环境。
本章以Visual C++ 6.0为对象,主要介绍Visual C++集成编成环境的使用、图形设备接口和常用图形程序设计、鼠标编程以及菜单设计等基础,目的是通过对Visual C++的学习,掌握Visual C++图形程序设计的方法,为计算机图形学原理部分的算法实现提供程序工具和方法。
二、实验任务1.学习Visual C++图形程序设计的方法;2.掌握Visual C++集成编成环境的使用、图形设备接口和常用图形程序设计、鼠标编程、橡皮筋交互技术、画刷与画笔以及菜单设计等;三、基础知识和实验步骤3.1 Visual C++ 6.0应用程序开发方法介绍Visual C++ 6.0集成开发环境,以一个简单的实例介绍利用Visual C++应用程序工程建立方法和程序设计框架。
3.1.1 Visual C++的集成开发环境从开始菜单中启动Visual C++ 6.0,进入开发集成环境。
打开一个项目后,可以看到Visual C++ 6.0的开发环境由标题栏、工具栏、工作区窗口、源代码编辑窗口、输出窗口和状态栏组成,见图3.1所示。
标题栏用于显示应用程序名和所打开的文件名,标题栏的颜色可以表明对应窗口是否被激活。
菜单栏包括文件、编辑、显示、插入、工程、编译、工具、窗口和帮助九项主菜单,包含了从源代码的编辑、界面设计、程序调试和编译运行在内的所有功能。
工具栏列出了常用的菜单命令功能和对象方法。
工具栏的下面是两个窗口,一个是工作区窗口,用于列出工程中的各种对象,一个是源代码编辑窗口,用于各个对象的程序设计。
输出窗口显示项目建立过程中所产生的各种信息。
屏幕底端是状态栏,它给出当前操作或所选择命令的提示信息。
实验报告实验名称:三维分形算法姓名:陈怡东学号: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)细分四面体的函数实现。
分形图案分形图是一种较为流行的艺术图形。
所谓分形,就是指组成部分与整体以某种方式相似,局部放大后可以在某种程度上再现整体,如图25所示,为一颗树的分形图,该树是由一些分支构成的,就其中某个分支来看,它具有与整颗树相似的形状。
绘制的原则是,先按某一方向画一条直线,然后在此线段上找到一系列节点,在每一个节点处向左、右偏转60度各画一条分支。
节点位置和节点处所画分支的长度比值按0.618分割。
/*分形图案1 QW41.C*/#define g 0.618#define PAI 3.14#include <graphics.h>#include<math.h>#include<stdio.h>#include<conio.h>float thita=60.0;void grow(int x,int y,float lenth,float fai);void main(){int gm,gd;detectgraph(&gd,&gm);initgraph(&gd,&gm,"\\tc\\bgi");grow(300,300,280.0,90.0);getch();closegraph();}void grow(int x,int y,float lenth,float fai){int x1,y1;int nx,ny,count;float nlenth;x1=x+lenth*cos(fai*PAI/180.0);y1=y-lenth*sin(fai*PAI/180.0);line(x,y,x1,y1);if(lenth<10)return;nlenth=lenth;nx=x;ny=y;for(count=0;count<7;count++){nx=nx+nlenth*(1-g)*cos(fai*PAI/180.0);ny=ny-nlenth*(1-g)*sin(fai*PAI/180.0);grow(nx,ny,nlenth*(1-g),fai+thita);grow(nx,ny,nlenth*(1-g),fai-thita);nlenth*=g;}}运行结果如下:------------------------------------------------------------------------------------2、分形图案2此例中也是一个分形图案。
分形图形生成原理探究随着计算机技术的不断发展,分形图形在数字艺术、自然科学和工程领域中得到广泛应用。
分形是一种具有自相似性质的数学对象,其生成原理深受人们的关注。
本文将探究分形图形的生成原理,介绍分形的基本概念,以及常用的分形生成算法。
一、分形的基本概念分形是一种具有自相似性质的几何图形。
即整体结构和局部细节之间存在某种相似关系,不论放大还是缩小,都可以看到相同的图形。
分形的自相似性质使得它们具有无限的细节和复杂度。
二、分形图形的生成原理1. 迭代运算迭代运算是生成分形图形的常用方法之一。
这种方法通过重复应用某种变换或映射规则,不断生成新的图形。
具体步骤如下:- 首先选定一个初始图形,例如一个简单的线段或几何形状。
- 然后根据一定的规则进行变换或映射操作,生成下一级的图形。
- 重复上述步骤,直到达到期望的分形效果。
迭代运算可以产生各种各样的分形图形,如科赫曲线、谢尔宾斯基三角形等。
2. 噪声函数噪声函数是通过随机性来生成分形图形的一种方法。
噪声函数可以产生随机性纹理或图案,并通过适当的参数调节,实现分形效果。
生成分形图形的基本步骤如下:- 首先定义一个噪声函数,它可以是简单的随机数生成器或更复杂的数学函数。
- 然后使用噪声函数来计算每个像素的数值或颜色,从而生成图像。
噪声函数可以用于生成山脉、云彩等具有分形特征的自然图像。
三、常用的分形生成算法1. 递归细分递归细分是一种通过使用分形规则进行逐级细分的方法。
它基于拆分和替代的原则,不断将图形细分为更小的部分,然后用更小的部分替代原有的部分。
递归细分可以生成多种复杂的分形图形,如分形树、雪花等。
2. 碎形图像编码碎形图像编码是一种基于碎形压缩理论的分形生成方法。
它通过找到一组变换规则和关联函数,将整个图像分割成小的区域,然后用适当的变换规则对每个区域进行编码。
这种方法可以生成高质量的分形图像,并用较小的存储空间保存。
3. 分形几何建模分形几何建模是一种通过将分形规则应用于三维空间中的几何体来生成分形图形的方法。