计算机图形学实验一报告_第1页
计算机图形学实验一报告_第2页
计算机图形学实验一报告_第3页
计算机图形学实验一报告_第4页
计算机图形学实验一报告_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、1 / 12 计算机科学与通信工程学院实验报告课程计算机图形学实验题目二维图形绘制学生学号专业班级指导教师日期成绩评定表2 / 12 评价容具体容权重得分论证分析方案论证与综合分析的正确、合理性20% 算法设计算法描述的正确性与可读性20% 编码实现源代码正确性与可读性30% 程序书写规标识符定义规,程序书写风格规20% 报告质量报告清晰,提交准时10% 总分指导教师签名二维图形的绘制1. 实验容1绘制金刚石图案金刚石图案的成图规那么是:把一个圆周等分成 n份,然后每两点之间连线。当 n取奇数时,该图案可一笔连续绘成,即用 moveto 函数确定一个当前点,然后连续用 lineto 函数连点成

2、线。请设计连线规那么并编程实现。2绘制魔术三角形绘制下列图所示的魔术三角形图案 ,采用三种可明显区分的颜色填充。3绘制递归圆应用递归的方法绘制如下所示的图案。2. 实验环境3 / 12 软硬件运行环境:windows xp 开发工具:visual studio 2008 3. 问题分析根据实验需求,需要在mfc 环境中建立一个由“文件、“绘图和“帮助这3个菜单项目组成的菜单, 其中“文件的子菜单为 “退出,完成退出应用程序的工作,“绘图,的子菜单为“ diamond ,用于绘制金刚石图案等, “帮助的子菜单为 “关于,用于显示开发人员信息;定义一个输人对话框类,提供个两个参数的输入界面。最后在

3、客户区输出图案。1.金刚石图案:为把一个半径为 300 的圆,等分绘制金刚石图案;设计该算法为防止直线段的重复连接,需设计一个二重循环,代表起点索引号的外层整型变量 i 从 i=0 循环到 i=n-2 ,代表终点索引号的层整型变量 j从 j=i+1循环到 j=n-1 。以pi.x,pi.y为起点,以pj.x,pj.y为终点依次连接各线段形成金刚石图案。金刚石有两种画法:1每隔两个顶点连线直至回到原起点,再将下一个点作为新的原起点。2每个点与其余点都连线直至全部连玩,再将隔一个点之后的点作为新的原起点。2.魔术三角形:先绘制三角形图形,再随机在三个图形中填色。3.递归圆:先确定首个圆的中心点坐标

4、和半径与其周围八个小圆的中心点坐标和半径,再根据递归的深度再算出递归后圆的半径,并计算出它们的圆中心点坐标。设计一个二重循环,代表起点的外层循环从i 0 循环到 i n-2,代表终点的层循环从 j i+1 循环到 j=n-1 。以 pi.x,pi.y作为起点,以 pj.x,pj.y作为终点绘制连接线。4. 算法设计/diamondview.h class cdiamondview : public cview public: / 参数输入和提示对话框cdlgdiamond dlgdiamond;/ 金刚石绘制中的参数输入对话框4 / 12 cdlgcircle dlgcircle;/递归圆绘制

5、中的参数输入对话框cdlgbezier dlgbezier;/bezier曲线绘制中的参数输入对话框cdlgb dlgb;/b 样条曲线绘制中的参数输入对话框cdlghint dlghint;/裁剪中的提示对话框/ 用于裁剪时的裁剪窗口绘制的控制bool iscutting; bool isdrawing; / 裁剪窗口的左上角和右下角坐标point rectp1;/ 左上角坐标point rectp2;/ 右下角坐标 /绘图函数,需要实现 void drawdiamond(int,int,int);/绘制金刚石 void drawtriangle();/绘制魔术三角 void drawrec

6、ursioncircle(int);/绘制递归圆 void polaris();/北极星 void drawbezier1(point p4);/点作为控制点绘制 bezier 曲线 void drawbezier2(point p4);/点作为曲线上的点绘制 bezier 曲线void drawbcurve(point p6);/绘制 b样条曲线 void cut();/裁剪; /diamondview.cpp void cdiamondview:onmenudiamond() iscutting = false; if(dlgdiamond.domodal()=idok) drawdiam

7、ond(dlgdiamond.m_nvertex,dlgdiamond. m_nradius,100);/调用绘制金刚石的函数 / 绘制金刚石图案/nvertex:顶点数,radius: 圆半径,millisecond:笔画之间的延迟时间void cdiamondview:drawdiamond(int nvertex, int radius,int millisecond) 5 / 12 void cdiamondview:onmenutriangle() iscutting = false; drawtriangle();/调用绘制魔术三角的函数 / 绘制魔术三角void cdiamond

