江苏大学-计算机图形学第三次实验报告-二维图形变换

合集下载

计算机图形学实验:二维图形变换

计算机图形学实验:二维图形变换

实验三 二维图形变换一、实验任务1. 通过二维几何变换的数学模型,编写缩放、旋转、对称变换; 2. 实现图形变换的交互式操作:缩放、旋转、对称变换等;二、实验内容1. 放大缩小变换放大缩小变换公式为:x’=x..S x , y’=y.S y ; 其中S x , S y 分别为x,y 方向的放缩比例系数。

变换矩阵表达式为: [x’ y’(1)S x =S y = 1.5;等比例放大 (2)S x =S y = 0.5;等比例缩小 2. 对称变换包括以x 轴对称、y 轴对称和原点O 对称三种。

由于屏幕坐标只有第一象限,我们可以将原点平移到(500,240)处。

在第一象限画出一个三角形,然后分别求出三个对称图形。

3. 旋转变换将图形上的点(x ,y )旋转θ角度,得到新的坐标(x’,y’)为:x’=xcos θ-ysin θ, y’=xsin θ+ycos θ;[x’ y’ 4.三、设计思路1. 通过二维几何变换的数学模型,编写缩放、旋转、对称变换;2. 以(500,240)为原点建立图形变换的参考坐标系; 3. 通过键盘按键控制图形的缩放、旋转、对称变换;4. 变换图形设定为以Pt[0](540,220)、Pt[1](670,130)、Pt[2](560,120)为顶点的三角形。

步骤:1.建立Trans工程文件;2.利用Resource View设计菜单,如图所示;3.在CTransView视图类中添加消息映射函数;4.添加自定义的成员变量:CPoint Pt[3]; //三角形定点数组float dAngle; //每一次旋转的角度在视图类CPP文件的构造函数中初始化成员变量Pt[0].x = 540; Pt[0].y = 220;Pt[1].x = 670; Pt[1].y = 130;Pt[2].x = 560; Pt[2].y = 120;dAngle = 0;5.在视图类的OnDraw()函数中加入下列代码,实现视图绘图。

计算机图形学实验3------二维几何变换

计算机图形学实验3------二维几何变换

实验三图形的二维几何变换一、实验目的了解齐次坐标规范化及矩阵的乘法运算熟悉掌握平移,比例,旋转,错切变换的齐次坐标矩阵掌握基于 Win32、Visual C++环境MFC绘制图形配置过程制过程二、实验原理及思想1.基本几何变换2.齐次坐标给定2D 坐标 (x, y), 引入第3维:[x, y, 1]通常, 一个 2D 坐标点的齐次坐标有如下形式:[x, y, W]两个齐次坐标点 [x, y, W] and [x’, y’, W’] 相同 if x = kx’eg: [2, 3, 6] = [4, 6, 12]y = ky’for some k ≠ 0 where k=2W = kW’因此,任意 [x, y, W] 可归一化:[x/W, y/W, 1]3.三、实验关键代码void C2DChangeView::ClearMatrix(double A[3][3])//清除变换矩阵{for(int i=0;i<3;i++){for(int j=0;j<3;j++)A[i][j]=0;}}void C2DChangeView::Draw(double D[][3],int n)//绘制图形{RedrawWindow();CClientDC dc(this);CPen pen,*pOldpen;pen.CreatePen(PS_SOLID,2,RGB(0,0,0));pOldpen=dc.SelectObject(&pen);for(int i=0;i<n;i++){if(i==0)dc.MoveTo(ROUND(MaxX/2+D[i][0]),ROUND(MaxY/2-D[i][1]));elsedc.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();}void C2DChangeView::Calculate(double P0[][3],double T[][3])//两个矩阵相乘{double Ptemp[4][3];KeepMatrix(P,Ptemp);for(int i=0;i<4;i++)for(int j=0;j<3;j++)P[i][j]=Ptemp[i][0]*T[0][j]+Ptemp[i][1]*T[1][j]+Ptemp[i][2]*T[ 2][j];}void C2DChangeView::OnMENUleft()//向左平移{// TODO: Add your command handler code hereTmove(-10,0);}void C2DChangeView::OnMENUright()//向右平移{// TODO: Add your command handler code hereTmove(10,0);}void C2DChangeView::OnMENUup() //向上平移{// TODO: Add your command handler code hereTmove(0,10);}void C2DChangeView::OnMENUdown()//向下平移{// TODO: Add your command handler code hereTmove(0,-10);}void C2DChangeView::OnMENUClockwise()//顺时针旋转{// TODO: Add your command handler code hereTrotate(30);}void C2DChangeView::OnMENUAnticlockwise()//逆时针旋转{// TODO: Add your command handler code hereTrotate(-30);}void C2DChangeView::OnMENUIncrease()//放大比例{// TODO: Add your command handler code hereTscale(2,2);}void C2DChangeView::OnMENUDecrease()//缩小比例{// TODO: Add your command handler code hereTscale(0.5,0.5);}void C2DChangeView::OnMENUXdirectionplus()//X正向错切{// TODO: Add your command handler code hereTreform(0,1);}void C2DChangeView::OnMENUXdirectionneg()//X负向错切{// TODO: Add your command handler code hereTreform(0,-1);}void C2DChangeView::OnMENUITYdirectionplus()//Y正向错切{// TODO: Add your command handler code hereTreform(1,0);}void C2DChangeView::OnMENUYdirectionneg()//Y负向错切{// TODO: Add your command handler code hereTreform(-1,0);}void C2DChangeView::OnMENUReset() //复位{// TODO: Add your command handler code hereif(p3==4){KeepMatrix(OSquare,P);}if(p3==3){KeepMatrix(OTriangle,P);}if(p3==2){KeepMatrix(OLine,P);}Draw(P,p3);}void C2DChangeView::Tmove(double Tx,double Ty)//平移变换矩阵{ClearMatrix(TM);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 C2DChangeView::Tscale(double Sx,double Sy)//比例变换矩阵{ClearMatrix(TS);RedrawWindow();TS[0][0]=Sx;TS[1][1]=Sy;TS[2][2]=1;Calculate(P,TS);AfxGetMainWnd()->SetWindowText("二维几何变换-比例变换");Draw(P,p3);}void C2DChangeView::Trotate(double thta)//旋转变换矩阵{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;Calculate(P,TR);AfxGetMainWnd()->SetWindowText("二维几何变换-旋转变换");Draw(P,p3);}void C2DChangeView::Treflect(double Fx,double Fy)//反射变换矩阵{ClearMatrix(TF);RedrawWindow();TF[0][0]=Fx;TF[1][1]=Fy;TF[2][2]=1;Calculate(P,TF);AfxGetMainWnd()->SetWindowText("二维几何变换-反射变换");Draw(P,p3);}void C2DChangeView::Treform(double b,double c)//错切变换矩阵{ClearMatrix(TC);RedrawWindow();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);}void C2DChangeView::KeepMatrix(double Orig[][3],double Dest[][3]){int i,j;for(i=0;i<4;i++)for(j=0;j<3;j++)Dest[i][j]=Orig[i][j];}四、实验结果1. 初始图2 --平移(左移)2 --平移(下移)3 、缩放-——放大3 、缩放-——缩小4 、旋转5 、错切——X负向错切5 、错切——Y正向错切五、心得体会通过这次MFC对计算机图形的编程,进一步掌握了MFC的菜单的实现及其响应函数的实现。

计算机图形学 实验报告(3)

计算机图形学 实验报告(3)

(2)绘制一个由上述顶点所描绘的三角形,实现该三角形进行下列 的几何变化:首先使三角形沿着其中心的x轴,y轴方向缩小50%;然后沿 着初始中心旋转90度;最后沿着y轴平移100个单位。 四、实验结果与数据处理
1、矩形在窗口内沿着水平线匀速移动
代码如下:
实验结果如图示:
2、对一个三角形分别实现平移、缩放、旋转等变化 代码如下:
三、实验内容与步骤 本实验要求完成: 1、实现矩形在窗口内沿着水平线匀速移动; 2、已知某三角形的三顶点坐标为{50.0,25.0},{150.0,25.0},
{100.0,100.0}。 要求:(1)创建一个长宽分别为600、600的窗口,窗口的左上角位于 屏幕坐标(100,100)处。(提示:请试着修改gluOrtho2D函数参数, 使得绘制的三角形尽可能居中显示)
怀化学院数学实验中心
《计算机图形学》 实验报告
学 号实验Biblioteka 点姓 名指导教 师
年级、班 实验时间
实验三 二维图形的几何变换
一、实验目的 1、掌握二维图形的基本几何变换,如平移、旋转、缩放、对称、错
切变换; 2、掌握OpenGL中模型变换函数,实现简单的动画技术。
二、实验设备(环境)及要求 硬件:普通PC386以上微机; 软件:操作系统:Windows XP,Window7; 开发语言: Turbo C 、Visual C++ 6.0、OpenGl,或其它学生掌握 的高级语言。
结果如图示:
五、分析与讨论 通过本实验的学习,我了解了二维图形的基本几何变换,如平移、
旋转、缩放、对称、错切变换;了解了OpenGL中模型变换函数,实现
简单的动画技术,在老师同学的帮助下运用OpenGL实现了矩形在窗口 内沿着水平线匀速移动。

计算机图形学实验报告4

计算机图形学实验报告4

《计算机图形学》实验报告实验九 二维图形变换一、实验教学目标与基本要求1.掌握图形变换的基本算法原理;2.实现若干典型二维图形变换算法。

二.理论基础1.生成前几次实验中的基本图形;2.对生成的基本图形进行平移、旋转、放缩、对称等变换。

3. 对计算机绘图的原理有一定的认识。

三.算法设计与分析 1.二维变换1. 平移变换2.比例变换• Sx = Sy =1等比例变换• Sx = Sy >1 放大 • Sx = Sy <1 缩小[][][]100**1101011x yxyx y xyx T y T T T ⎡⎤⎢⎥=∙=++⎢⎥⎢⎥⎣⎦[][]100**1101011x y xyx y xyT T x T y T ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦⎡⎤=++⎣⎦[][][]00**11000011xy x y S x y xyS S xS y∙∙⎡⎤⎢⎥=∙⎢⎥⎢⎥⎣⎦=• Sx ≠ Sy ≠13.对称变换当b=d =0, a =-1, e =1时关于Y 轴对称当b=d =0, a =1, e =-1时关于X 轴对称当b=d =0, a =-1, e =-1时关于原点对称当b=d =1, a =e =0时关于直线y=x 对称当b=d =-1, a =e =0时[][][]0**1100011a d x y xyb e a x b yd x ey⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦=++[][]''100110100011x yx yxy-⎡⎤⎢⎥⎡⎤=⎣⎦⎢⎥⎢⎥⎣⎦=-[][]''10011010011x y x y x y ⎡⎤⎢⎥⎡⎤=-⎣⎦⎢⎥⎢⎥⎣⎦=-[][]''100110100011x y xyx y-⎡⎤⎢⎥⎡⎤=-⎣⎦⎢⎥⎢⎥⎣⎦=--[][]''10111000011x yx yyx⎡⎤⎢⎥⎡⎤=⎣⎦⎢⎥⎢⎥⎣⎦=[][]''010*******11xyx yyx-⎡⎤⎢⎥⎡⎤=-⎣⎦⎢⎥⎢⎥⎣⎦=--关于直线y=-x 对称4.旋转变换绕原点逆时针旋转θ5.错切变换• 当d=0时,x*=x+by,y*=y ,沿x 方向错切位移• 当b=0时,x*=x,y*=dx+y, 沿y 方向错切位移 • 当b ≠0时,当d ≠0时,x*=x+by,y=dx+y6.复合变换----复合平移对同一图形做两次平移相当于将两次的平移两加起来:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡++=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⋅=1010001101000110100012121221121y y x x y x y x t t t T T T T T T T T T T T复合变换----复合缩放⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⋅⋅=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⋅=1000000100000010000002121221121y y x x y x y x s s s s s s s s s s s T T T[][]''co s sin 011sin co s 001co s sin sin co s 1x yxyx y x y θθθθθθθθ⎡⎤⎢⎥⎡⎤=-⎣⎦⎢⎥⎢⎥⎣⎦=-+[][][]10**1110101d x y xybx b y d x y⎡⎤⎢⎥=∙=++⎢⎥⎢⎥⎣⎦复合变换----复合旋转⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡++-++=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=⋅=1000)cos()sin(0)sin()cos(1000cos sin 0sin cos 1000cos sin 0sin cos 212121212222111121θθθθθθθθθθθθθθθθr r r T T T复合变换----关于F (xf,yf)点的缩放变换先把坐标系平移到(xf,yf),在新的坐标系下做比例变换,然后再将坐标原点平移回去。

[VIP专享]计算机图形学上机实验3_实现二维图形的各种转换

[VIP专享]计算机图形学上机实验3_实现二维图形的各种转换

昆明理工大学理学院信息与计算科学专业操作性实验报告年级: 10级姓名:刘陈学号: 201011101128 指导教师:胡杰实验课程名称:计算机图形学程序设计开课实验室:理学院机房216 实验成绩:学风(5)观察能力(15)操作能力(30)调试能力(50)其它总分实验内容:1.实验/作业题目:用计算机高级语言VC++6.0实现计算机的基本图元绘制2.实验/作业课时:2学时3.实验过程(包括实验环境、实验内容的描述、完成实验要求的知识或技能):实验环境:(1)硬件:每人一台PC机(2)软件:windows OS,VC++6.0或以上版本。

试验内容及步骤:(1)在VC++环境下创建MFC应用程序工程(单文档)(2)编辑菜单资源(3)添加菜单命令消息处理函数(4)添加成员函数(5)编写函数内容试验要求:(1)熟悉掌握平移、比例、旋转、对称、错切变换的矩阵及矩阵的乘法运算。

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

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

(4)书写试验报告上交。

4.程序结构(程序中的函数调用关系图)5.算法描述、流程图或操作步骤:在lab3View.h文件中的public内添加变量:void ClearMatrix(double A[3][3]); //清除变换矩阵void GetMaxY(); //获得屏幕的最大y值void GetMaxX(); //获得屏幕的最大x值void Draw(double D[][3],int); //绘制图形void Calculate(double P0[][3],double T[][3]); //矩阵相乘void KeepMatrix(double Orig[][3],double Dest[4][3]); //保留矩阵值void Tmove(double Tx,double Ty); //平移变换计算void Tscale(double Sx,double Sy); //比例变换计算void Trotate(double thta); //旋转变换计算void Treflect(double Fx,double Fy); //对称变换计算void Treform(double b,double c); //错切变换计算在lab3View.h文件中的protected内添加变量: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 TC[3][3]; //错切变换矩阵double OSquare[4][3]; //矩形坐标double OTriangle[4][3]; //正三角形坐标double OLine[4][3]; //直线坐标int p3;在lab3View.cpp文件中添加如下头文件:#define ROUND(a) int(a+0.5) //四舍五入#define PI 3.1415926 //圆周率#include "math.h" //数学头文件在lab3View.cpp文件中的函数CLab3View::OnDraw(CDC* pDC)下添加如下代码:GetMaxX();GetMaxY();pDC->MoveTo(MaxX/2,0); //绘制坐标轴pDC->LineTo(MaxX/2,MaxY);pDC->MoveTo(0,MaxY/2);pDC->LineTo(MaxX,MaxY/2);在lab3View.cpp文件中添加如下的各个消息处理函数及代码:void CLab3View::GetMaxX() //获得屏幕宽度{ CRect Rect;GetClientRect(&Rect);MaxX=Rect.right;}void CLab3View::GetMaxY() //获得屏幕高度{ CRect Rect;GetClientRect(&Rect);MaxY=Rect.bottom;}void CLab3View::ClearMatrix(double A[3][3]) //清除变换矩阵{ for(int i=0;i<3;i++){ for(int j=0;j<3;j++)A[i][j]=0; }}void CLab3View::OnTriangle() //菜单函数{{ 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;p3=3;KeepMatrix(P,OTriangle);Draw(P,p3); }InvalidateRect(NULL,FALSE); //重画窗口}void CLab3View::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[2][0]=100/2;P[2][1]=-100/2;P[2][2]=1;P[3][0]=-100/2;P[3][1]=-100/2;P[3][2]=1;p3=4;KeepMatrix(P,OSquare);Draw(P,p3); }InvalidateRect(NULL,FALSE); //重画窗口}void CLab3View::OnLine() //菜单函数{{ P[0][0]=-150/2;P[0][1]=0;P[0][2]=1; //绘制直线P[1][0]=150/2;P[1][1]=0;P[1][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;KeepMatrix(P,OLine);Draw(P,p3); }InvalidateRect(NULL,FALSE); //重画窗口}void CLab3View::Draw(double D[][3],int n) //绘制图形{ RedrawWindow();CClientDC dc(this);CPen pen,*pOldpen;pen.CreatePen(PS_SOLID,2,RGB(0,0,0));pOldpen=dc.SelectObject(&pen);for(int i=0;i<n;i++){ if(i==0)dc.MoveTo(ROUND(MaxX/2+D[i][0]),ROUND(MaxY/2-D[i][1]));elsedc.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();}void CLab3View::Calculate(double P0[][3],double T[][3]) //两个矩阵相乘{ double Ptemp[4][3];KeepMatrix(P,Ptemp);for(int i=0;i<4;i++)for(int j=0;j<3;j++)P[i][j]=Ptemp[i][0]*T[0][j]+Ptemp[i][1]*T[1][j]+Ptemp[i][2]*T[2][j];} void CLab3View::OnMENUleft() //向左平移{ Tmove(-10,0); }void CLab3View::OnMENUright() //向右平移{ Tmove(10,0); }void CLab3View::OnMENUup() //向上平移{ Tmove(0,10); }void CLab3View::OnMENUdown() //向下平移{ Tmove(0,-10); }void CLab3View::OnMENUClockwise( ) //顺时针旋转{ Trotate(30); }void CLab3View::OnMENUAnticlockwise() //逆时针旋转{ Trotate(-30); }void CLab3View::OnMENUIncrease() //放大比例{ Tscale(2,2); }void CLab3View::OnMENUDecrease() //缩小比例{ Tscale(0.5,0.5); }void CLab3View::OnMENUXaxis() //X轴对称{ Treflect(1,-1); }void CLab3View::OnMENUYaxis() //Y轴对称{ Treflect(-1,1); }void CLab3View::OnMENUorg() //原点对称{ Treflect(-1,-1); }void CLab3View::OnMENUXdirectionplus() //X正向错切{ Treform(0,1); }void CLab3View::OnMENUXdirectionneg() //X负向错切{Treform(0,-1); }void CLab3View::OnMENUITYdirectionplus() //Y正向错切{ Treform(1,0); }void CLab3View::OnMENUYdirectionneg() //Y负向错切{ Treform(-1,0); }void CLab3View::OnMENUReset() //复位{if(p3==4){ KeepMatrix(OSquare,P);}if(p3==3){ KeepMatrix(OTriangle,P);}if(p3==2){ KeepMatrix(OLine,P);}Draw(P,p3);}void CLab3View::Tmove(double Tx,double Ty) //平移变换矩阵{ ClearMatrix(TM);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();TS[0][0]=Sx; TS[1][1]=Sy; TS[2][2]=1;Calculate(P,TS);AfxGetMainWnd()->SetWindowText("二维几何变换-比例变换");Draw(P,p3);}void CLab3View::Trotate(double thta)//旋转变换矩阵{ 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;Calculate(P,TR);AfxGetMainWnd()->SetWindowText("二维几何变换-旋转变换");Draw(P,p3);}void CLab3View::Treflect(double Fx,double Fy) //反射变换矩阵{ ClearMatrix(TF);RedrawWindow();TF[0][0]=Fx; TF[1][1]=Fy; TF[2][2]=1;Calculate(P,TF);AfxGetMainWnd()->SetWindowText("二维几何变换-反射变换");Draw(P,p3);}void CLab3View::Treform(double b,double c) //错切变换矩阵{ ClearMatrix(TC);RedrawWindow();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);}void CLab3View::KeepMatrix(double Orig[][3],double Dest[][3]){ int i,j;for(i=0;i<4;i++)for(j=0;j<3;j++)Dest[i][j]=Orig[i][j];}6.实验数据和实验结果(用屏幕图形表示,可另加附页):打开Dubug内lab3.exe点击菜单栏“绘画”,在工作区绘画,画好后单击各个功能选项。

实验二维图形基本变换

实验二维图形基本变换

实验一二维图形的基本变换一.实验目的1、掌握CAD图形处理的原理和方法;2、通过上机操作,熟悉多边形的平移、比例和旋转变换,掌握二维图形的基本变换。

3、理解CAD对图形进行复合变换(平移、比例和旋转变换)的过程。

二.实验要求1、上机调试所编程序,实现图形的绘制、平移变换、比例变换和旋转变换。

2、二维图形各点的坐标、平移、比例、旋转角度可由用户任意输入,原图形和变换后的图形必须同时显示在显示器上。

三.实验设备1、计算机系统;2、安装Turbo C或其他C语言集成开发工具四.实验原理在计算机图形处理中,经常需要对已经生成的图形进行几何变换处理。

例如,改变原始图形的大小、移动图形到某一指定位置或根据需要将图形旋转某一个角度,这就要求图形的处理软件能够实现缩放、平移、旋转等几何变换。

由于点是构成一个几何形体的最基本的元素,而一幅二维图形可以看成是一个点集,如三角形有三个特征点……,因此,我们就可以把对图形的几何变换归结对点的变换。

通过对构成几何图形的特征点集的几何变换即可实现整个图形的几何变换。

即如何实现一个旧点到变化后新点的计算求解是本次实验的重点。

我们给出平移、比例、旋转变换的矩阵分别为:平 移: T t =⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1010001n m (m,n 分别为x,y 方向上的平移量) 全比例: T s =⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1000000b a (a,b 分别为x,y 方向上的比例因子)旋 转: T r =⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-1000cos sin 0sin cos θθθθ (θ为旋转角,逆时针为正)假设一几何图形由A(x A,y A ) B(x B ,y B ) C(x C ,y C ) D(x D ,y D )四点组成,那么变换后四点坐标为A ’(x ’A,y ’A ) B ’(x ’B ,y ’B ) C ’(x ’C ,y ’C ) D ’(x ’D ,y ’D )平移:⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111''''''''D D C C B B A A Y X Y X Y X Y X =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B A A Y X Y X Y X Y X T t =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B A A Y X Y X Y X Y X ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1010001n m =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡++++++++1111n Y m X n Y m X n Y m X n Y m X D D C C B B A A 比例:⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111''''''''D D C C B B A A Y X Y X Y X Y X =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B A A Y X Y X Y X Y X T s =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B A A Y X Y X Y X Y X ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1000000b a =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B B A bY aX bY aX bY aX bY aX旋转:⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111''''''''D D C C B B A A Y X Y X Y X Y X =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B A A Y X Y X Y X Y X T r =⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡1111D D C C B B A A Y X Y X Y X Y X ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-1000cos sin 0sin cos θθθθ =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡+-+-+-+-1cos sin sin cos 1cos sin sin cos 1cos sin sin cos 1cos sin sin cos θθθθθθθθθθθθθθθθC D D D C C C C B B B BA A A A Y X Y X Y X Y X Y X Y X Y X Y X 由以上的推导过程,我们得到变换前点与变化后点的关系,进而可以用图形处理软件实现相应的变换。

计算机图形学与可视化实验报告.

计算机图形学与可视化实验报告.

第一章实验目的1.1 实验任务(目的)实现图形的几何变换,包括平移变换、比例变换、旋转变换、对称变换、错切变换。

原理:1二维图行由点或直线段组成2直线段可由其端点坐标定义3二维图形的几何变换:对点或对直线段端点的变换P[x,y]=>P[x’,y’]1.2 实验环境(简称VS)是美国的开发工具包系列产品。

VS是一个基本的开发工具集,它包括了整个中所需要的大部分工具,如UML工具、代码管控工具、(IDE)等等。

所写的目标代码适用于微软支持的所有平台,包括、、、、和Microsoft 及。

是目前最流行的平台应用程序的开发环境。

最新版本为Visual Studio 2017 版本,基于.NET Framework 4.5.2 。

[1]第二章实验过程2.1实现流程1). 平移变换(translation): 将一点沿直线路径从一个坐标位置移到另一个坐标位置的重定位过程。

平移矢量T x 和Ty[x’ y’ 1]=[ x y 1][ Tx 0 0; 0 Ty 0; 0 0 1]=[x+Tx y+Ty 1];2). 比例变换(scale):相对于原点的比例变换,Sx平行于x 轴的方向上的缩放量, Sy平行于y 轴的方向上的缩放量;[x’ y’ 1]=[x y 1][Sx 0 0; 0 Sy 0; 0 0 1]=[xSx ySy 1];当Sx=Sy变换前的图形与变换后的图形相似.当Sx=Sy>1时,图形将放大,并远离坐标原点,当Sx=Sy<1时,图形将缩小,并靠近坐标原点,.当Sx!=Sy时,图形将发生畸变;//当Sx=Sy时,变换成为整体比例变换[x* y* 1]=[x y 1][1 0 0; 0 1 0; 0 0 S]=[x y S]=[x/S y/S 1]整体比例变换时,若S>1,图形整体缩小;若0<S<1, ,图形整体放大;若S<0,发生关于原点的对称等比变换;3). 旋转变换(rotation): 点P绕原点逆时针转θ度角(设逆时针旋转方向为正方向)逆时针旋转θ度角[x’ y’ 1]=[ x y 1][cosθsinθ0; -sinθcosθ0; 0 0 1];顺时针旋转θ度角[x’ y’ 1]=[ x y 1][cosθ-sinθ0; sinθcosθ0; 0 0 1];4). 对称变换也称为反射变换或镜像变换(symmetry),变换后的图形是原图形关于某一轴线或原点的镜像.关于X轴对称[x’ y’ 1]=[ x y 1][1 0 0; 0 -1 0; 0 0 1]=[x -y 1];关于Y轴对称[x’ y’ 1]=[ x y 1][-1 0 0; 0 1 0; 0 0 1]=[-x y 1];关于Y=-X对称[x’ y’ 1]=[ x y 1][0 -1 0; -1 0 0; 0 0 1]=[-y -x 1];关于Y=X对称[x’ y’ 1]=[ x y 1][0 1 0; 1 0 0; 0 0 1]=[y x 1];关于原点对称[x’ y’ 1]=[ x y 1][-1 0 0; 0 -1 0; 0 0 1]=[-x -y 1];5). 错切变换(shear)1.沿x轴方向关于y轴错切:将图形上关于y轴的平行线沿x方向推成θ角的倾斜线,而保持y坐标不变a=(x’-x)/y[x’ y’ 1]=[x y 1][1 0 0; a 1 0; 0 0 1]=[x+ay y 1];2.沿y轴方向关于x轴错切:将图形上关于x轴的平行线沿y方向推成θ角的倾斜线,而保持x坐标不变b=(y’-y)/x[x’ y’ 1]=[x y 1][1 b 0; 0 1 0; 0 0 1]=[xbx+y 1];简单的变换生成程序为:// 向上平移50个单位长度void CTwoDimensionTransformationsView::Onup() {ClearMatrix(TM);for(int i=0;i<3;i++)TM[i][i]=1;TM[2][1]=50;CalMatrix(P,TM);Invalidate();}效果图如下://向下平移50个单位长度void CTwoDimensionTransformationsView::Ondown() {ClearMatrix(TM);for(int i=0;i<3;i++)TM[i][i]=1;TM[2][1]=-50;CalMatrix(P,TM);Invalidate();}效果图如下://向左平移50个单位长度void CTwoDimensionTransformationsView::OnLeft() {ClearMatrix(TM);for(int i=0;i<3;i++)TM[i][i]=1;TM[2][0]=-50;CalMatrix(P,TM);Invalidate();//触发调用OnDraw()函数的事件}// 向右平移50个单位长度void CTwoDimensionTransformationsView::OnRight() {ClearMatrix(TM);for(int i=0;i<3;i++)TM[i][i]=1;TM[2][0]=50;CalMatrix(P,TM);Invalidate();//触发调用OnDraw()函数的事件}效果图如下:void CTwoDimensionTransformationsView::Onscale() {ClearMatrix(TS);for(int i=0;i<3;i++)TS[i][i]=0.2;TS[3][3]=1;CalMatrix(P,TS);Invalidate();}//变成原来的5倍效果图如下:void CTwoDimensionTransformationsView::Onrotation() {ClearMatrix(TR);TR[0][0]=sqrt(3.0)/2;TR[0][1]=0.5;TR[1][0]=-0.5;TR[1][1]=sqrt(3.0)/2;TR[2][2]=1;CalMatrix(P,TR);Invalidate();}//逆时针旋转30度效果图如下://反射变换相对于x轴对称void CTwoDimensionTransformationsView::Ontraslation() {ClearMatrix(TF);TF[0][1]=1;TF[1][1]=-1;TF[2][2]=1;CalMatrix(P,TF);Invalidate();}//错切变换void CTwoDimensionTransformationsView::Onshear() {ClearMatrix(TC);TC[0][0]=1;TC[1][0]=3;TC[1][1]=1;TC[2][2]=1;CalMatrix(P,TC);Invalidate();}6).关于复合变换,分解成简单变换,再利用反对称变换得到最终结果。

