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

合集下载

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

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

实验三 二维图形变换一、实验任务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
结论:平移、比例、对称、旋转和错切变换是 二维仿射变换的特例,任何常用的二维仿射变 换总可表示为这五种变换的组合。

图形学实验报告六-二维图形的几何变换

图形学实验报告六-二维图形的几何变换

贵州大学实验报告学院:计算机科学与信息学院专业:计算机科学与技术班级:101姓名学号实验组 6 实验时间2013.5.9 指导教师吴云成绩实验项目名称二维图形的几何变换实验目的掌握二维图形的基本几何变换:位置改变(平移、旋转)和变形(缩放、错切,反射、投影等)以及复合变换。

实验要求1、在VS2010环境下利用C#编程实现画二维图形的几何变换。

2、给出代码。

3、附上结果截图。

实验原理标准齐次坐标(x,y,1) 二维变换的矩阵表示平移变换旋转变换放缩变换平移变换只改变图形的位置,不改变图形的大小。

旋转变换不改变图形的形状放缩变换引起图形形状的变化。

复合变换结果与变换的顺序有关(矩阵乘法不可交换)例:对一矩形先缩放S(2,0.5),再旋转R(p/6)。

对称变换关于x轴的对称变换:关于y轴的对称变换:实验环境VS2010(C#)实验步骤1. 掌握算法原理;2. 依据算法,编写源程序并进行调试;下面缩放变化的算法实现:private void TriangleChange()//缩?小?{Pen pen = new Pen(Color.Gray, 2);int x, y;x = point.X + 50;y = point.Y - 100;Point[] points ={new Point(x,y),new Point((x+point.X+10)/2,(y+point.Y-20)/2),new Point((x+point.X+80)/2,(y+point.Y-50)/2) };graphics.DrawPolygon(pen, points);}下面是旋转变化的算法实现:实验内容1.设有一三角形ABC,其中三个顶点为A(5,10),B(1,2),C(8,5),如三角形的顶点A不变,将AB和AC边缩小一倍后,求缩小后的三角形对于直线-2x+4y+3=0的对称变换后的结果图。

2.将一四边形以原点为中心,以15°为间隔旋转。

计算机图形学实验报告几何变换

计算机图形学实验报告几何变换

计算机图形学实验报告计算机图形学实验报告姓名徐沛华班级1011 学号20101851 成绩实验名称二维图形的几何变换1.对平面图形进行平移、缩放、旋转、对称实验目的实验步骤算法分析:图形变换是指对图形的几何信息经过几何变换后产生新的图形。

图形变换既可以看作坐标系不动而图形变动,变动后的图形在坐标系中的坐标值发生变化;也可以看作图形不动而坐标系变动,变动后,该图形在新的坐标系下具有新的坐标值。

设(x,y)为图形原坐标值,经几何变换后坐标值变为(**,x y)。

以下为四种常用的几何变换公式。

(a) 平移变换:平移变换在前面的任务中已经用到过,它的变换公式为:[]**100,,1,,1010,,11x yx yx y x y x T y TT T⎡⎤⎢⎥⎡⎤⎡⎤==++⎢⎥⎣⎦⎣⎦⎢⎥⎣⎦(b) 旋转变换:绕原点旋转的变换公式为:[][] **cos sin0,,1,,1sin cos0cos sin,sin cos,1001x y x y x y x yθθθθθθθθ⎡⎤⎢⎥⎡⎤=-=⋅-⋅⋅+⋅⎣⎦⎢⎥⎢⎥⎣⎦(c) 放缩变换:[]**00,,1,,100,,1001xy x ySx y x y S S x S y⎡⎤⎢⎥⎡⎤⎡⎤==⋅⋅⎣⎦⎣⎦⎢⎥⎢⎥⎣⎦几种变换可以组合在一起形成复合变换。

例如平移变换与旋转变换组合得到:(d) 相对点00(,)x y的旋转变换:[]**0000cos sin0 ,,1,,1sin cos0(1cos)sin(1cos)sin1 x y x yx y y xθθθθθθθθ⎡⎤⎢⎥⎡⎤=-⎣⎦⎢⎥⎢⎥-⋅+⋅-⋅-⋅⎣⎦ii、算法程序:void CZhouView::pingyi(){CClientDC dc(this);dc.MoveTo(m_nPoint1.x,m_nPoint1.y);dc.LineTo(m_nPoint2.x,m_nPoint2.y);dc.MoveTo(m_nPoint1.x+100,m_nPoint1.y+100);dc.LineTo(m_nPoint2.x+100,m_nPoint2.y+100);}void CZhouView::xuanzhuan(){CClientDC dc(this);dc.MoveTo(m_nPoint1.x,m_nPoint1.y);dc.LineTo(m_nPoint2.x,m_nPoint2.y);dc.MoveTo((m_nPoint1.x*cos(0.5))-(m_nPoint1.y*sin(0.5)),(m_nPoint 1.x*sin(0.5))+(m_nPoint1.y*cos(0.5)));dc.LineTo((m_nPoint2.x*cos(0.5))-(m_nPoint2.y*sin(0.5)),(m_nPoint2 .x*sin(0.5))+(m_nPoint2.y*cos(0.5)));}void CZhouView::bili(){CClientDC dc(this);dc.MoveTo(m_nPoint1.x,m_nPoint1.y);dc.LineTo(m_nPoint2.x,m_nPoint2.y);dc.MoveTo(m_nPoint1.x*2,m_nPoint1.y*2);dc.LineTo(m_nPoint2.x*2,m_nPoint2.y*2);}void CZhouView::XCQ(){CClientDC dc(this);dc.MoveTo(m_nPoint1.x,m_nPoint1.y);dc.LineTo(m_nPoint2.x,m_nPoint2.y);dc.MoveTo(m_nPoint1.x,m_nPoint1.y);dc.LineTo(m_nPoint2.x+100,m_nPoint2.y);}void CZhouView::DC(){CClientDC dc(this);dc.MoveTo(m_nPoint1.x,m_nPoint1.y);dc.LineTo(m_nPoint2.x,m_nPoint2.y);dc.MoveTo(m_nPoint1.y,m_nPoint1.x);dc.LineTo(m_nPoint2.y,m_nPoint2.x);}dc.MoveTo(m_nPoint1.y,m_nPoint1.x);dc.LineTo(m_nPoint2.y,m_nPoint2.x);}void CZhouView::YCQ(){CClientDC dc(this);dc.MoveTo(m_nPoint1.x,m_nPoint1.y);dc.LineTo(m_nPoint2.x,m_nPoint2.y);dc.MoveTo(m_nPoint1.x,m_nPoint1.y);dc.LineTo(m_nPoint2.x,m_nPoint2.y+100); }//OnLButtonUp(UINT nFlags, CPoint point) case 8:pingyi();break;case 9:xuanzhuan();break;case 10:bili();break;case 11:XCQ();break;case 12:YCQ();break;case 13:DC();break;编译,运行:平移:。

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

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

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

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

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

