您好,欢迎访问三七文档
计算机科学与通信工程学院实验报告课程计算机图形学实验题目二维图形的绘制学生姓名潘冰学号3160602036专业班级计算机1602指导教师王新宇日期2019.04.08成绩评定表评价内容具体内容权重得分论证分析方案论证与综合分析的正确、合理性20%算法设计算法描述的正确性与可读性20%编码实现源代码正确性与可读性30%程序书写规范标识符定义规范,程序书写风格规范20%报告质量报告清晰,提交准时10%总分指导教师签名实验一二维图形绘制1.实验内容1.1绘制金刚石图案金刚石图案的成图规则是:把一个圆周等分成n份,然后每两点之间连线。当n取奇数时,该图案可一笔连续绘成,即用MoveTo函数确定一个当前点,然后连续用LineTo函数连点成线。请设计连线规则并编程实现。图1金刚石图案示例1.2绘制魔术三角形绘制下图所示的魔术三角形图案,采用三种可明显区分的颜色填充。图2魔术三角形图案示例1.3绘制递归圆应用递归的方法绘制如下所示的图案。图3递归圆图案示例2.实验环境软硬件运行环境:Windows10开发工具:Visualstudio20133.问题分析3.1绘制金刚石图案把一个圆周等分成n份,然后每两点之间连线。当n取奇数时,该图案可一笔连续绘成,当n取偶数时,需要变化直线段起点位置。n为偶数时,为避免直线段的重复连接,需设计一个二重循环:代表起点索引号的外层整型变量i从i=0循环到i=n-2(n-1次),代表终点索引号的内层整型变量j从j=i+1循环到j=n-1(n-i-1次)。以(Round(x[i]),Round(y[i]))为起点,以(Round(x[j]),Round(y[j]))为终点依次连接各线段形成金刚石图案。n为奇数时,代表循环次数的整型变量i从0到n-1(n次),从当前起点(Round(x[(j-k)%nVertex]),Round(y[(j-k)%nVertex]))开始隔0个点画一条线,隔一个点画一条线,......,直至隔n/2-1个点画线为止。即可得到一笔画的金刚石图案。3.2绘制魔术三角形用画刷绘制一个三角形区域,并对三个绘图区域进行颜色填充,构成魔术三角形。3.3绘制递归圆确定内圆的中心点坐标和半径与其周围小圆的中心点坐标和半径,再根据递归的深度再算出递归后圆的半径,并计算出它们的圆中心点坐标。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.源代码#definePI3.1415926//PI的宏定义#defineRound(d)int(floor(d+0.5))//四舍五入宏定义intCDiamondView::MaxX(){CRectRect;GetClientRect(&Rect);returnRect.right;//指定矩形框右下角的x坐标}intCDiamondView::MaxY(){CRectRect;GetClientRect(&Rect);returnRect.bottom;//指定矩形右下角的y坐标}//绘制金刚石图案//nVertex:顶点数,radius:圆半径,millisecond:笔画之间的延迟时间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,*pOldPen;//定义画笔NewPen.CreatePen(PS_SOLID,1,RGB(0,50,200));//创建画笔pOldPen=pDC-SelectObject(&NewPen);//将画笔选入设备上下文doubleTheta,*x,*y;Theta=2*PI/nVertex;//等分角(外角)x=newdouble[nVertex];//n个顶点横坐标y=newdouble[nVertex];//n个顶点纵坐标for(inti=0;inVertex;i++)//计算等分点坐标{x[i]=radius*cos(i*Theta)+MaxX()/2;y[i]=radius*sin(i*Theta)+MaxY()/2;}if(nVertex%2==0)//n为偶数,依次各连接等分点{for(inti=0;i=nVertex-2;i++){for(intj=i+1;j=nVertex-1;j++){pDC-MoveTo(Round(x[i]),Round(y[i]));//画图(利用CDC的方法)起点pDC-LineTo(Round(x[j]),Round(y[j]));//终点Sleep(millisecond);//延迟}}}else{intj=0;for(inti=0;inVertex;i++){intk=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(pOldPen);//恢复设备上下文中的原画笔NewPen.DeleteObject();//删除已成自由状态的蓝色画笔ReleaseDC(pDC);}//绘制魔术三角voidCDiamondView::DrawTriangle(){InvalidateRgn(NULL);UpdateWindow();//清屏CDC*pDC=GetDC();//定义设备上下文指针intcrColor[3]={RGB(255,0,255),RGB(0,255,255),RGB(255,255,0)};//画刷颜色for(intn=0;n20;n++){CBrushnewBrush,*oldBrush;//建立画刷对象CRgnRgnl,Rgn2,Rgn3;//绘图区域newBrush.CreateSolidBrush(crColor[n%3]);//对画刷对象进行初始化POINTvertexl[6]={{360,116},{105,555},{512,555},{464,470},{258,470},{460,116}};Rgnl.CreatePolygonRgn(vertexl,6,WINDING);//创建多边形区域oldBrush=pDC-SelectObject(&newBrush);//便于恢复原始对象pDC-FillRgn(&Rgnl,&newBrush);Sleep(100);pDC-SelectObject(oldBrush);//恢复原始对象newBrush.DeleteObject();newBrush.CreateSolidBrush(crColor[(n+1)%3]);//初始化画刷颜色POINTvertex2[6]={{460,116},{258,470},{362,470},{460,290},{666,644},{718,555}};Rgn2.CreatePolygonRgn(vertex2,6,WINDING);oldBrush=pDC-SelectObject(&newBrush);pDC-FillRgn(&Rgn2,&newBrush);//用刷子填充指定区域Sleep(100);pDC-SelectObject(oldBrush);newBrush.DeleteObject();pDC-SelectObject(oldBrush);newBrush.CreateSolidBrush(crColor[(n+2)%3]);POINTvertex3[6]={{105,555},{155,644},{666,645},{460,290},{410,380},{512,555}};Rgn3.CreatePolygonRgn(vertex3,6,WINDING);oldBrush=pDC-SelectObject(&newBrush);pDC-FillRgn(&Rgn3,&newBrush);Sleep(100);}}//绘制递归圆//nDepth:递归深度voidCDiamondView::DrawRecursionCircle(intnDepth){InvalidateRgn(NULL);UpdateWindow();doubler=100;CDC*pDC=GetDC();//定义设备上下文指针CPennewPen,*oldPen;//建立画笔对象newPen.CreatePen(PS_SOLID,1
本文标题:计算机图形学实验
链接地址:https://www.777doc.com/doc-5131255 .html