计算机图形学实验报告

发布时间:2013-01-04 21:55:13   来源:文档文库   
字号:

《计算机图形学》

实验报告

学号:0908610211

姓名:宋雪英

班级:计算机0961

项目

1.利用其它两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。

2.利用方形、线性两种画刷来绘制圆和椭圆。

3.实现交互式二维图形的放缩,旋转和对称变换

2012 1225


基本图形的生成技术

一、实验目的

在一个图形系统中,基本图形(也称为图元、图素等)的生成技术是最基本的,任何复杂的图形都是由基本图形组成的,基本图形生成的质量直接影响该图形系统绘图的质量。所以,需要设计出精确的基本图形生成算法,以确保图形系统绘图的精确性。本次实验的目的就是利用Bresenham算法和中心画线法两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。利用方形、线性两种画刷来绘制圆和椭圆。实现交互式二维图形的放缩,旋转和对称变换。

2、实验任务

1.利用其它两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。

2.利用方形、线性两种画刷来绘制圆和椭圆。

3.实现交互式二维图形的放缩,旋转和对称变换。

三、画直线的实验内容

任务一:利用其它两种画直线方法实现放大10陪显示方法交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。

1、设计思路

第一步:建立DDAMouseLine工程文件;

第二步:向视图类中添加自定义的成员变量

用鼠标右键单击视图类,选择“Add Member Variable…”,添加下面三个成员变量。

proctected :

CPoint m_p1; //起点

CPoint m_p2; //起点

CPoint m_p; //点击鼠标时点的取值

第三步:向视图类中添加自定义的成员函数原型:

public:

Void DDAMouseLine(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color)

Line()函数以当前位置所在的点为直线的起点,另指定一个点为直线的终点,画出一段直线。

第四步:在视图类CPP文件的构造函数中初始化成员变量。

视图类的构造函数名与该视图类的名字相同。在视图类中选择构造函数,如:CDDAMouseLineView(),并赋值:

m_p1.x=100; m_p1.y=100; //起点

m_p.x=100;m_p.y=100;

m_p2.x=600; m_p2.y=400; //终点

第五步:在视图类的OnDraw()函数中加入下列代码,画出网格,实现视图绘图。

//画网格

int gi,gj;

//画横线

pDC->TextOut(90,90,"(100,100)");

pDC->MoveTo(100,100);

for(gj=100;gj<=400;gj=gj+10)

{

pDC->MoveTo(100,gj);

pDC->LineTo(600,gj);

}

//画竖线

pDC->MoveTo(100,100);

for (gi=100;gi<=600;gi=gi+10)

{

pDC->MoveTo(gi,100);

pDC->LineTo(gi,400);

}

pDC->TextOut(590,410,"(600,400)");

pDC->SelectStockObject(NULL_BRUSH);

第六步:向视图类中添加鼠标OnLButtonDown()函数消息响应函数

OnLButtonDown(UINT nFlags, CPoint point);

在鼠标处理函数中,point参数代表鼠标热点处的坐标位置,point.x为横坐标,point.y为纵坐标。默认坐标原点(00)位于窗口的左上角。由于应用程序要求自动捕获鼠标事件,因此应当采用Windows事件处理函数,而不是成员函数。

if (m_p.x<=m_p2.x && m_p.y <= m_p2.y)

{

pDC->SetPixel(m_p.x,m_p.y,RGB(255,0,0));

pDC->Ellipse(m_p.x-5,m_p.y-5,m_p.x+5,m_p.y+5);

}

m_p.x=m_p.x+10;

m_p.y=m_p.x*0.6+40;

m_p.y=(int)((m_p.y+5)/10)*10;

//将从(100100)以10为单位,计算出直线上各个像素位置。

pDC->SetPixel(m_p.x,m_p.y,RGB(255,0,0));

pDC->Ellipse(m_p.x-5,m_p.y-5,m_p.x+5,m_p.y+5);

//调用自定义的成员函数,用鼠标画直线。

2、实验效果及分析

分析:先在OnDraw()函数中画出网格,再在鼠标OnLButtonDown()函数中获取像素值并放大10,用DDAMouseLine()函数用Bresenham算法和中心画线算法画出放大10陪的直线。

四、绘制圆和椭圆实验内容

任务二:利用方形、线性两种画刷来绘制圆和椭圆

创建一个单文档应用程序DrawShapeTest创建一个单文档应用程序DrawShapeTest,单击“画图”菜单,选择“画椭圆”,客户区窗口显示出一个椭圆图案;选择“画圆”,客户区窗口显示出一个圆形。

