羄昆明 理 工 大 学 理 学 院
袂信息与计算科学专业 操作性实验报告
蒀年级:10级 姓名: 刘陈 学号: 1128 指导教师: 胡
杰
莆实验课程名称:计算机图形学程序设计 开课实验室: 理学院机房216
肃实验成绩:
节学风(5) | 芁观察能力(15) | 蒈操作能力(30) | 蒅调试能力(50) | 蚁其 | 羁总分 |
芅 | 薄 | 膀淘 | 网 | 芆 | 羆 |
芈1.实验/作业题目:用计算机高级语言VC++6.0实现计算机的基本图元绘制
莈2.实验/作业课时:2学时
肄3.实验过程(包括实验环境、实验内容的描述、完成实验要求的知识或技
能):
1
芃实验环境:(1)硬件:每人一台PC机
羈(2)软件:windows OS,VC++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.实验数据和实验结果(用屏幕图形表示,可另加附页):
肈打开Dubug内lab3.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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务