您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 计算机图形学实验一报告
计算机科学与通信工程学院实验报告课程计算机图形学实验题目二维图形绘制学生姓名学号专业班级指导教师日期成绩评定表评价内容具体内容权重得分论证分析方案论证与综合分析的正确、合理性20%算法设计算法描述的正确性与可读性20%编码实现源代码正确性与可读性30%程序书写规范标识符定义规范,程序书写风格规范20%报告质量报告清晰,提交准时10%总分指导教师签名二维图形的绘制1.实验内容(1)绘制金刚石图案金刚石图案的成图规则是:把一个圆周等分成n份,然后每两点之间连线。当n取奇数时,该图案可一笔连续绘成,即用MoveTo函数确定一个当前点,然后连续用LineTo函数连点成线。请设计连线规则并编程实现。(2)绘制魔术三角形绘制下图所示的魔术三角形图案,采用三种可明显区分的颜色填充。(3)绘制递归圆应用递归的方法绘制如下所示的图案。2.实验环境软硬件运行环境:WindowsXP开发工具:visualstudio20083.问题分析根据实验需求,需要在MFC环境中建立一个由“文件”、“绘图”和“帮助”这3个菜单项目组成的菜单,其中“文件”的子菜单为“退出”,完成退出应用程序的工作,“绘图”,的子菜单为“Diamond”,用于绘制金刚石图案等,“帮助”的子菜单为“关于”,用于显示开发人员信息;定义一个输人对话框类,提供个两个参数的输入界面。最后在客户区输出图案。1.金刚石图案:为把一个半径为300的圆,等分绘制金刚石图案;设计该算法为避免直线段的重复连接,需设计一个二重循环,代表起点索引号的外层整型变量i从i=0循环到i=n-2,代表终点索引号的内层整型变量j从j=i+1循环到j=n-1。以(p[i].x,p[i].y)为起点,以(p[j].x,p[j].y)为终点依次连接各线段形成金刚石图案。金刚石有两种画法:(1)每隔两个顶点连线直至回到原起点,再将下一个点作为新的原起点。(2)每个点与其余点都连线直至全部连玩,再将隔一个点之后的点作为新的原起点。2.魔术三角形:先绘制三角形图形,再随机在三个图形中填色。3.递归圆:先确定首个圆的中心点坐标和半径与其周围八个小圆的中心点坐标和半径,再根据递归的深度再算出递归后圆的半径,并计算出它们的圆中心点坐标。设计一个二重循环,代表起点的外层循环从i=0循环到i=n-2,代表终点的内层循环从j=i+1循环到j=n-1。以p[i].x,p[i].y作为起点,以p[j].x,p[j].y作为终点绘制连接线。4.算法设计//DiamondView.hclassCDiamondView:publicCView{……public://参数输入和提示对话框CDlgDiamonddlgDiamond;//金刚石绘制中的参数输入对话框CDlgCircledlgCircle;//递归圆绘制中的参数输入对话框CDlgBezierdlgBezier;//Bezier曲线绘制中的参数输入对话框CDlgBdlgB;//B样条曲线绘制中的参数输入对话框CDlgHintdlgHint;//裁剪中的提示对话框//用于裁剪时的裁剪窗口绘制的控制BOOLIsCutting;BOOLIsDrawing;//裁剪窗口的左上角和右下角坐标POINTRectP1;//左上角坐标POINTRectP2;//右下角坐标//绘图函数,需要实现voidDrawDiamond(int,int,int);//绘制金刚石voidDrawTriangle();//绘制魔术三角voidDrawRecursionCircle(int);//绘制递归圆voidPolaris();//北极星voidDrawBezier1(POINTp[4]);//已知点作为控制点绘制Bezier曲线voidDrawBezier2(POINTp[4]);//已知点作为曲线上的点绘制Bezier曲线voidDrawBCurve(POINTp[6]);//绘制B样条曲线voidCut();//裁剪……};//DiamondView.cppvoidCDiamondView::OnMenuDiamond(){IsCutting=FALSE;if(dlgDiamond.DoModal()==IDOK)DrawDiamond(dlgDiamond.m_nVertex,dlgDiamond.m_nRadius,100);//调用绘制金刚石的函数}//绘制金刚石图案//nVertex:顶点数,radius:圆半径,millisecond:笔画之间的延迟时间voidCDiamondView::DrawDiamond(intnVertex,intradius,intmillisecond){}voidCDiamondView::OnMenuTriangle(){IsCutting=FALSE;DrawTriangle();//调用绘制魔术三角的函数}//绘制魔术三角voidCDiamondView::DrawTriangle(){}voidCDiamondView::OnMenuCircle(){IsCutting=FALSE;if(dlgCircle.DoModal()==IDOK)DrawRecursionCircle(dlgCircle.m_nDepth);//调用绘制递归圆的函数}//绘制递归圆//nDepth:递归深度voidCDiamondView::DrawRecursionCircle(intnDepth){}5.源代码//绘制金刚石图案//nVertex:顶点数,radius:圆半径,millisecond:笔画之间的延迟时间intCDiamondView::MaxX(){CRectRect;GetClientRect(&Rect);returnRect.right;}intCDiamondView::MaxY(){CRectRect;GetClientRect(&Rect);returnRect.bottom;}voidCDiamondView::DrawDiamond(intnVertex,intradius,intmillisecond){InvalidateRgn(NULL);UpdateWindow();Sleep(100);CDC*pDC=GetDC();CRectrect;GetClientRect(&rect);CBrushbr(RGB(0,0,0));pDC-FillRect(&rect,&br);CPennewPen(PS_SOLID,1,RGB(255,0,0));CPen*OldPen=pDC-SelectObject(&newPen);doubleThta=2*PI/nVertex;double*x=newdouble[nVertex];double*y=newdouble[nVertex];for(inti=0;inVertex;i++){x[i]=radius*cos(i*Thta)+MaxX()/2;y[i]=radius*sin(i*Thta)+MaxY()/2;}if(nVertex%2==0){for(inti=0;i=nVertex-2;i++){for(intj=i+1;j=nVertex-1;j++){pDC-MoveTo(Round(x[i]),Round(y[i]));pDC-LineTo(Round(x[j]),Round(y[j]));Sleep(millisecond);}}}else{intj=0;intk;for(inti=0;inVertex;i++){k=0;while(knVertex/2){k++;j=j+k;pDC-MoveTo(Round(x[(j-k)%nVertex]),Round(y[(j-k)%nVertex]));pDC-LineTo(Round(x[j%nVertex]),Round(y[j%nVertex]));Sleep(millisecond);}}}pDC-SelectObject(OldPen);}//绘制魔术三角voidCDiamondView::DrawTriangle(){InvalidateRgn(NULL);UpdateWindow();CDC*pDC=GetDC();intcolour[3]={RGB(255,0,0),RGB(0,0,255),RGB(0,255,0)};for(intn=0;n20;n++){CBrushnewBrush,*oldBrush;newBrush.CreateSolidBrush(colour[n%3]);POINTvertex1[6]={{610,66},{355,505},{762,505},{714,420},{508,420},{710,66}};CRgnRgn1,Rgn2,Rgn3;Rgn1.CreatePolygonRgn(vertex1,6,WINDING);oldBrush=pDC-SelectObject(&newBrush);pDC-FillRgn(&Rgn1,&newBrush);Sleep(100);pDC-SelectObject(oldBrush);newBrush.DeleteObject();newBrush.CreateSolidBrush(colour[(n+1)%3]);POINTvertex3[6]={{355,505},{405,594},{916,595},{710,240},{660,330},{762,505}};Rgn3.CreatePolygonRgn(vertex3,6,WINDING);oldBrush=pDC-SelectObject(&newBrush);pDC-FillRgn(&Rgn3,&newBrush);Sleep(100);pDC-SelectObject(oldBrush);newBrush.DeleteObject();pDC-SelectObject(oldBrush);newBrush.CreateSolidBrush(colour[(n+2)%3]);POINTvertex2[6]={{710,66},{508,420},{612,420},{710,240},{916,594},{968,505}};Rgn2.CreatePolygonRgn(vertex2,6,WINDING);oldBrush=pDC-SelectObject(&newBrush);pDC-FillRgn(&Rgn2,&newBrush);Sleep(100);}}//绘制递归圆//nDepth:递归深度voidCDiamondView::DrawRecursionCircle(intnDepth){InvalidateRgn(NULL);UpdateWindow();doubler=100;CDC*pDC=GetDC();CPennewPen,*oldPen;newPen.CreatePen(PS_SOLID,1,RGB(255,0,0));oldPen=pDC-SelectObject(&newPen);CRectrect(Round(MaxX()/2-r),Round(MaxY()/2-r),Round(MaxX()/2+r),Round(MaxY()/2+r));pDC-Ellipse(&rect);intx0=MaxX()/2;inty0=MaxY()/2;DrawRecursionCircle1(x0,y0,r,nDepth);}voidCDiamondView::DrawRecursionCircle1(intx,inty,doubler,intnDepth){intx1[8],y1[8];doublet=2*PI/8;CDC*pDC=GetDC();CPennewPen,*oldPen;newPen.CreatePen(PS_SOLID,1,RGB(255,0,0));oldPen=pDC-SelectObject(&newP
本文标题:计算机图形学实验一报告
链接地址:https://www.777doc.com/doc-5131229 .html