计算机图形学实验(共13页)_第1页
计算机图形学实验(共13页)_第2页
计算机图形学实验(共13页)_第3页
计算机图形学实验(共13页)_第4页
计算机图形学实验(共13页)_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上 计算机科学与通信工程学院实验报告课程计算机图形学实验题目二维图形绘制学生姓名 徐家幸学号专业班级计算机科学与技术1602指导教师王新宇日期2019.4.6成绩评定表评价内容具体内容权重得分论证分析方案论证与综合分析的正确、合理性20%算法设计算法描述的正确性与可读性20%编码实现源代码正确性与可读性30%程序书写规范标识符定义规范,程序书写风格规范20%报告质量报告清晰,提交准时10%总 分指导教师签名二维图形的绘制1. 实验内容(1) 实验题目绘制金刚石图案绘制魔术三角形绘制递归圆 (2) 实验内容金刚石图案的成图规则是:把一个圆周等分成n份,然后每两点之间连线。

2、当n取奇数时,该图案可一笔连续绘成,即用MoveTo函数确定一个当前点,然后连续用LineTo函数连点成线。请设计连线规则并编程实现。绘制下图所示的魔术三角形图案 ,采用三种可明显区分的颜色填充。 应用递归的方法绘制如下所示的图案。 2. 实验环境软硬件运行环境:Windows 10开发工具:visual studio 20153. 问题分析根据实验需求,需要在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.魔术三角形:先绘制三角形图形,再

4、随机在三个图形中填色。3.递归圆:先确定首个圆的中心点坐标和半径与其周围八个小圆的中心点坐标和半径,再根据递归的深度再算出递归后圆的半径,并计算出它们的圆中心点坐标。设计一个二重循环,代表起点的外层循环从i0循环到in-2,代表终点的内层循环从ji+1循环到j=n-1。以pi.x,pi.y作为起点,以pj.x,pj.y作为终点绘制连接线。4. 算法设计/DiamondView.hclass CDiamondView : public CView public:/参数输入和提示对话框CDlgDiamond dlgDiamond;/金刚石绘制中的参数输入对话框CDlgCircle dlgCircl

5、e;/递归圆绘制中的参数输入对话框CDlgBezier dlgBezier;/Bezier曲线绘制中的参数输入对话框CDlgB dlgB;/B样条曲线绘制中的参数输入对话框CDlgHint dlgHint;/裁剪中的提示对话框/用于裁剪时的裁剪窗口绘制的控制BOOL IsCutting;BOOL IsDrawing;/裁剪窗口的左上角和右下角坐标POINT RectP1;/左上角坐标POINT RectP2;/右下角坐标 /绘图函数,需要实现 void DrawDiamond(int,int,int);/绘制金刚石 void DrawTriangle();/绘制魔术三角 void DrawRe

6、cursionCircle(int);/绘制递归圆 void Polaris();/北极星 void DrawBezier1(POINT p4);/已知点作为控制点绘制Bezier曲线 void DrawBezier2(POINT p4);/已知点作为曲线上的点绘制Bezier曲线 void DrawBCurve(POINT p6);/绘制B样条曲线 void Cut();/裁剪 ;/DiamondView.cppvoid CDiamondView:OnMenuDiamond() IsCutting = FALSE;if(dlgDiamond.DoModal()=IDOK) DrawDiamo

7、nd(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:DrawTrian

8、gle()void CDiamondView:OnMenuCircle() IsCutting = FALSE;if(dlgCircle.DoModal()=IDOK)DrawRecursionCircle(dlgCircle.m_nDepth);/调用绘制递归圆的函数 /绘制递归圆/nDepth:递归深度void CDiamondView:DrawRecursionCircle(int nDepth)5. 源代码/ CDiamondView message handlers/绘制金刚石图案/nVertex:顶点数,radius:圆半径,millisecond:笔画之间的延迟时间int CDi

9、amondView:MaxX()CRect Rect;GetClientRect(&Rect);return Rect.right;/矩形右下角xint CDiamondView:MaxY()CRect Rect;GetClientRect(&Rect);return Rect.bottom;/矩形yvoid CDiamondView:DrawDiamond(int nVertex, int radius, int millisecond)InvalidateRgn(NULL);/UpdateWindow();Sleep(100);/休眠CDC *pDC = GetDC();/

10、所定义指针CRect rect;/定义矩形对象GetClientRect(&rect);/获得客户区矩形大小CBrush br(RGB(255, 255, 255);/背景白色pDC->FillRect(&rect, &br);CPen newPen(PS_SOLID, 2, RGB(0, 255, 255);/画笔大小2 ,颜色为天蓝色CPen *OldPen = pDC->SelectObject(&newPen);double Thta = 2 * PI / nVertex; /等分角double *x = new doublenVertex;

11、/横坐标double *y = new doublenVertex;/纵坐标for (int i = 0; i<nVertex; i+)/小于点数xi = radius*cos(i*Thta) + 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; j < -nVertex - 1; j+) pDC->MoveTo(Round(xi), Rou

12、nd(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 < nVertex / 2) k+;j = j + k;pDC->MoveTo(Round(x(j - k) % nVertex), Round(y(j - k) % nVertex);pDC->LineTo(Round(xj%nVertex), Round(yj%nVertex);Sleep(mil

13、lisecond);pDC->SelectObject(OldPen);/恢复设备上下文的原画笔newPen.DeleteObject();/删除已成自由状态的画笔ReleaseDC(pDC);/释放上下文指针/绘制魔术三角void CDiamondView:DrawTriangle()InvalidateRgn(NULL);UpdateWindow();CDC *pDC = GetDC();int colour3 = RGB(255,255,0),RGB(255,0,255),RGB(0,255,255) ;for (int n = 0; n<20; n+)CBrush newB

14、rush, *oldBrush;newBrush.CreateSolidBrush(colourn % 3);POINT vertex16 = 610,66 , 355,505 , 762,505 , 714,420 , 508,420 , 710,66 ;CRgn Rgn1, Rgn2, Rgn3;Rgn1.CreatePolygonRgn(vertex1, 6, WINDING);oldBrush = pDC->SelectObject(&newBrush);pDC->FillRgn(&Rgn1, &newBrush);Sleep(100);pDC-&g

15、t;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);oldBrush = pDC->SelectObject(&newBrush);pDC->FillRgn(&Rgn3, &newBrush

16、);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->SelectObject(&n

17、ewBrush);pDC->FillRgn(&Rgn2, &newBrush);Sleep(100);/绘制递归圆/nDepth:递归深度/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);oldPen = pDC->SelectO

18、bject(&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

温馨提示

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

评论

0/150

提交评论