1、设计思路

第一步:使用Visual C++6.0,创建一个单文档应用程序DrawShape

第二步:单击Recourse View视图,选择MENU项,双击其下的IDR_MAINFRAME选项,打开菜单资源编辑器,添加主菜单“绘图”,添加子菜单如图1所示。右键单击菜单项,设置菜单属性,在Menu Item Properties对话框的Caption框中输入菜单名称,在ID框中输入菜单相应的ID, 设置菜单属性如表1-1所示。

添加子菜单如图1

第三步:Ctrl+W打开类向导ClassWizard对话框,在CDrawShapeTestView视图类中,分别为ID值为:ID_RECTID_OVALID_PLOYGON的三个菜单项添加COMMAND消息函数如图2所示,当用户选中相应菜单项时,会执行对应消息的函数体。

2 添加消息函数对话框

第四步:依次对每个函数单击Edit Code按钮,分别添加菜单的消息函数

CMainFrame::OnYuan1()//画圆

CMainFrame::OnYuan()//画圆

CMainFrame::OnTuoy1()//画椭圆

CMainFrame::OnTuoy()//画椭圆

首先定义两个画刷

CBrush *oldBrush,newBrush;

newBrush.CreateHatchBrush(HS_CROSS,RGB(0,255,0));

//创建一个绿色的方形新画刷。