计算机图形学二维几何变换

计算机图形学二维几何变换
可利用矩阵形式表示成:
简记成p‘=P*S,
其中
是比例变换矩阵。
3
3.1.3 二维对称变换
二维对称变换(或称反射变换)是产生物体镜像的一种变 换,该变换实际上是比例变换的几种特殊情况。 1、以y轴为对称线的对称变换 2、以x轴为对称线的对称变换
3、以原点为对称的对称变换
4、以直线y=x为对称线的对称变换 5、以直线y=-x为对称线的对称变矩换阵表矩示阵形表式示为形:式为:
图元点的坐标值满足关系式 x'=xcosθ-ysinθ
y'=xsinθ+ycosθ
用矩阵形式表示成[x’ y’]=[x y] ·[
]
简记为P'=P·R,其中 转变换矩阵。
是旋
5
3.1.5 二维错切变换
二维错切变换:是一种会使物体形状发生变化的 变换。常用的错切变换有两种:
1、图形沿x方向的错切
2、图形沿y方向的错切
步骤(2)
变换后的图形
(1)平移物体使固定点与坐标原点重合; (2)相对于坐标原点的比例变换; (3)平移物体使固定点回到原始位置。
11
该变换顺序的复合变换矩阵为:
12
3.1 二维几何变换
二维几何变换就是在平面上对二维点的 坐标进行变换,从而形成新的坐标。主 要包括:平移、比例、对称、旋转、错 切、仿射和复合变换。
13Βιβλιοθήκη 1.1 二维平移变换如图所示,它使图形移动位置。新图p‘的每一图元点是 原图形p中每个图元点在x和y方向分别移动Tx和Ty产生, 所以对应点之间的坐标值满足关系式 x'=x+Tx y'=y+Ty
结论:平移、比例、对称、旋转和错切变换是 二维仿射变换的特例,任何常用的二维仿射变 换总可表示为这五种变换的组合。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机科学与通信工程学院实验报告课程计算机图形学实验题目二维图形变换学生姓名学号专业班级指导教师日期成绩评定表二维图形变换1. 实验内容完成对北极星图案的缩放、平移、旋转、对称等二维变换。