3.问题分析为了建立北极星图形,首先在二维空间中根据坐标绘制出北极星图形。

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

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

2. 实验环境操作系统:Windows XP开发工具:visual studio 20081. 放大缩小变换放大缩小变换公式为: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);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);6.程序运行结果图1 北极星图案的数据模型图2 北极星图案的缩放图3 北极星图案的平移图4 北极星图案的旋转图5 北极星图案的对称7.总结在这次的实验中,我根据图形变换的基本原理简单实现了图形的几种变换。

二维图形的几何变换

二维图形的几何变换

实验报告学院:计信学院专业:计算机科学与技术(软件工程方向)班级:07软件2班姓名学号实验组实验时间2010.5.24 指导教师成绩实验项目名称二维图形的几何变换实验目的掌握二维图形的基本几何变换:位置改变(平移、旋转)和变形(缩放、错切,反射、投影等)以及复合变换。

实验要求实现二维图形的集合变换实验原理1.平移变换平移变换将一点P沿直线路径从一个坐标集团移动到另一个坐标位置的一个重定位过程。

如果点p1(x1,y1.z1)是由点p(x,y,z)在x轴,y轴和z轴分别移动tx,ty,tz距离得到的,则这两点坐标间的关系为X1=x+tx, y1=y+ty,z1=z+tz该式的矢量形式为:p1=p+T其中,p1,p,T分别定义为发下向量:P1=[x1,y1,z1 ] p=[x,y,z] T=[tx,ty,tz]2.二维图形变换主要是基于齐次坐标方程,通过一些简单的矩阵运算来实现:二维齐次坐标变换的矩阵形式是:ihgfedcba矩阵的每个元素都有特殊含义.基中edba可以对图形进行缩放,旋转,对称,错切等变换;fc是对图形进行平移变换;hg的对图形作投影变换;i则是对图形整体进行缩放变换.例如:将一个图形在X 方向中平移tx 个单位,在Y 方向平移ty 个单位.其实现过程如下:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡++=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1),(11101001111y x ty tx T ty y tx x y x ty tx y x其中:x1,y1是变换后的坐标,x,y 是变换前的坐标,通过上述变换,(x,y)被平移了P(tx,ty).在二维平面上任何复杂的变换都可以通过上述基本变换的组合来实现.级合方式在计算机上主要体现在矩阵的乘法运算,即将各个简单变换的矩阵逆序相乘,就可以得到一个总的变换矩阵.利用这个总的变换矩阵就可以对图形进行复合变换.实验环境 硬件平台:PC运行环境:Windows 平台,Visual C++实验步骤1.编写程序完成实验内容的要求 2.实验总结。

计算机图形学变换实验报告

计算机图形学变换实验报告

实验二图形几何变换过程的设计1设计依据:本课程设计是依据教材<<计算机计算机图形学>>一书的第4章图形几何变换为设计依据, 制作图形几何变换的程序。

2设计要求:编制程序实现多边形的平移、比例、旋转、错切和对称二维变换。

实验目的:图形变换是计算机图形学中一个基本而重要的内容,它是将图形的几何信息经过几何变换后产生的新的图形。

一个简单的图形,通过各种变换可以形成一个复杂的、丰富多彩的图形图案;通过变换还可以改变形体的形状。

这次的实验主要是要求我们掌握图形变换的一些最基本的变换,编写程序来实现二维图形的基本变换。

题目:编制程序实现多边形的平移、比例、旋转、错切和对称二维变换。

设计思想:由于二维图形是由点或直线段组成,其中直线可由其端点坐标定义,因此二维图形的几何变换可以归结为对点或对直线端点的变换。

同时我们知道每种变换都有其变换矩阵,因此在画出坐标轴以后,将图形的每个端点乘以相应的变换矩阵就可以实现图形的变换。

原程序:一、平移变换:二、比例变换:三、对称变换四、错切变换:五、旋转变换:运行结果:一、平移变换二、比例变换:三、对称变换:四、错切变换:五、旋转变换体会:在这次的实验刚开始,由于第一次接触编译的环境觉得无从下手,在老师的指导下才逐渐了解,按照图形变换的基本原理,我简单实现了图形的几种变换。

但是由于自己对函数的运用的不太熟悉,因此,在这次的实验中没有用到对函数的调用,使得总的程序相对来说有点复杂,以后要在这方面有所改进。

通过这次的实验,知道了如何利用程序进行二维图形的一些基本变换,在以后的学习过程中要不断努力。

计算机图形学-二维图形的变换

计算机图形学-二维图形的变换
glColor3f(2.0, 2.0, 2.0);
glLoadIdentity();
glColor3f(1.0, 1.0, 1.0);
glTranslatef(-100.0, -50.0, 1.0);
draw_triangle();
glLoadIdentity();
glTranslatef(0.0, 100.0, 1.0);
glShadeModel(GL_SMOOTH);
}
voiddraw_triangle(void)
{
glShadeModel(GL_SMOOTH);
glColor3f(0.7, 1.0, 0.50);
glBegin(GL_TRIANGLES);//画出三角形,为混合色填充方式
glVertex2f(150.0, 75.0);
glColor3f(0.6, 0.5, 0.20);
glVertex2f(100.0, 25.0);
glColor3f(0.4, 0.5, 0.6);
glVertex2f(100.0, 200.0);
glEnd();
}
voiddisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
二维图形的变换
实验要求
绕容易参照点旋转、缩放等
实验目的
实验环境
Visual Studio 2015
实验内容
实验核心代码:
#include<windows.h>
#include<GL/glut.h>
#include<stdlib.h>
voidinit(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);

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

