1、源代码正确性与可读性30%程序书写规范标识符定义规范,程序书写风格规范报告质量报告清晰,提交准时10%总 分指导教师签名二维图形的绘制1. 实验内容(1)绘制金刚石图案金刚石图案的成图规则是:把一个圆周等分成n份,然后每两点之间连线。当n取奇数时,该图案可一笔连续绘成,即用MoveTo函数确定一个当前点,然后连续用LineTo函数连点成线。请设计连线规则并编程实现。(2)绘制魔术三角形绘制下图所示的魔术三角形图案 ,采用三种可明显区分的颜色填充。(3)绘制递归圆应用递归的方法绘制如下所示的图案。2. 实验环境软硬件运行环境:Windows XP开发工具:visual studio 20083.
2、 问题分析根据实验需求,需要在MFC环境中建立一个由“文件”、“绘图”和“帮助”这3个菜单项目组成的菜单,其中“文件”的子菜单为“退出”,完成退出应用程序的工作,“绘图”,的子菜单为“Diamond”,用于绘制金刚石图案等,“帮助”的子菜单为“关于”,用于显示开发人员信息;定义一个输人对话框类,提供个两个参数的输入界面。最后在客户区输出图案。1.金刚石图案:为把一个半径为300的圆,等分绘制金刚石图案;设计该算法为避免直线段的重复连接,需设计一个二重循环,代表起点索引号的外层整型变量i从i=0循环到i=n-2,代表终点索引号的内层整型变量j从j=i+1循环到j=n-1。以(pi.x,pi.y)
3、为起点,以(pj.x,pj.y)为终点依次连接各线段形成金刚石图案。金刚石有两种画法:(1)每隔两个顶点连线直至回到原起点,再将下一个点作为新的原起点。(2)每个点与其余点都连线直至全部连玩,再将隔一个点之后的点作为新的原起点。2.魔术三角形:先绘制三角形图形,再随机在三个图形中填色。3.递归圆:先确定首个圆的中心点坐标和半径与其周围八个小圆的中心点坐标和半径,再根据递归的深度再算出递归后圆的半径,并计算出它们的圆中心点坐标。设计一个二重循环,代表起点的外层循环从i0循环到in-2,代表终点的内层循环从ji+1循环到j=n-1。以pi.x,pi.y作为起点,以pj.x,pj.y作为终点绘制连接
4、线。4. 算法设计/DiamondView.hclass CDiamondView : public CView public:/参数输入和提示对话框CDlgDiamond dlgDiamond;/金刚石绘制中的参数输入对话框CDlgCircle dlgCircle;/递归圆绘制中的参数输入对话框CDlgBezier dlgBezier;/Bezier曲线绘制中的参数输入对话框CDlgB dlgB;/B样条曲线绘制中的参数输入对话框CDlgHint dlgHint;/裁剪中的提示对话框/用于裁剪时的裁剪窗口绘制的控制BOOL IsCutting;BOOL IsDrawing;/裁剪窗口的左上角
5、和右下角坐标POINT RectP1;/左上角坐标POINT RectP2;/右下角坐标 /绘图函数,需要实现 void DrawDiamond(int,int,int);/绘制金刚石 void DrawTriangle();/绘制魔术三角 void DrawRecursionCircle(int);/绘制递归圆 void Polaris();/北极星 void DrawBezier1(POINT p4);/已知点作为控制点绘制Bezier曲线 void DrawBezier2(POINT p4);/已知点作为曲线上的点绘制Bezier曲线 void DrawBCurve(POINT p6);
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:笔画之间的延迟时间DrawDiamond(int nVertex, int radius,int millisecond)
7、OnMenuTriangle() DrawTriangle();/调用绘制魔术三角的函数DrawTriangle()OnMenuCircle() if(dlgCircle.DoModal()=IDOK)DrawRecursionCircle(dlgCircle.m_nDepth);/调用绘制递归圆的函数 /nDepth:递归深度DrawRecursionCircle(int nDepth)5. 源代码int CDiamondView:MaxX()CRect Rect;GetClientRect(&Rect);return Rect.right;MaxY() CRect Rect;return
8、Rect.bottom;DrawDiamond(int nVertex, int radius,int millisecond)InvalidateRgn(NULL); UpdateWindow();Sleep(100);CDC *pDC=GetDC();CRect rect;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 *
9、x = new doublenVertex; double *y = new doublenVertex;for(int i=0;inVertex;i+) xi=radius*cos(i*Thta)+MaxX()/2;yi=radius*sin(i*Thta)+MaxY()/2;if(nVertex%2=0)for(int i=0;=nVertex-2;i+)for(int j=i+1;jMoveTo(Round(xi),Round(yi);LineTo(Round(xj),Round(yj);Sleep(millisecond);else int j = 0; int k; for (int
10、 i = 0; i nVertex; i+) k = 0; while (k MoveTo(Round(x(j-k)%nVertex),Round(y(j-k)%nVertex); pDC-LineTo(Round(xj%nVertex),Round(yj%nVertex);Sleep(millisecond);SelectObject(OldPen); CDC *pDC = GetDC(); int colour3=RGB(255,0,0),RGB(0,0,255),RGB(0,255,0);for(int n=0;nnewBrush); pDC-FillRgn(&Rgn1,& Sleep(100);SelectObject(oldBrush); 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);Rgn3,&
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1