首先要建好图示的北极星图案的数据模型(顶点表、边表)。

另外,可重复调用“清屏”和“暂停”等函数,使整个变换过程具有动态效果。

2. 实验环境操作系统:Windows XP开发工具:visual studio 20083. 问题分析为了建立北极星图形,首先在二维空间中根据坐标绘制出北极星图形。

并且在此坐标系中确定好走笔顺序以便于进行连线操作。

同时需要好好的使用清屏函数以使得显示正常。

1. 放大缩小变换放大缩小变换公式为:x’=x.a, y’=y.d; 其中a,d分别为x,y方向的放缩比例系数。

可通过不同的比例系数来显示程序运行结果。

当a=d时为等比例放缩操作。

可令变换矩阵为T。

2. 对称变换包括以x轴对称、y轴对称和原点O对称三种。

由于屏幕坐标只有第一象限,我们可以将原点平移到(500,240)处。

在第一象限画出一个三角形,然后分别求出三个对称图形。

3. 旋转变换将图形上的点(x,y)旋转θ角度,得到新的坐标(x’,y’)为:x’=xcosθ-ysinθ, y’=xsinθ+ycosθ;旋转矩阵T为4.平移变换4. 算法设计5. 源代码//北极星void hzbjx(CDC* pDC,long x[18],long y[18]){CPen newPen1,*oldPen;newPen1.CreatePen(PS_SOLID,2,RGB(255,0,0));oldPen = pDC->SelectObject(&newPen1);POINTvertex1[11]={{x[1],y[1]},{x[2],y[2]},{x[3],y[3]},{x[4],y[4]},{x[5],y[5]},{x[3],y[3]},{x[1],y[1]},{x[6],y[6]},{ x[3],y[3]},{x[7],y[7]},{x[5],y[5]}};pDC->Polyline(vertex1, 11);newPen1.DeleteObject();newPen1.CreatePen(PS_SOLID, 2, RGB(0,255,0));oldPen = pDC->SelectObject(&newPen1);POINT vertex2[5]={{x[6],y[6]},{x[8],y[8]},{x[9],y[9]},{x[3],y[3]},{x[8],y[8]}};pDC->Polyline(vertex2, 5);POINT vertex3[5]={{x[4],y[4]},{x[10],y[10]},{x[11],y[11]},{x[3],y[3]},{x[10],y[10]}};pDC->Polyline(vertex3, 5);newPen1.DeleteObject();newPen1.CreatePen(PS_SOLID, 2, RGB(255,0,90));oldPen = pDC->SelectObject(&newPen1);POINTvertex4[11]={{x[12],y[12]},{x[13],y[13]},{x[3],y[3]},{x[9],y[9]},{x[14],y[14]},{x[15],y[15]},{x[3],y[3]},{x[ 11],y[11]},{x[12],y[12]},{x[3],y[3]},{x[14],y[14]}};pDC->Polyline(vertex4, 11);newPen1.DeleteObject();newPen1.CreatePen(PS_SOLID, 2, RGB(0,100,255));oldPen = pDC->SelectObject(&newPen1);POINT vertex5[5]={{x[15],y[15]},{x[16],y[16]},{x[3],y[3]},{x[16],y[16]},{x[7],y[7]}};pDC->Polyline(vertex5, 5);POINT vertex6[5]={{x[2],y[2]},{x[17],y[17]},{x[3],y[3]},{x[17],y[17]},{x[13],y[13]}};pDC->Polyline(vertex6, 5);pDC->SelectObject(oldPen);Sleep(10);}void CDiamondView::Polaris(){InvalidateRgn(NULL);UpdateWindow();CDC *pDC = GetDC();long x[18],y[18];x[1]=553,y[1]=100;x[2]=515,y[2]=251;x[3]=553,y[3]=338;x[4]=516,y[4]=426;x[5]=553,y[5]=551;x[6]=589,y[6]=253;x[7]=591,y[7]=426;x[8]=678,y[8]=212;x[9]=641,y[9]=311;x[10]=454,y[10]=438;x[11]=478,y[11]=364;x[12]=415,y[12]=338;x[13]=466,y[13]=301;x[14]=703,y[14]=338;x[15]=640,y[15]=375;x[16]=665,y[16]=450;x[17]=440,y[17]=226;hzbjx(pDC,x,y);Sleep(500);InvalidateRect(NULL);UpdateWindow();long x1[18],y1[18]; //缩小for(double n=1;n>=0.5;n-=0.01) {for (int i=1;i<18;i++){x1[i]=Round(x[i]*n);y1[i]=Round(y[i]*n);}hzbjx(pDC,x1,y1);Sleep(10);InvalidateRect(NULL);UpdateWindow();}InvalidateRect(NULL); UpdateWindow();long x2[18],y2[18]; //放大for(double n=1;n<=1.5;n+=0.01) {for (int i=1;i<18;i++){x2[i]=Round(x1[i]*n);y2[i]=Round(y1[i]*n);}hzbjx(pDC,x2,y2);Sleep(10);InvalidateRect(NULL);UpdateWindow();}InvalidateRect(NULL); UpdateWindow();hzbjx(pDC,x,y);Sleep(500);long x3[18],y3[18]; //沿X轴平移for(int n=0;n<=300;n+=2){for(int j=1;j<18;j++){x3[j]=x[j]+n;y3[j]=y[j];}hzbjx(pDC,x3,y3);Sleep(1);InvalidateRect(NULL); UpdateWindow();}long x4[18],y4[18]; //沿Y轴平移for(int n=0;n<=300;n+=2){for(int j=1;j<18;j++){x4[j]=x3[j];y4[j]=y3[j]+n;}hzbjx(pDC,x4,y4);Sleep(1);InvalidateRect(NULL); UpdateWindow();}long x5[18],y5[18]; //顺时针旋转for (double t=0;t<=PI;t+=0.01){for(int k=1;k<18;k++){x5[k]=Round(x[k]*cos(t)-y[k]*sin(t)-x[3]*cos(t)+y[3]*sin(t)+x[3]);y5[k]=Round(x[k]*sin(t)+y[k]*cos(t)-x[3]*sin(t)-y[3]*cos(t)+y[3]);}hzbjx(pDC,x5,y5);InvalidateRect(NULL);UpdateWindow();}Sleep(500);long x6[18],y6[18]; //逆时针旋转for (double t=PI;t>=0;t-=0.01){for(int k=1;k<18;k++){x6[k]=Round(x[k]*cos(t)-y[k]*sin(t)-x[3]*cos(t)+y[3]*sin(t)+x[3]);y6[k]=Round(x[k]*sin(t)+y[k]*cos(t)-x[3]*sin(t)-y[3]*cos(t)+y[3]);}hzbjx(pDC,x6,y6);InvalidateRect(NULL);UpdateWindow();}Sleep(500);long x7[18],y7[18];//沿X=1000对称for(int l=1;l<18;l++){x[l]=Round(x[l]*0.5);y[l]=Round(y[l]*0.5);x7[l]=1000-x[l];y7[l]=y[l];}hzbjx(pDC,x,y);hzbjx(pDC,x7,y7);Sleep(200);long x8[18],y8[18];//沿Y=600对称for(int l=1;l<18;l++){x8[l]=x[l];y8[l]=600-y[l];}hzbjx(pDC,x,y);hzbjx(pDC,x8,y8);Sleep(200);long x9[18],y9[18];for(int l=1;l<18;l++){x9[l]=1000-x[l];y9[l]=600-y[l];}hzbjx(pDC,x,y);hzbjx(pDC,x9,y9);}6. 程序运行结果图1 北极星图案的数据模型图2 北极星图案的缩放图3 北极星图案的平移图4 北极星图案的旋转图5 北极星图案的对称7. 总结在这次的实验中,我根据图形变换的基本原理简单实现了图形的几种变换。

但是由于自己对框架和函数运用的不熟悉,在实验中遇到了一些本可以被避免的困难。

因此,以后必须要在这方面有所改进。

通过这次的实验,我知道了如何利用程序进行二维图形的一些基本变换。

在以后的学习过程我还需要不断努力,这样才能在这门课程的学习中有所收获。

相关文档
最新文档