计算机图形学二维图形变换
S (xr , yr ; sx , sy ) T (xr , yr ) • S (sx , sy ) •T (xr , yr )
变换矩阵为:
sx 0 (1 sx ) xr
T复合
0
sy
(1
s
y
)
xy
0 0
1
绕任意点 (x0 , y0 ) 旋转 角
变换步骤:
将旋转中心平移到坐标原点; 绕坐标原点旋转 ; 将旋转中心移回到 (x0 , y0 ) 。
两矩阵相乘
void matrix3x3PreMultiply(Matrix3x3 a,Matrix3x3 b) {
int i,j,k; Matrix3x3 tmp;
for(i=0;i<3;i++) for(j=0;j<3;j++) { tmp[i][j]=0; for(k=0;k<3;k++) tmp[i][j]+=a[i][k]*b[k][j]; }
for(i=0;i<3;i++) for(j=0;j<3;j++) a[i][j]=tmp[i][j];
}
顶点序列变换
void transformPoints() {
int i,j,k;
for(i=0;i<N;i++) for(j=0;j<3;j++) { pt[i][j]=0; for(k=0;k<3;k++) pt[i][j]+=point[i][k]*theMatrix[k][j]; }
0 0 1
关于y轴的对称变换
1 0 0
SYy

计算机图形学2010_03二维图形变换

计算机图形学2010_03二维图形变换

第三章 二维图形变换一、问题二维图形变换,就是对平面图形进行平移、缩放、旋转、对称、错切等变换。

点是构成图形的基本要素,各种平面图形都可以基于点来定义。

如:两点可定义一条直线段,三点定义三角形,多边形由若干个顶点定义,圆及椭圆可由一个外接矩形来定义。

因此,对各种图形的二维变换就可归结为对定义图形的各个点进行的坐标变换。

设一个图形由n 个点定义,则从图形变换的角度,该图形可表示为一个n ⨯2的矩阵,称为点集矩阵,如下:⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡n n y x y x y x 2211对图形进行几何变换不会使定义图形的点发生增减,只会使各点的坐标值发生变化,因此,变换后的图形仍可表示为一个n ⨯2的矩阵。

因而,可以将图形变换问题视为数学上的一个矩阵变换问题,如下:⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡n ny x y x y x 2211 ⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡''''''n n y x y x y x 2211二、变换矩阵及齐次坐标矩阵变换的形式有多种,这里尝试采用矩阵乘法运算来完成各种几何变换,用原点集矩阵G 乘以一个变换矩阵T ,得到新点集矩阵G ’。

即:G T G '=⨯T 是一个二乘二方阵,有:⎥⎦⎤⎢⎣⎡=d c b a T则:图形变换 矩阵变换⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡''''''=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡++++++=⎥⎦⎤⎢⎣⎡∙⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡n n n n nn n n y xy x y x dy bx cy ax dy bx cy ax dy bx cy ax d c b a y x y x y x 2211222211112211 在该变换中,对每个点的变换结果只与该点本身的值相关,与其它点的值无关。

则对点集矩阵中的一个点(x , y ),变换结果为:),(),(),(y x dy bx cy ax d c b a y x ''=++=⎥⎦⎤⎢⎣⎡即有:⎩⎨⎧+='+='dybx y cy ax x通过矩阵乘法可以有效完成缩放、旋转、对称、错切变换,但无法完成平移变换。

计算机图形学实验报告

计算机图形学实验报告

实验一:二维图形的绘制和变换一、实验目的掌握基本的图形学算法,熟悉VC下图形学的编程,初步了解并使用OpenGL 绘制图形。

二、实验内容二维图形的绘制和变换,绘制包括直线、三角形、矩形,变换包括平移、旋转、缩放。

三、实验原理二维图形的绘制和变换:在图形系统中,矩阵是实现变换的标准方法。

平移变换、旋转变换和缩放变换的矩阵表示形式如下。

平移变换:P’=P+T。

旋转变换:P’=R*P。

缩放变换:P’=S*P。

引入齐次坐标后,平移、旋转和缩放变换的矩阵表示形式如下所示。

(1)平移变换:[1 0 0][x’, y’, 1] = [x, y, 1] [0 1 0][tx ty 1](2)旋转变换:[cosɵsinɵ0][x’, y’, 1] = [x, y, 1] [-sinɵcosɵ0][0 0 1](3)缩放变换:[s x0 0][x’, y’, 1] = [x, y, 1] [0 s y0][0 0 1]四、实验代码及结果1.编写对一个三角形分别实现平移、缩放、旋转等变化的源码及效果图。

实验核心代码void display(void){glClear (GL_COLOR_BUFFER_BIT);glColor3f (1.0, 1.0, 1.0);glLoadIdentity ();glColor3f (1.0, 1.0, 1.0);glTranslatef(-100.0,-50.0,1.0);draw_triangle ();glLoadIdentity ();glTranslatef (0.0, 100.0, 1.0);draw_triangle ();glLoadIdentity ();glRotatef (90.0, 0.0, 0.0, 1.0);draw_triangle ();glLoadIdentity ();glScalef (0.5, 0.5, 1.0);draw_triangle ();glFlush ();}2. 实现如图功能#include<windows.h>#include <GL/glut.h>#include <stdlib.h>void init(void){glClearColor (0.0, 0.0, 0.0, 0.0);glShadeModel (GL_SMOOTH); }void draw_triangle(void){glShadeModel(GL_SMOOTH);glColor3f(0.2,0.7,0.30);glBegin (GL_TRIANGLES);//画出三角形,为混合色填充方式glVertex2f(50.0, 25.0);glColor3f(0.4,0.5,0.60);glVertex2f(150.0, 25.0);glColor3f(0.9,0.7,0.8);glVertex2f(100.0, 100.0);glEnd();}void display(void){glClear (GL_COLOR_BUFFER_BIT);glColor3f (1.0, 1.0, 1.0);glLoadIdentity ();glColor3f (1.0, 1.0, 1.0);glTranslatef(-100.0,-50.0,1.0);draw_triangle ();glLoadIdentity ();glTranslatef (0.0, 100.0, 1.0);glRotatef (90.0, 0.0, 0.0, 1.0);glScalef (0.5, 0.5, 1.0);draw_triangle ();//经过三种变换后画出图形glFlush ();}void reshape (int w, int h){glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity ();if (w <= h)gluOrtho2D (-200.0, 250.0, -100.0*(GLfloat)h/(GLfloat)w,200.0*(GLfloat)h/(GLfloat)w);//调整裁剪窗口elsegluOrtho2D (-200.0*(GLfloat)w/(GLfloat)h,250.0*(GLfloat)w/(GLfloat)h, -50.0, 200.0);glMatrixMode(GL_MODELVIEW);int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutInitWindowSize (600, 600);glutInitWindowPosition (100, 100);glutCreateWindow (argv[0]);init ();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();return 0;}实验二:使用中点扫描算法绘制直线和圆一、实验目的掌握基本的图形学算法,熟悉VC下图形学的编程,初步了解并使用OpenGL 绘制图形。

  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. 总结在这次的实验中,我根据图形变换的基本原理简单实现了图形的几种变换。

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

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

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

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

相关文档
最新文档