计算机图形学实验一报告.docx

上传人:b****4 文档编号:4026948 上传时间:2022-11-27 格式:DOCX 页数:12 大小:68.23KB
下载 相关 举报
计算机图形学实验一报告.docx_第1页
第1页 / 共12页
计算机图形学实验一报告.docx_第2页
第2页 / 共12页
计算机图形学实验一报告.docx_第3页
第3页 / 共12页
计算机图形学实验一报告.docx_第4页
第4页 / 共12页
计算机图形学实验一报告.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

计算机图形学实验一报告.docx

《计算机图形学实验一报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验一报告.docx(12页珍藏版)》请在冰豆网上搜索。

计算机图形学实验一报告.docx

计算机图形学实验一报告

计算机图形学实验一报告

 

 

————————————————————————————————作者:

————————————————————————————————日期:

 

计算机科学与通信工程学院

 

实验报告

 

课程

计算机图形学

实验题目

二维图形绘制

学生姓名

学号

专业班级

指导教师

日期

成绩评定表

评价内容

具体内容

权重

得分

论证分析

方案论证与综合分析的正确、合理性

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:

ﻩ//参数输入和提示对话框

CDlgDiamond dlgDiamond;//金刚石绘制中的参数输入对话框

ﻩCDlgCircledlgCircle;//递归圆绘制中的参数输入对话框

ﻩCDlgBezierdlgBezier;//Bezier曲线绘制中的参数输入对话框

CDlgB dlgB;//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,int radius,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);

return Rect.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(int i=0;i

ﻩx[i]=radius*cos(i*Thta)+MaxX()/2;

ﻩﻩy[i]=radius*sin(i*Thta)+MaxY()/2;

ﻩ}

if(nVertex%2==0){

ﻩﻩfor(int i=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;

  int k;

  for(inti=0;i< nVertex;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);

//绘制魔术三角

void CDiamondView:

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]);

ﻩ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]);

ﻩﻩPOINT vertex3[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]);

ﻩPOINT vertex2[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:

递归深度

void CDiamondView:

DrawRecursionCircle(int nDepth)

{

InvalidateRgn(NULL);

UpdateWindow();

doubler=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); 

int x0=MaxX()/2;

inty0=MaxY()/2; 

 DrawRecursionCircle1(x0,y0,r,nDepth);

voidCDiamondView:

:

DrawRecursionCircle1(int x,inty,double r,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++)

{

ﻩﻩﻩCRect rect(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+ +绘制金刚石、三角形、递归圆,因为好久没有动手编写代码了,感觉很多都忘记了,虽然这次的程序并不难,框架都已建好,但是实际操作还是有一些问题,有些错误改了很多次都总是没有结果不过最终还是解决了。

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1