您好,欢迎来到21游戏网。
搜索
您的当前位置:首页计算机图形学上机实验实现二维图形的各种转换

计算机图形学上机实验实现二维图形的各种转换

来源:21游戏网




昆明 理 工 大 学 理 学 院

信息与计算科学专业 操作性实验报告

年级:10级 姓名: 刘陈 学号: 1128 指导教师:

实验课程名称:计算机图形学程序设计 开课实验室: 理学院机房216

实验成绩:

学风(5)

观察能力(15)

操作能力(30)

调试能力(50)


总分


1.实验/作业题目:用计算机高级语言VC++6.0实现计算机的基本图元绘制

2.实验/作业课时:2学时

3.实验过程(包括实验环境、实验内容的描述、完成实验要求的知识或技

)

1



实验环境:1)硬件:每人一台PC

2)软件:windows OSVC++6.0或以上版本。

试验内容及步骤:

1)在VC++环境下创建MFC应用程序工程(单文档)

2)编辑菜单资源

3)添加菜单命令消息处理函数

4)添加成员函数

5)编写函数内容

肂试验要求:


2)实现对二维图形平移、比例、旋转、对称、错切变换。

3)试验中调试、完善所编程序,能正确运行出设计要求结果。

4)书写试验报告上交。

4.程序结构(程序中的函数调用关系图)



2



添加消息 实现绘画

处理函数

罿实现对二维 添加二维图

图形的变换 形各个变换的

矩阵源码

5.算法描述、流程图或操作步骤:


voidClearMatrix(double A[3][3]); //清除变换矩阵

voidGetMaxY(); //获得屏幕的最大y

voidGetMaxX(); //获得屏幕的最大x



void Draw(double D[][3],int);

//绘制图形

3



voidCalculate(double P0[][3],double T[][3]); //矩阵相乘

voidKeepMatrix(double Orig[][3],double Dest[4][3]); //保留矩阵值

voidTmove(double Tx,double Ty); //平移变换计算

voidTscale(double Sx,double Sy); //比例变换计算

void Trotate(double thta);


voidTreform(double b,double c); //错切变换计算

lab3View.h文件中的protected内添加变量:

int MaxX,MaxY;

//屏幕x y 的最大坐标


4



doubleP[4][3]; //变换点

doubleTM[3][3]; //平移变换矩阵

doubleTS[3][3]; //比例变换矩阵

doubleTR[3][3]; //旋转变换矩阵

double TF[3][3];


doubleOSquare[4][3]; //矩形坐标

doubleOTriangle[4][3]; //正三角形坐标

doubleOLine[4][3]; //直线坐标



int p3;


5



lab3View.cpp文件中添加如下头文件:

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

#definePI 3.1415926 //圆周率

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

袄在lab3View.cpp文件中的函数CLab3View::OnDraw(CDC*pDC)下添


GetMaxX();

GetMaxY();

//绘制坐标轴

pDC->MoveTo(MaxX/2,0);



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


6



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

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

lab3View.cpp文件中添加如下的各个消息处理函数及代码:

voidCLab3View::GetMaxX() //获得屏幕宽度

{ CRect Rect;

MaxX=Rect.right;

}

void CLab3View::GetMaxY()

7



{ CRect Rect;

GetClientRect(&Rect);

MaxY=Rect.bottom;

}

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


{ for(int j=0;j<3;j++)

A[i][j]=0; }

}



void CLab3View::OnTriangle()

//菜单函数

8



{

{ P[0][0]=-100/2;P[0][1]=0;P[0][2]=1; //绘制等边三角形

P[1][0]=100/2;P[1][1]=0;P[1][2]=1;

P[2][0]=0;P[2][1]=100/2*tan(60*PI/180);P[2][2]=1;

P[3][0]=0;P[3][1]=0;P[3][2]=1;

KeepMatrix(P,OTriangle);

Draw(P,p3); }

InvalidateRect(NULL,FALSE); //重画窗口



9



}

voidCLab3View::OnSquare() //菜单函数

{

{ P[0][0]=-100/2;P[0][1]=100/2;P[0][2]=1; //绘制矩形

P[1][0]=100/2;P[1][1]=100/2;P[1][2]=1;

P[3][0]=-100/2;P[3][1]=-100/2;P[3][2]=1;

p3=4;

KeepMatrix(P,OSquare);



Draw(P,p3);

}


10



InvalidateRect(NULL,FALSE);

//重画窗口

}

voidCLab3View::OnLine() //菜单函数

{

{ P[0][0]=-150/2;P[0][1]=0;P[0][2]=1; //绘制直线

芀艿 P[2][0]=0;P[2][1]=0;P[2][2]=1;

P[3][0]=0;P[3][1]=0;P[3][2]=1;

p3=2;



11



KeepMatrix(P,OLine);

//重画窗口

Draw(P,p3);

}

InvalidateRect(NULL,FALSE);

}

void CLab3View::Draw(doubleD[][3],int n) //绘制图形


CClientDCdc(this);

CPenpen,*pOldpen;

pen.CreatePen(PS_SOLID,2,RGB(0,0,0));



pOldpen=dc.SelectObject(&pen);


12



for(inti=0;i<n;i++)

