
计算机图形学实验一报告.doc
12页计算机科学与通信工程学院实验报告课程计算机图形学实验题目二维图形绘制学生学号专业班级指导教师日期成绩评定表评价容具体容权重得分论证分析方案论证与综合分析的正确、合理性20%算法设计算法描述的正确性与可读性20%编码实现源代码正确性与可读性30%程序书写规标识符定义规,程序书写风格规20%报告质量报告清晰,提交准时10%总 分指导教师签名二维图形的绘制1. 实验容〔1〕绘制金刚石图案金刚石图案的成图规那么是:把一个圆周等分成n份,然后每两点之间连线当n取奇数时,该图案可一笔连续绘成,即用MoveTo函数确定一个当前点,然后连续用LineTo函数连点成线请设计连线规那么并编程实现〔2〕绘制魔术三角形绘制下列图所示的魔术三角形图案 ,采用三种可明显区分的颜色填充〔3〕绘制递归圆应用递归的方法绘制如下所示的图案2. 实验环境软硬件运行环境:Windows XP开发工具:visual studio 20083. 问题分析根据实验需求,需要在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.hclass CDiamondView : public CView{ ……public: //参数输入和提示对话框 CDlgDiamond dlgDiamond;//金刚石绘制中的参数输入对话框 CDlgCircle dlgCircle;//递归圆绘制中的参数输入对话框 CDlgBezier dlgBezier;//Bezier曲线绘制中的参数输入对话框 CDlgB dlgB;//B样条曲线绘制中的参数输入对话框 CDlgHint dlgHint;//裁剪中的提示对话框 //用于裁剪时的裁剪窗口绘制的控制 BOOL IsCutting; BOOL IsDrawing; //裁剪窗口的左上角和右下角坐标 POINT RectP1;//左上角坐标 POINT RectP2;//右下角坐标 //绘图函数,需要实现 void DrawDiamond(int,int,int);//绘制金刚石 void DrawTriangle();//绘制魔术三角 void DrawRecursionCircle(int);//绘制递归圆 void Polaris();//北极星 void DrawBezier1(POINT p[4]);//点作为控制点绘制Bezier曲线 void DrawBezier2(POINT p[4]);//点作为曲线上的点绘制Bezier曲线void DrawBCurve(POINT p[6]);//绘制B样条曲线 void Cut();//裁剪…… };//DiamondView.cppvoid CDiamondView::OnMenuDiamond() { IsCutting = FALSE; if(dlgDiamond.DoModal()==IDOK) DrawDiamond(dlgDiamond.m_nVertex,dlgDiamond. m_nRadius,100);//调用绘制金刚石的函数 }//绘制金刚石图案//nVertex:顶点数,radius:圆半径,millisecond:笔画之间的延迟时间void CDiamondView::DrawDiamond(int nVertex, int radius,int millisecond){}void CDiamondView::OnMenuTriangle() { IsCutting = FALSE; DrawTriangle();//调用绘制魔术三角的函数}//绘制魔术三角void CDiamondView::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::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(); Sleep(100); CDC *pDC=GetDC(); CRect rect; 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 double[nVertex]; double *y = new double[nVertex]; for(int i=0;i












