基于L系统的曲线图案设计及应用_第1页
基于L系统的曲线图案设计及应用_第2页
基于L系统的曲线图案设计及应用_第3页
基于L系统的曲线图案设计及应用_第4页
基于L系统的曲线图案设计及应用_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于L系统的曲线图案设计及应用一、 实验要求采掌握L系统用于图形设计的基本方法,认识并具体实现FASS曲线在图象信息隐藏中的应用。二、 实验环境说明本实验使用的是Visual C+ 6.0为编程环境,在此环境下通过MCF可视化编程来实现对所绘制图形的显示。三、 算法与数据结构在实验中采用了LS递归生成语法来对多种分形图形的绘制。该文法通过用字母表和符号串来表达生成对象的初始形式,然后将初始形式的每个字符依次替换成为新的字符形式,在经过多次的替换重写之后生成最终图形。实验中所采用的二维LS文法具有以下字母表(1)F:以当前方向前进一步,并画线(2)f:以当前方向前进一步,不画线(3):逆时针旋转

2、dº(4):顺时针旋转dº(5):将当前信息压栈(6):将“”时刻的信息出栈在程序中重新定义了一个新类CMywnd用于绘制图形式。程序通过CString对象来存放图形的初始状态和各种替代规则。程序中共建立两个容器对象letter和rule分别字母和对应的替换规则。CString对象start则存放图形的开始字母。整个程序中CMywnd:Draw(CDC *dc)包含了替代和图形绘制的全过程,函数代码如下:void CMywnd:Draw(CDC *dc)CStringtemp;CRect rect;GetClientRect(&rect);stack<doub

3、le> stack;double step=father->m_step/double(5);if(step<=0)return;doublex,y;/定义初始状态double currenta=pi/double(2);/初始角度CPointptemp;x=rect.left+int(double(rect.Width()*double(father->m_x)/double(100);/初始水平位置y=rect.bottom-int(double(rect.Height()*double(father->m_y)/double(100);/初始竖直位置dc-&

4、gt;MoveTo(x,y);temp=start;CString R;/进行替换操作for(int i=1;i<=father->m_time;i+)int n;CString newtemp;for(int j=0;j<temp.GetLength();j+)n=0;for(vector<CString>:iterator itor=letter.begin();itor!=letter.end();itor+)if(tempj=*itor)newtemp+=rulen;break;n+;if(itor=letter.end()newtemp+=tempj;t

5、emp=newtemp;/搜索最终形的字母串并对图形进行绘制for(i=0;i<temp.GetLength();i+)/switch语句用于按照语言中的字母表进行相应的操作switch(tempi)case '+':/currenta+=angel;break;case '-':currenta-=angel;break;case '':stack.push(x);stack.push(y);stack.push(currenta);break;case '':currenta=stack.top();stack.pop(

6、);y=stack.top();stack.pop();x=stack.top();stack.pop();dc->MoveTo(x,y);break;case 'F':x+=step*cos(currenta);y-=step*sin(currenta);dc->LineTo(x,y);break;在程序中将图形的初始状态与规则单独以图形库的形式存放在文档“规则文档.txt”中,文档格式如下:#3/#号跟上数字表示序号便于搜索60/规则中角度dF-FF/初始状态F=F-F+F-F/替换规则!Koth反雪花/符号!表示其后字符为图形名字在运行程序开始时则对文档进行读

7、取到CString对象filedata中,用户在对列表框进行选择后,程序开始搜索filedata中提取出图形相应的初始状态和规则。并调用CMywnd:Draw进行绘制图形。文档读取代码如下:fstream infile("规则文档.txt",ios:in);char ch;int i=0;while(infile.get(ch)filedata.Insert(i+,ch);搜索filedata对象以获得相应的规则代码如下:CString index('#');int n=filedata.Find(index+NumToString(nIndex+1);/n

8、为选择列表框后返回的序号while(filedatan+!='n');int num=0;while(filedatan!='n')num=num*10+(filedatan+-'0');son->angel=double(num)/double(180)*pi;n+;son->start.Empty();while(filedatan!='n')son->start+=filedatan+;CString temp;n+;son->rule.clear();son->letter.clear();w

9、hile(filedatan!='!')temp.Empty();temp=filedatan;son->letter.push_back(temp);n+=2;temp.Empty();while(filedatan!='n'&&filedatan!='!')temp+=filedatan+;son->rule.push_back(temp);n+;程序提供界面允许用户输入L系统代码,由程序绘制图形。只需在相应的文本框中填入规则与初始状态,点击绘图即可进行绘图。程序中还支持用户进行手动绘制,在程序中使用vector类

10、nodelist来存放用户的各结点,同时还生成了一个用二维数组K表示的无向图。其中Kij表示第i个点与第j个点之间有连线,其值为该直线与水平线的夹角。使用图深度优先探索算法生成相应的规则,依次访问的两条连的旋转角度可以通过查询数组K中得到。规则生成函数代码如下:CString CMywnd:Createrule()CPoint a=nodelist1-nodelist0;if(a.y<=0)stard*=-1;return Scan(stard,0);CString CMywnd:Scan(double d, int n)CString tempr;int x=0;/确定有几条边与该点相

11、连for(int i=n+1;i<nodelist.size();i+)if(kni!=-9999)x+;for(i=n+1;i<nodelist.size();i+)if(kni!=-9999)if(x>1)tempr+=""double degree=kni-d;if(degree>pi)degree-=double(2)*pi;if(degree<-pi)degree+=double(2)*pi;int num=0;while(true)double tempd=degree;if(tempd<0)tempd=-tempd;if(tempd-double(num)*pi/double(3)<(pi/double(6)break;num+;for(double m=0;m<abs(num);m+=1)if(degree>0)tempr+="+"elsetempr+="-"tempr+="F"tempr+=Scan(kni,i);if(x>1)tempr+=""x-;return tempr;生成规则后将规则自动放入用户输入规则框中,设置好初始代码与角度后即可进行绘图。四、 使用说明运行程序后,先在下拉框中选择所要绘制

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论