计算机图形学实验一报告.docx
- 文档编号:27253234
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:13
- 大小:63.93KB
计算机图形学实验一报告.docx
《计算机图形学实验一报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验一报告.docx(13页珍藏版)》请在冰豆网上搜索。
计算机图形学实验一报告
计算机科学与通信工程学院
实验报告
课程
计算机图形学
实验题目
二维图形绘制
学生姓名
学号
专业班级
指导教师
日期
成绩评定表
评价内容
具体内容
权重
得分
论证分析
方案论证与综合分析的正确、合理性
20%
算法设计
算法描述的正确性与可读性
20%
编码实现
源代码正确性与可读性
30%
程序书写规范
标识符定义规范,程序书写风格规范
20%
报告质量
报告清晰,提交准时
10%
总分
指导教师签名
二维图形的绘制
1.实验内容
(1)绘制金刚石图案
金刚石图案的成图规则是:
把一个圆周等分成n份,然后每两点之间连线。
当n取奇数时,该图案可一笔连续绘成,即用MoveTo函数确定一个当前点,然后连续用LineTo函数连点成线。
请设计连线规则并编程实现。
(2)绘制魔术三角形
绘制下图所示的魔术三角形图案,采用三种可明显区分的颜色填充。
(3)绘制递归圆
应用递归的方法绘制如下所示的图案。
2.实验环境
软硬件运行环境:
WindowsXP
开发工具:
visualstudio2008
3.问题分析
根据实验需求,需要在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.h
classCDiamondView:
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.cpp
voidCDiamondView:
:
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;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;i k=0; while(k 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;n<20;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(&newPen); if(nDepth>0) { nDepth--; for(inti=0;i<8;i++) { x1[i]=Round(x+2*r*cos(i*t)); y1[i]=Round(y+2*r*sin(i*t)); } for(inti=0;i<8;i++) { CRectrect(Round(x1[i]-0.3*r),Round(y1[i]-0.3*r),Round(x1[i]+0.3*r),Round(y1[i]+0.3*r)); pDC->Ellipse(&rect); Sleep(50); DrawRecursionCircle1(Round(x1[i]),Round(y1[i]),0.3*r,nDepth); } } } 6.程序运行结果 图1金刚石图案绘制运行结果 图2魔幻三角形绘制运行结果 图3递归圆绘制运行结果 7.总结 用VC++绘制金刚石、三角形、递归圆,因为好久没有动手编写代码了,感觉很多都忘记了,虽然这次的程序并不难,框架都已建好,但是实际操作还是有一些问题,有些错误改了很多次都总是没有结果不过最终还是解决了。 通过这次实验,我明白自身还有很多不足,希望以后会越做越好。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 报告