newBrush.CreateHatchBrush(HS_BDIAGONAL,RGB(0,255,0);//创建一个绿色的线形新画刷

oldBrush=dc.SelectObject(&newBrush);//将新画刷赋给旧画刷。

dc.Ellipse(190,200,290,300) ; ; // 绘制绿色线性圆形

dc.Ellipse(150,180,340,260);//画绿色线性椭圆

dc.Ellipse(190,200,290,300)//画绿色方形圆

dc.Ellipse(50,80,240,160); //画绿色方形椭圆

dc.SelectObject(oldBrush); // 恢复系统默认的画刷

注意:在DrawShapeTestView.cpp文件头部添加如下语句:

#include"math.h"

#define pi 3.1415926

2、实验效果及分析

分析:在Recourse View视图中,选择MENU项,双击其下的IDR_MAINFRAME选项,打开菜单资源编辑器,添加主菜单“画图(&D)”,添加子菜单。再在函数void CDrawShapeView::OnYUAN()//画圆void CDrawShapeView::OnTUOY()//画椭圆中定义两个画刷newBrush.CreateHatchBrush(HS_CROSS,RGB(0,255,0));

//创建一个绿色的方形新画刷。

newBrush.CreateHatchBrush(HS_BDIAGONAL,RGB(0,255,0);//创建一个绿色的线形新画刷

利用画圆和画椭圆函数.Ellipse来画出圆和椭圆

五、二维图形的放缩,旋转和对称变换实验内容

任务三:实现交互式二维图形的放缩,旋转和对称变换

1、设计思路

第一步:建立DDAMouseLine工程文件;

第二步:向视图类中添加自定义的成员变量

用鼠标右键单击视图类,选择“Add Member Variable…”,添加下面三个成员变量。

proctected :

int MaxX,MaxY;//屏幕xy的最大坐标

double P[4][3];//变换点

double TM[3][3];//平移变换矩阵

double TS[3][3];//比例变换矩阵

double TR[3][3];//旋转变换矩阵

double TF[3][3];//反射变换矩阵

double OSquare[4][3]; //矩形坐标

int ntype;

第三步:单击Recourse View视图,选择MENU项,双击其下的IDR_MAINFRAME选项,打开菜单资源编辑器,添加主菜单“绘图(&D)”和“变换(&T)”,在主菜单“绘图(&D)”下添加子菜单“画矩形”,在主菜单“变换(&T)”下添加子菜单“平移”、“旋转”、“缩放”、“对称”。在分别在子菜单“平移”、“旋转”、“缩放”、“对称”下添加子菜单“向上”、“向下”、“向左”、“向右”“顺时针”、“逆时针”、“放大”、“缩小”、“X轴”、“Y轴”、“原点”。生成函数分别为:

void CTranView::OnMENUAnticlockwise()//逆时针旋转。

在逆时针旋转时调用Trotate(-30)函数逆时针旋转30

void CTranView::OnMENUClockwise()//顺时针旋转

在顺时针旋转时调用Trotate(30)函数顺时针旋转30

void CTranView::OnMENUIncrease()//放大比例

在放大比例时调用Tscale(2,2)函数,XY分别放大2陪。

void CTranView::OnMENUDecrease()//缩小比例

在缩小比例时调用Tscale(0.5,0.5)函数,XY分别缩小0.5陪。

void CTranView::OnMENUdown()//向下平移

向下平移时调用Tmove(0,-10)函数,将图形向下平移10个单位。

void CTranView::OnMENUleft()//向左平移

向左平移时调用Tmove(-10,0)函数,将图形向左平移10个单位。

void CTranView::OnMENUright()//向右平移

void CTranView::OnMENUup()//向上平移

向右平移和向上平移同向左平移和向下平移一样都调用Tmove()函数

void CTranView::OnMENUXaxis()//X轴反射

void CTranView::OnMENUYaxis()//Y轴反射

void CTranView::OnMENUorg()//原点反射

X轴反射、Y轴反射和原点轴反射都调用Treflect()函数,分别为Treflect(1,-1);Treflect(-1,1);Treflect(-1,-1);

第四步:在OnDraw()函数中绘制坐标轴

GetMaxX();

GetMaxY();

pDC->MoveTo(MaxX/999,0);//绘制坐标轴

pDC->LineTo(MaxX/999,MaxY);

pDC->MoveTo(0,MaxY/999);

pDC->LineTo(MaxX,MaxY/999);

第五步:添加void CTranView::Calculate(double P0[][3], double T[][3])函数实现两个矩阵相乘。在函数中定义 double Ptemp[4][3]用来说明矩阵的大小。

第六步:添加void CTranView::Draw(double D[][3], int n)函数用来实现绘制原始图形。在添加void CTranView::GetMaxX()void CTranView::GetMaxY()函数用来获得屏幕宽度和长度。再在添加void CTranView::OnMENUChoose()函数用来绘制矩形。

第七步:分别添加平移变换矩阵、比例变换矩阵、旋转变换矩阵、反射变换矩阵、清除变换矩阵成员函数。

void CTranView::Tmove(double Tx, double Ty)//平移变换矩阵

void CTranView::Tscale(double Sx, double Sy)//比例变换矩阵

void CTranView::Trotate(double thta)//旋转变换矩阵

void CTranView::Treflect(double Fx, double Fy)//反射变换矩阵

void CTranView::ClearMatrix(double A[3][3])//清除变换矩阵

它们都调用Window函数RedrawWindow()AfxGetMainWnd()->SetWindowText()来实现二维图形的变换。在变换矩阵前要先清除平移变换矩阵。

注意:要在头文件中添加

#define ROUND(a) int(a+0.5)//四舍五入

#define PI 3.1415926//圆周率

#include "math.h"//数学头文件

#include "InputDlg.h"//图形输入对话框

2、实验效果及分析

绘制原图:

向上变换图形图:

向下变换图形图:

向左变换图形图:

向右变换图形图:

顺时针变换图形图:

逆时针变换图形图:

放大变换图形图:

缩小变换图形图:

在顺时针变换下进行下列变换:

X轴变换图形图

Y轴变换图形图:

原点变换图形图:

分析:图形的变换主要有平移变换、比例变换、旋转变换、对称变换。平移变换主要是将二维图形的xy值加减上一个常数,比例变换主要是将二维图形的xy值乘上一个比例,旋转变换主要是将二维图形的点绕坐标原点转动某个角度,对称变换主要是将二维图形关于某一轴线或原点的镜像。

六、实验总结

通过对本课程的学习,使学生对计算机图形学有一个完整的了解,并为进行计算机图形学应用和研究打下扎实基础。这些实验是对学生的一种多全面训练。它着眼于原理与应用的结合,使学生学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;另一方面,能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。在实验过程中,能够培养学生的自学能力、团队协作能力、解决问题能力、软件开发能力等多种能力。

鼠标事件处理函数

鼠标右击视图类(如CmyMouseView),选择“add windows message handler…”来建立。

newBrush.CreateHatchBrush(HS_CROSS,RGB(0,255,0));

//创建一个绿色的方形新画刷。

newBrush.CreateHatchBrush(HS_BDIAGONAL,RGB(0,255,0);//创建一个绿色的线形新画刷

图形的变换主要有平移变换、比例变换、旋转变换、对称变换。

本文来源:https://www.2haoxitong.net/k/doc/0f601e6acaaedd3383c4d3ea.html

《计算机图形学实验报告.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式