{ if(i==0)

dc.MoveTo(ROUND(MaxX/2+D[i][0]),ROUND(MaxY/2-D[i][1]));

else

dc.LineTo(ROUND(MaxX/2+D[i][0]),ROUND(MaxY/2-D[i][1]));

dc.LineTo(ROUND(MaxX/2+D[0][0]),ROUND(MaxY/2-D[0][1]));

dc.SelectObject(pOldpen);

pen.DeleteObject();



13



}

voidCLab3View::Calculate(double P0[][3],double T[][3]) //两个矩阵相乘

{ double Ptemp[4][3];

KeepMatrix(P,Ptemp);

for(inti=0;i<4;i++)


P[i][j]=Ptemp[i][0]*T[0][j]+Ptemp[i][1]*T[1][j]+Ptemp[i][2]*T[2][j]; }

voidCLab3View::OnMENUleft() //向左平移

{ Tmove(-10,0); }



void CLab3View::OnMENUright()

14



{ Tmove(10,0); }

voidCLab3View::OnMENUup() //向上平移

{ Tmove(0,10); }

voidCLab3View::OnMENUdown() //向下平移

{ Tmove(0,-10); }


{ Trotate(30); }

voidCLab3View::OnMENUAnticlockwise() //逆时针旋转

{ Trotate(-30); }



15



voidCLab3View::OnMENUIncrease() //放大比例

{ Tscale(2,2); }

voidCLab3View::OnMENUDecrease() //缩小比例

{ Tscale(0.5,0.5); }

void CLab3View::OnMENUXaxis()

{

voidCLab3View::OnMENUYaxis() //Y轴对称

罿{ Treflect(-1,1); }

voidCLab3View::OnMENUorg() //原点对称



{

Treflect(-1,-1);

}


16



voidCLab3View::OnMENUXdirectionplus() //X正向错切

{ Treform(0,1); }

voidCLab3View::OnMENUXdirectionneg() //X负向错切

{ Treform(0,-1); }

voidCLab3View::OnMENUITYdirectionplus() //Y 正向错切

{

voidCLab3View::OnMENUYdirectionneg() //Y负向错切

{ Treform(-1,0); }

void CLab3View::OnMENUReset()

17



{ if(p3==4)

{ KeepMatrix(OSquare,P); }

if(p3==3)

{ KeepMatrix(OTriangle,P); }

if(p3==2)

Draw(P,p3);

}

void CLab3View::Tmove(double Tx,double Ty)

//平移变换矩阵



{

ClearMatrix(TM);


18





RedrawWindow();

TM[0][0]=1; TM[1][1]=1; TM[2][0]=Tx; TM[2][1]=Ty; TM[2][2]=1;

Calculate(P,TM);

AfxGetMainWnd()->SetWindowText("二维几何变换-平移变换");

Draw(P,p3);

}

void CLab3View::Tscale(double Sx,double Sy)

{ ClearMatrix(TS);

//比例变换矩阵

RedrawWindow();



19





TS[0][0]=Sx; TS[1][1]=Sy; TS[2][2]=1;

Calculate(P,TS);

AfxGetMainWnd()->SetWindowText("二维几何变换-比例变换");

Draw(P,p3);

}


{ ClearMatrix(TR);

RedrawWindow();

TR[0][0]=cos(thta*PI/180); TR[0][1]=sin(thta*PI/180);


TR[1][0]=-sin(thta*PI/180); TR[1][1]=cos(thta*PI/180); TR[2][2]=1;


20



Calculate(P,TR);

AfxGetMainWnd()->SetWindowText("二维几何变换-旋转变换");

Draw(P,p3);

}

void CLab3View::Treflect(doubleFx,double Fy) //反射变换矩阵


RedrawWindow();

TF[0][0]=Fx;TF[1][1]=Fy; TF[2][2]=1;

Calculate(P,TF);



21



AfxGetMainWnd()->SetWindowText("二维几何变换-反射变换");

Draw(P,p3);

}

voidCLab3View::Treform(double b,double c) //错切变换矩阵

{ ClearMatrix(TC);

TC[0][0]=1;TC[0][1]=b; TC[1][0]=c; TC[1][1]=1; TC[2][2]=1;

Calculate(P,TC);

AfxGetMainWnd()->SetWindowText("二维几何变换-错切变换");



Draw(P,p3);


22



}

voidCLab3View::KeepMatrix(double Orig[][3],double Dest[][3])

{ int i,j;

for(i=0;i<4;i++)

for(j=0;j<3;j++)
蝿螆}

6.实验数据和实验结果(用屏幕图形表示,可另加附页)

打开Dubuglab3.exe点击菜单栏“绘画”,在工作区绘画,画好后单击


各个功能选项。结果如下:


23



初始图
1

2平移(左移)
3

4.蒁平移(上移)
5.比例(放大)
6.比例(缩小)
7.对称(关于原点对称)
8.旋转(逆时针旋转)
7.改进建议:程序改进之处就是能在菜单栏下加入工具栏,将各个功能的
按钮添加上去(如把“左移”,添加个左移按钮就可以按着按钮连续左移了),
这样就更方便操作了,不必每次都到菜单栏里选功能按了。

评分标准 学 风--报告格式规范,文字清晰 观察能力--正确描述和理解需要操作的问题

操作能力--正确输入程序,熟悉编程环境 调试能力--熟练使用调试功能解决程序错误



24

Copyright © 2019- l2e.cn 版权所有

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务