8、view:drawtriangle() void cdiamondview:onmenucircle() iscutting = false; if(dlgcircle.domodal()=idok) drawrecursioncircle(dlgcircle.m_ndepth);/调用绘制递归圆的函数 / 绘制递归圆/ndepth: 递归深度void cdiamondview:drawrecursioncircle(int ndepth) 5. 源代码/ 绘制金刚石图案/nvertex:顶点数,radius: 圆半径,millisecond:笔画之间的延迟时间int cdiamondview

9、:maxx() crect rect; getclientrect(&rect); return rect.right; int cdiamondview:maxy() crect rect; getclientrect(&rect); return rect.bottom; void cdiamondview:drawdiamond(int nvertex, int radius,int millisecond) invalidatergn(null); updatewindow(); 6 / 12 sleep(100); cdc *pdc=getdc(); crect re

10、ct; getclientrect(&rect); cbrush br(rgb(0,0,0); pdc-fillrect(&rect,&br); cpen newpen(ps_solid,1,rgb(255,0,0); cpen *oldpen=pdc-selectobject(&newpen); double thta = 2*pi/nvertex; double *x = new doublenvertex; double *y = new doublenvertex; for(int i=0;invertex;i+) xi=radius*cos(i*tht

11、a)+maxx()/2; yi=radius*sin(i*thta)+maxy()/2; if(nvertex%2=0) for(int i=0;i=nvertex-2;i+) for(int j=i+1;jmoveto(round(xi),round(yi); pdc-lineto(round(xj),round(yj); sleep(millisecond); else int j = 0; int k; for (int i = 0; i nvertex; i+) k = 0; while (k moveto(round(x(j-k)%nvertex),round(y(j-k)%nver

12、tex); pdc-lineto(round(xj%nvertex),round(yj%nvertex); sleep(millisecond); pdc-selectobject(oldpen); / 绘制魔术三角void cdiamondview:drawtriangle() invalidatergn(null); updatewindow(); cdc *pdc = getdc(); int colour3=rgb(255,0,0),rgb(0,0,255),rgb(0,255,0); for(int n=0;nselectobject(&newbrush); pdc-fill

13、rgn(&rgn1,&newbrush); sleep(100); pdc-selectobject(oldbrush); 8 / 12 newbrush.deleteobject(); newbrush.createsolidbrush(colour(n+1)%3); point vertex36 = 355,505,405,594,916,595,710,240,660,330,762,505; rgn3.createpolygonrgn(vertex3, 6, winding); oldbrush = pdc-selectobject(&newbrush); pd

14、c-fillrgn(&rgn3,&newbrush); sleep(100); pdc-selectobject(oldbrush); newbrush.deleteobject(); pdc-selectobject(oldbrush); newbrush.createsolidbrush(colour(n+2)%3); point vertex26 = 710,66,508,420,612,420,710,240,916,594,968,505; rgn2.createpolygonrgn(vertex2, 6, winding); oldbrush = pdc-selec

15、tobject(&newbrush); pdc-fillrgn(&rgn2,&newbrush); sleep(100); / 绘制递归圆/ndepth: 递归深度void cdiamondview:drawrecursioncircle(int ndepth) invalidatergn(null); updatewindow(); double r=100; cdc *pdc = getdc(); cpen newpen,*oldpen; newpen.createpen(ps_solid,1,rgb(255,0,0); 9 / 12 oldpen = pdc-se

16、lectobject(&newpen); crect rect(round(maxx()/2-r),round(maxy()/2-r),round(maxx()/2+r),round(maxy()/2+r); pdc-ellipse(&rect); int x0=maxx()/2; int y0=maxy()/2; drawrecursioncircle1(x0,y0,r,ndepth); void cdiamondview:drawrecursioncircle1(int x,int y,double r,int ndepth) int x18,y18 ; double t=2*pi/8; cdc *pdc = getdc(); cpen newpen,*oldpen; newpen.createpen(ps_solid,1,rgb(255,0,0); oldpen = pdc-selectobject(&newpen); if(ndepth0) ndepth-; for(int i=0;i8;i+) x1i=round(x+2*r*cos(i*t); y1i=round(y+2*r*sin(i*t); for(int i=0;iellipse(&rect); 10 / 12 sl

温馨提示

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

评论

0/150

提交评论