《计算机图形学》
实验报告
学号:0908610211
姓名:宋雪英
班级:计算机0961
项目:
1.利用其它两种画直线方法实现放大10陪显示方法,交互式画直线,预先定义直线段的起止端点,每点击一次鼠标左键,画出直线上的一点,直到终点为止。
2.利用方形、线性两种画刷来绘制圆和椭圆。
3.实现交互式二维图形的放缩,旋转和对称变换
2012年 12月25日
基本图形的生成技术
一、实验目的
在一个图形系统中,基本图形(也称为图元、图素等)的生成技术是最基本的,任何复杂的图形都是由基本图形组成的,基本图形生成的质量直接影响该图形系统绘图的质量。所以,需要设计出精确的基本图形生成算法,以确保图形系统绘图的精确性。本次实验的目的就是利用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为纵坐标。默认坐标原点(0,0)位于窗口的左上角。由于应用程序要求自动捕获鼠标事件,因此应当采用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;
//将从(100,100)以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_RECT、ID_OVAL、ID_PLOYGON的三个菜单项添加COMMAND消息函数如图2所示,当用户选中相应菜单项时,会执行对应消息的函数体。
图2 添加消息函数对话框
第四步:依次对每个函数单击Edit Code按钮,分别添加菜单的消息函数
CMainFrame::OnYuan1()//画圆
CMainFrame::OnYuan2()//画圆
CMainFrame::OnTuoy1()//画椭圆
CMainFrame::OnTuoy2()//画椭圆
首先定义两个画刷
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;//屏幕x和y的最大坐标
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)函数,X、Y分别放大2陪。
void CTranView::OnMENUDecrease()//缩小比例
在缩小比例时调用Tscale(0.5,0.5)函数,X、Y分别缩小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轴变换图形图:
原点变换图形图:
分析:图形的变换主要有平移变换、比例变换、旋转变换、对称变换。平移变换主要是将二维图形的x、y值加减上一个常数,比例变换主要是将二维图形的x、y值乘上一个比例,旋转变换主要是将二维图形的点绕坐标原点转动某个角度,对称变换主要是将二维图形关于某一轴线或原点的镜像。
六、实验总结
通过对本课程的学习,使学生对计算机图形学有一个完整的了解,并为进行计算机图形学应用和研究打下扎实基础。这些实验是对学生的一种多全面训练。它着眼于原理与应用的结合,使学生学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;另一方面,能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。在实验过程中,能够培养学生的自学能力、团队协作能力、解决问题能力、软件开发能力等多种能力。
鼠标事件处理函数
鼠标右击视图类(如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格式