计算机图形学实验一报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机图形学实验一报告
————————————————————————————————作者:————————————————————————————————日期:

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

当n取奇数时,该图案可一笔连续绘成,即用MoveTo函数确定一个当前点,然后连续用LineTo函数连点成线。

请设计连线规则并编程实现。

(2)绘制魔术三角形
绘制下图所示的魔术三角形图案,采用三种可明显区分的颜色填充。

(3)绘制递归圆
应用递归的方法绘制如下所示的图案。

2.实验环境
软硬件运行环境:Windows XP
开发工具:visual studio 2008
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
class CDiamondView: public CView
{ ……
public:
ﻩ//参数输入和提示对话框
CDlgDiamonddlgDiamond;//金刚石绘制中的参数输入对话框
ﻩCDlgCircle dlgCircle;//递归圆绘制中的参数输入对话框
ﻩCDlgBezier dlgBezier;//Bezier曲线绘制中的参数输入对话框
CDlgB dlgB;//B样条曲线绘制中的参数输入对话框
ﻩCDlgHint dlgHint;//裁剪中的提示对话框
//用于裁剪时的裁剪窗口绘制的控制
ﻩBOOL IsCutting;
BOOL IsDrawing;
ﻩ//裁剪窗口的左上角和右下角坐标
POINT RectP1;//左上角坐标
POINTRectP2;//右下角坐标
//绘图函数,需要实现
voidDrawDiamond(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样条曲线
voidCut();//裁剪
……ﻩ};
//DiamondView.cpp
void 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,intmillisecond){}
void CDiamondView::OnMenuTriangle()
{IsCutting= FALSE;
ﻩDrawTriangle();//调用绘制魔术三角的函数}
//绘制魔术三角
void CDiamondView::DrawTriangle()
{}
voidCDiamondView::OnMenuCircle()
{IsCutting= FALSE;
if(dlgCircle.DoModal()==IDOK)
ﻩﻩDrawRecursionCircle(dlgCircle.m_nDepth);//调用绘制递归圆的函数ﻩ} //绘制递归圆
//nDepth:递归深度
void CDiamondView::DrawRecursionCircle(int nDepth)
{}
5.源代码
//绘制金刚石图案
//nVertex:顶点数,radius:圆半径,millisecond:笔画之间的延迟时间
intCDiamondView::MaxX()

CRectRect;
ﻩGetClientRect(&Rect);
return Rect.right;
}
intCDiamondView::MaxY()
{CRect Rect;
GetClientRect(&Rect);
return Rect.bottom;}
void CDiamondView::DrawDiamond(int nVertex,intradius,intmilli second){
ﻩ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<nVertex;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(int j=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 (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(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++)
ﻩ{
CBrush newBrush,*oldBrush;
newBrush.CreateSolidBrush(colour[n%3]);
ﻩPOINT vertex1[6]={ {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->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(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->SelectObject(&newPen);
ﻩCRect rect(Round(MaxX()/2-r),Round(MaxY()/2-r),Round(MaxX()/2+r),Round(MaxY()/2+r));
pDC->Ellipse(&rect);
intx0=MaxX()/2;
int y0=MaxY()/2;
DrawRecursionCircle1(x0,y0,r,nDepth);

void CDiamondView::DrawRecursionCircle1(int x,inty,double r,int nD epth)

ﻩint x1[8],y1[8];
double t=2*PI/8;
ﻩCDC *pDC= GetDC();
ﻩCPen newPen,*oldPen;
newPen.CreatePen(PS_SOLID,1,RGB(255,0,0));
oldPen =pDC->SelectObject(&newPen);
if(nDepth>0)

nDepth--;
ﻩﻩfor(int i=0;i<8;i++)
ﻩ{
ﻩﻩﻩx1[i]=Round(x+2*r*cos(i*t));
ﻩﻩy1[i]=Round(y+2*r*sin(i*t));
ﻩ}
ﻩﻩfor(int i=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,nDept h);
}
ﻩ}

6. 程序运行结果
图1金刚石图案绘制运行结果
图2魔幻三角形绘制运行结果
图3递归圆绘制运行结果
7. 总结
用VC++绘制金刚石、三角形、递归圆,因为好久没有动手编写代码了,感觉很多都忘记了,虽然这次的程序并不难,框架都已建好,但是实际操作还是有一些问题,有些错误改了很多次都总是没有结果不过最终还是解决了。

通过这次实验,我明白自身还有很多不足,希望以后会越做越好。

相关文档
最新文档