计算机图形学 图形的几何变换的实现算法教程文件
计算机图形学实验3------二维几何变换
![计算机图形学实验3------二维几何变换](https://img.taocdn.com/s3/m/4a210b36b90d6c85ec3ac63d.png)
实验三图形的二维几何变换一、实验目的了解齐次坐标规范化及矩阵的乘法运算熟悉掌握平移,比例,旋转,错切变换的齐次坐标矩阵掌握基于 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的菜单的实现及其响应函数的实现。
计算机图形学之图形变换
![计算机图形学之图形变换](https://img.taocdn.com/s3/m/95a54a7c852458fb770b56a1.png)
4 T
3
2 p
1
0
012 34 567 8
线段和多边形的平移可以通过顶点的
平移来实现。同样线段和多边形的其它几 何变换也可以通过对顶点的几何变换来实 现。
2. 旋转变换(Rotation) 二维旋转有两个参数:
旋转中心: 旋转角:
?
6 P’
5
4
3
P
2
1
0
012 34 567 8
设OP与x轴的夹角为 则:
由于采用齐次坐标矩阵表示几何变换, 多个变换的序列相应地可以用矩阵链乘来表 示。
需要注意:先作用的变换其矩阵在右边, 后作用的变换其矩阵在左边。
变换函数
平移变换 void glTanslate{fd}(TYPE x, TYPE y, TYPE z);
旋转变换 void glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z); 绕矢量v=(x,y,z)T逆时针方向旋转angle指定的角度。 旋转角度的范围是0~360度。当angle=0时, glRotate()不起作用。
二维旋转有两个参数: 旋转中心: 旋转角:
上述变换可以分解为三个基本变换:
•平移:
•旋转:
•平移: 回原位。
使旋转中心移到坐标原点; 使旋转中心再移
二维旋转有两个参数: 旋转中心: 旋转角:
因此上述变换可以写成矩阵乘积形式:
4. 5 基本三维几何变换(Basic three-dimensional geometric transformation)
1. 矩阵表示(Matrix representation) 前面三种变换都可以表示为如下的矩
阵形式
计算机图形学几何变换算法具体程序实现
![计算机图形学几何变换算法具体程序实现](https://img.taocdn.com/s3/m/2486a80e76c66137ee061973.png)
数学与软件科学学院实验报告学期: 2010 至 2011 第一学期 2010年 11月 3日课程名称: 计算机图形学专业:信息与计算科学班级 2007级5班实验编号: 05 实验项目: 几何变换指导教师庞朝阳姓名:学号:200706005 实验成绩:一、实验目的及要求图形变换时计算机图形学的重要内容,在图形的生成、处理和现实过程中发挥着关键性的作用,同时,变换本身也是描述图形的一个有力工具。
通过这次的实验,要理解计算机图形学中几何变换的概念和作用,掌握几何变换的过程。
二、实验内容1、整理和总结关于几何变换的概念和作用。
2、掌握基本几何变换3、掌握组合几何变换在齐次坐标下的应用。
三、具体实验内容:1、几何变换的概念和作用:几何变换提供了构造和修改图形的一种方法,图形在位置、方向、尺寸和形状方面的改变都可以通过几何变换来实现。
几何变换的基本方法是吧变换矩阵作为一个算子,作用到图形一系列顶点的位置矢量,从而得到这些顶点在几何变换后的新的顶点序列,连接新的顶点序列即可得到变换后的图形。
2、基本几何变换:假设)yP表示三维空间上一个未被变换的点,而该点经过某种变换后得x(z,,到新的点用)'P表示。
yx,','('z①平移变换:如果点)','(zyx,P在x轴,y轴和z轴分别移动x∆、y∆、y,'('zxP是由点),z∆距离得到的,则两点坐标关系为:='+x∆xxy y y ∆+=' z z z ∆+=' 则矢量形式为:T P P +=' 其中⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=''''z y x P , ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=z y x P , ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡∆∆∆=z y x T ② 缩放变换:缩放变换改变物体的大小。
有坐标关系 x s x x =' y s y y =' z s z z ='其中,x s ,y s ,z s 分别为沿x ,y 和z 轴方向放大或缩小的比例。
计算机图形学图形几何变换的实现
![计算机图形学图形几何变换的实现](https://img.taocdn.com/s3/m/579e8a0f58eef8c75fbfc77da26925c52dc59140.png)
计算机图形学图形⼏何变换的实现实验五图形⼏何变换的实现班级 08信计2班学号 20080502053 姓名杨少卿分数⼀、实验⽬的和要求:1、掌握⼆维图形⼏何变换的基本原理及⼆维图形的⼏何算法。
2、巩固所学理论知识,加深对⼆维变换的理解,加深理解利⽤变换矩阵可⽤简单图形得到复杂图形的理解。
3、通过编程完成⼆维图形的⼏何变换动态过程。
4、观察改变图形的形状、⼤⼩、位置等,其关键是坐标的变换。
⼆、实验内容:1、将四边形以原点为中⼼,以10度为间隔做360度旋转。
2、齿轮的边缘轮廓⽣成的⼏何变换,编制利⽤旋转变换绘制齿轮的程序。
3、⼏何图形变换算法(缩放、旋转和平移),编程实现⼆维图形齐次坐标变换的算法和组合变换的算法。
三、实验步骤1、将四边形以原点为中⼼,以10度为间隔做360度旋转。
程序代码:#include#include#include#includedouble sin(),cos();double xmax=639.0,ymax=399.0;double f[3][3],xx,yy;scx(double xi){int x;x=(int)(xi+xmax/2);return(x);}scy(double yi){int y;y=ymax-(int)(yi+ymax/2);return(y);}parallel(double dx,double dy){f[0][0]=1.0;f[0][1]=0.0;f[0][2]=0.0;f[1][0]=0.0;f[1][1]=1.0;f[1][2]=0.0;f[2][0]=dx;f[2][1]=dy;f[2][2]=1.0;}rotate(double theta){double th=theta/180*3.1415627;f[0][0]=cos(th);f[0][1]=sin(th); f[0][2]=0.0; f[1][0]=-sin(th); f[1][1]=cos(th); f[1][2]=0.0; f[2][0]=0.0; f[2][1]=0.0;f[2][2]=1.0;}scale(double s){f[0][0]=s;f[0][1]=0.0;f[0][2]=0.0;f[1][0]=0.0;f[1][1]=s;f[1][2]=0.0;f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;}taishox(){f[0][0]=1.0;f[0][1]=0.0;f[0][2]=0.0;f[1][0]=0.0;f[1][1]=-1.0;f[1][2]=0.0;f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;}taishoy(){f[0][0]=-1.0;f[0][1]=0.0;f[0][2]=0.0;f[1][0]=0.0;f[1][1]=1.0;f[1][2]=0.0;f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;}taishoo(){f[0][0]=-1.0;f[0][1]=0.0;f[0][2]=0.0;f[1][0]=0.0;f[1][1]=-1.0;f[1][2]=0.0;f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;}taishoxy(){f[0][0]=0.0;f[0][1]=1.0;f[0][2]=0.0;f[1][0]=1.0;f[1][1]=0.0;f[1][2]=0.0;f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;}axis(){line(scx(0),scy(-ymax/2),scx(0),scy(ymax/2)); line(scx(-xmax/2),scy(0.0),scx(xmax/2),scy(0.0)); }tuoq(double a,double b){f[0][0]=1.0;f[0][1]=b;f[0][2]=1.0;f[1][0]=a;f[1][1]=1.0;f[1][2]=0.0;f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;}affinex(double x,double y,double d){xx=x*f[0][0]+y*f[1][0]+f[2][0];return(xx);}affiney(double x,double y,double d){yy=x*f[0][1]+y*f[1][1]+f[2][1];return(yy);}main(){int graphdriver=DETECT,graphmode;static double x1[]={0.0,10.0,100.0,110.0,0.0}; static double y1[]={0.0,50.0,50.0,0.0,0.0};static double x2[5];static double y2[5];int i;double r,xx,yy;initgraph(&graphdriver,&graphmode,"");srand((unsigned)time(NULL));for(r=0;r<=360;r=r+10){rotate(r);for(i=0;i<=4;i++){x2[i]=affinex(x1[i],y1[i],1.0);y2[i]=affiney(x1[i],y1[i],1.0);}setcolor(RGB(rand()%256,rand()%256,rand()%256)); Sleep(80);for(i=0;i<=3;i++){line(scx(x2[i]),scy(y2[i]),scx(x2[i+1]),scy(y2[i+1]));}}getch();closegraph();}运⾏结果:截图:2、齿轮的边缘轮廓⽣成的⼏何变换。
计算机图形学 第3章 图形变换PPT课件
![计算机图形学 第3章 图形变换PPT课件](https://img.taocdn.com/s3/m/9a849cb990c69ec3d5bb75f0.png)
dx rx dt
嘉应学院
主要内容
1. 二维图形几何变换 2. 三维图形几何变换 3. 投影(project)变换 4. 视口变换
1 二维图形几何变换
1.1 二维平移(Translation)
(x’, y’)
将图形对象从一 个位置(x, y)移到另 一个位置(x′,y′) (x, y) 的变换。
1 0 0 [x,y,1][x,y,1]0 1 0[x,y,1]T(Tx,Ty)
Tx Ty 1
cos sin 0 [x,y,1][x,y,1]sin cos 0[x,y,1]R()
0 0 1
Sx 0 0 [x,y,1][x,y,1]0 Sy 0[x,y,1]S(Sx,Sy)
0 0 1
级联变换(Composite Transformation)
x0 y0 1 0 0 1 x0 y0 1
cos
sin
0
[x,y,1]
sin
cos
0
(1cos)x0y0sin (1cos)y0x0sin 1
例如:对任意直线Ax+By+C=0的对称变换
y
y
y
o [x,y,1]=[x,y,1]*T
y
o
x
1 00
T1 = 0 1 0 C/A 0 1
矩阵运算的表达式为
1 0 0 0
x
y
z
1x
y
z
1
0 0
1 0
0 1
0 0
2.2 三维变比
Tx Ty Tz 1
设Sx、Sy、Sz是物体在3个坐标轴方向的比例变化量,则有公式
x = xSx,y = ySy,z = zSz
计算机图形学 图形几何变换的实现
![计算机图形学 图形几何变换的实现](https://img.taocdn.com/s3/m/e5913d7031b765ce0508148f.png)
实验五图形几何变换的实现班级08信计2班学号20080502050姓名张玉凤分数一、实验目的和要求:1、掌握图形的旋转变换数学原理。
2、掌握一般图形旋转的基本算法。
二、实验内容:1、画一个正方形,并实现45度旋转,进一步可以使之动起来。
2、二维图形变换,包含了平移变换和旋转变换,比例变换。
三、实验步骤1、画一个正方形,并实现45度旋转,进一步可以使之动起来.程序源代码:#include "dos.h"#include "math.h"#include "graphics.h"#include "bios.h"#include "stdlib.h"#include "stdio.h"#define PI 3.1415962void Rotating(){int x1=150 , y1=150;int x2=x1 , y2=y1+100;int n=180;double i=0;int rx1,rx2,ry1,ry2;int wid=100,hei=100;while(!kbhit()){setcolor(RED);line(150,300,450,300);line(150,300,150,10);outtextxy(140,305,"0");outtextxy(140,10,"y");outtextxy(450,305,"x"); /*标出x,y轴*/setcolor(GREEN);rx1=x1+wid*sin(i*360/n*PI/180);ry1=y1+hei*cos(i*360/n*PI/180);rx2=rx1;ry2=ry1+100;line(x1,y1,x2,y2);line(x1,y1,rx1,ry1);line(x2,y2,rx2,ry2);line(rx1,ry1,rx2,ry2);sleep(1);delay(15000);setcolor(YELLOW); /*显示正方形旋转后的痕迹*/line(x1,y1,x2,y2);line(x1,y1,rx1,ry1);line(x2,y2,rx2,ry2);line(rx1,ry1,rx2,ry2);i+=22.5;}}main(){int driver =VGA, mode=VGAHI;initgraph(&driver,&mode,"");Rotating();getch();closegraph();}运行结果:2.二维图形变换,包含了平移变换和旋转变换。
计算机图形学实验报告几何变换
![计算机图形学实验报告几何变换](https://img.taocdn.com/s3/m/1ee0f4f9f90f76c661371a3a.png)
计算机图形学实验报告计算机图形学实验报告姓名徐沛华班级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;编译,运行:平移:。
计算机图形学第讲图形变换详解演示文稿
![计算机图形学第讲图形变换详解演示文稿](https://img.taocdn.com/s3/m/9a916a28e3bd960590c69ec3d5bbfd0a7956d5d2.png)
3
第3页,共46页。
本讲内容
齐次坐标表示法
常见的二维图形几何变换
平移变换 比例变换 旋转变换 对称变换 错切变换
变换矩阵的功能分区 图形的复合变换
4
第4页,共46页。
齐次坐标表示法
将一个原本是n维的向量用一个n+1维向量表示
(x1, x2 ,..., xn )
a
1
0
y
y
ax
1 0 0 1 1 1
➢ 简写为: p = Tp
x
26
第26页,共46页。
本讲内容
齐次坐标表示法 常见的二维图形几何变换
平移变换 比例变换 旋转变换 对称变换 错切变换
变换矩阵的功能分区
图形的复合变换
27
第27页,共46页。
变换矩阵的功能分区
变换矩阵可用3×3矩阵来描述
连续平移变换
得到连续平移变换的复合矩阵T为:
1 0 tx2 1 0 tx1 1 0 tx2 tx1
T T2T1 0
1
t
y
2
0
1
t
y1
0
1
tx
2
t
y1
0 0 1 0 0 1 0 0 1
即连续的平移变换是平移量的相加
37
第37页,共46页。
连续比例变换
设点P(x,y)经过第一次比例变换T1(Sx1,Sy1)和第二次比 例变换T2(Sx2,Sy2)后的坐标为P'' (x'',y'')
y
'
y
Ty
0
1
Ty
y
1 1 0 0 1 1
计算机图形学---图形几何变换的实现
![计算机图形学---图形几何变换的实现](https://img.taocdn.com/s3/m/e5250f01ad51f01dc381f119.png)
实验五图形几何变换的实现班级 08信计2班学号 20080502057 姓名冯双捷分数一.实验目的和要求1.掌握二维、三维图形基本变换的变换原理;2.利用TurboC实现二维、三维图形的基本变换和符合变换3.屏幕显示变换过程和变换结果。
二.实验内容1.原程序实现二维图形(直线)的平移变换;=±(1)沿x轴的平移公式:'x x r=±(2)沿y轴的平移公式:'y y s2.源程序实现三维图形(立方体)的旋转变换和比例变换。
(1)旋转变换即图形围绕圆心逆时针旋转一定的角度;(2)比例变换即对象距圆点的距离按照一定比例进行变换。
三.实验结果分析1.二维平移程序代码#include <stdio.h>#include <graphics.h>#include <conio.h>int initjuzhen(m)int m[3][3];{int i,j;for(i=0;i<3;i++)for(j=0;j<3;j++)m[i][j]=0;for(i=0;i<3;i++)m[i][i]=1;}main(){int x0,y0,x1,y1,i,j;int a[3][3];char key;int graphdriver=DETECT;int graphmode=0;initgraph(&graphdriver,&graphmode," ");cleardevice();setcolor(2);x0=250;y0=120;x1=350;y1=220;line(x0,y0,x1,y1);for(;;){outtextxy(100,400,"<-:left ->:right^:up v:down Esc->exit");key=getch();initjuzhen(a);switch(key){case 75:a[2][0]=-10;break;case 77:a[2][0]=10;break;case 72:a[2][1]=-10;break;case 80:a[2][1]=10;break;case 27:exit();break;}x0=x0*a[0][0]+y0*a[1][0]+a[2][0];y0=x0*a[0][1]+y0*a[1][1]+a[2][1];x1=x1*a[0][0]+y1*a[1][0]+a[2][0];y1=x1*a[0][1]+y1*a[1][1]+a[2][1];clearviewport();line(x0,y0,x1,y1);}closegraph();}运行结果见文件夹:ERWEI2.三维图形旋转转换,比例变换程序代码:#include <stdio.h>#include <math.h>#include <graphics.h>#include <conio.h>#include <time.h>#include <ctype.h>#define ZOOM_IN 0.9#define ZOOM_OUT 1.1int turn1[3];typedef struct{float x;float y;float z;}point;typedef struct{float x;float y;}point2d;typedef struct{float x;float y;float h;point biao[8];}fanti;void make_box(float x,float y,float h,fanti *p) {p->x=x;p->y=y;p->h=h;p->biao[0].x=x/2;p->biao[0].y=y/2;p->biao[0].z=h/2;p->biao[1].x=-x/2;p->biao[1].y=y/2;p->biao[1].z=h/2;p->biao[2].x=-x/2;p->biao[2].y=-y/2;p->biao[2].z=h/2;p->biao[3].x=x/2;p->biao[3].y=-y/2;p->biao[3].z=h/2;p->biao[4].x=x/2;p->biao[4].y=y/2;p->biao[4].z=-h/2;p->biao[5].x=-x/2;p->biao[5].y=y/2;p->biao[5].z=-h/2;p->biao[6].x=-x/2;p->biao[6].y=-y/2;p->biao[6].z=-h/2;p->biao[7].x=x/2;p->biao[7].y=-y/2;p->biao[7].z=-h/2;}void turn2d(point *p,point2d *q){q->x=p->x+p->z*cos(0.25);q->y=p->y+p->z*sin(0.25);}void initm(float mat[][4]){int count;for(count=0;count<4;count++){mat[count][0]=0.;mat[count][1]=0.;mat[count][2]=0.;mat[count][3]=0.;mat[count][count]=1.;}return;}void transform(point *p,point *q,float tm[][4]){float xu,yv,zw,h;xu=tm[0][0]*p->x+tm[1][0]*p->y+tm[2][0]*p->z+tm[3][0];yv=tm[0][1]*p->x+tm[1][1]*p->y+tm[2][1]*p->z+tm[3][1];zw=tm[0][2]*p->x+tm[1][2]*p->y+tm[2][2]*p->z+tm[3][2];p->x=xu;p->y=yv;p->z=zw;return;}void rotationx(point *p,float alfa,float tm[][4]){float rad=0.0174532925;initm(tm);tm[1][1]=cos(rad*alfa);tm[1][2]=sin(rad*alfa);tm[2][1]=-tm[1][2];tm[2][2]=tm[1][1];return;}void rotationz(point *p,float alfa,float tm[][4]){float rad=0.0174532925;initm(tm);tm[0][0]=cos(rad*alfa);tm[0][1]=sin(rad*alfa);tm[1][0]=-tm[0][1];tm[1][1]=tm[0][0];return;}void rotationy(point *p,float alfa,float tm[][4]) {float rad=0.0174532925;initm(tm);tm[0][0]=cos(rad*alfa);tm[2][0]=sin(rad*alfa);tm[0][2]=-tm[2][0];tm[2][2]=tm[0][0];return;}void adjust(point *p,point *q){float t[4][4];switch(turn1[0]){case 1:rotationy(p,2,t);transform(p,q,t);break;case -1:rotationy(p,-2,t);transform(p,q,t);break;default:break;}switch(turn1[1]){case 1:rotationz(p,2,t);transform(p,q,t);break;case -1:rotationz(p,-2,t);transform(p,q,t);break;default:break;}switch(turn1[2]){case 1:q->x=ZOOM_IN*p->x;q->y=ZOOM_IN*p->y;q->z=ZOOM_IN*p->z;break;case -1:q->x=ZOOM_OUT*p->x;q->y=ZOOM_OUT*p->y;q->z=ZOOM_OUT*p->z;break;default:break;}}void drawbox(fanti *p){point2d fan2d[8];int i;for(i=0;i<=7;i++){adjust(&p->biao[i],&p->biao[i]);turn2d(&p->biao[i],&fan2d[i]);fan2d[i].x+=300;fan2d[i].y+=200;}clearviewport();setcolor(2);outtext("\n ->:right\n <-:left\n ^:up\n v:down");moveto(0,10);outtext("\n page up:zoom in\n page down:zoom out\n space:Redraw\n Esc:exit");for(i=0;i<=3;i++){if(i==3){line(fan2d[i].x,fan2d[i].y,fan2d[0].x,fan2d[0].y);line(fan2d[i+4].x,fan2d[i+4].y,fan2d[4].x,fan2d[4].y);}else{line(fan2d[i].x,fan2d[i].y,fan2d[i+1].x,fan2d[i+1].y);line(fan2d[i+4].x,fan2d[i+4].y,fan2d[i+5].x,fan2d[i+5].y);}line(fan2d[i].x,fan2d[i].y,fan2d[i+4].x,fan2d[i+4].y);}}void main(){int gd=DETECT,gm,i,j;char key;float x,y,h;fanti a1;x=100;y=100;h=100;initgraph(&gd,&gm," ");make_box(x,y,h,&a1);drawbox(&a1);for(;;){turn1[0]=0;turn1[1]=0;turn1[2]=0;key=getch();switch(key){case 77:turn1[0]=1;break;case 75:turn1[0]=-1;break;case 72:turn1[0]=1;break;case 80:turn1[0]=-1;break;case 73:turn1[2]=1;break;case 81:turn1[2]=-1;break;case 32:make_box(x,y,h,&a1);break;case 27:exit();break;default:key=0;break;}if(key!=0)drawbox(&a1);}closegrapg();}运行结果见文件夹:SANWEI3.分析使用矩阵保存图形的坐标位置的方法,二维图形的平移就是一个坐标位置移到另一个坐标位置的重定位过程;对于三维的图形的旋转变换就是图形相应的矩阵进行角度的初等变换,而比例变换即是图形矩阵的相应比例变换。
计算机图形学几何变换课件
![计算机图形学几何变换课件](https://img.taocdn.com/s3/m/db9f128eab00b52acfc789eb172ded630b1c98cb.png)
• 平移变换可以用矩阵表示,对于二维平移变换, 矩阵为
平移变换
``` 1 0 tx
0 1 ty
平移变换
``` 其中tx和ty分别表示在x和y轴上的平移距离。对于三维平移变换,矩阵为
平移变换
1 2 3
平移变换
平移变换
```
其中tx、ty和tz分别表示在x、y和z轴上的平移距离。
缩放变换
缩放变换
缩放变换
``` s00 0s0
缩放变换
缩放变换
缩放变换
01 02 03
缩放变换
缩放变换
其中s1、s2和s3分别表示在x、y和z轴 上的缩放比例。
旋转变换
旋转变换
旋转变换
旋转变换
旋转变换
旋转变换
旋转变换
旋转变换
齐次坐标和矩阵表示
03
非线性几何变换
CHAPTER
仿射变换
OpenGL或其他图形库的应用
01
OpenGL
02
DirectX
03
Unity3D
06
课程总结与展望
CHAPTER
本课程的主要内容回顾
矩阵表示法
投影变换
几何变换基础
组合变换
仿射变换
计算机图形学几何变换的未来发展
实时渲染技术 虚拟现实与增强现实 人工智能与几何变换
学生如何进一步深入学习计算机图形学
计算机图形学几何变 换课 件
contents
目录
• 引言 • 线性几何变换 • 非线性几何变换 • 组合几何变换 • 几何变换的计算机实现 • 课程总结与展望
01
引言
CHAPTER
计算机图形学的定义
计算机图形学
计算机图形学-第5章-几何变换课件
![计算机图形学-第5章-几何变换课件](https://img.taocdn.com/s3/m/76ad2a44bb1aa8114431b90d6c85ec3a87c28b91.png)
•计算机图形学-第5章-几何变换
5.3.3 其他变换
1.反射变换 (2)关于Y轴对称变换 关于Y轴的对称变换是一种特殊形式的缩放变换,其中Sx=-1,Sy=1, 其变换矩阵为:
简化为:YXs
s a c
X Yw
w
d
b
(1)式
•计算机图形学-第5章-几何变换
5.1 窗口到视区的变换
三、窗口区和视图区的坐标变换
简化为:YXs
s aXw c Yw
d
b
(1)式
1) 当ac时,即x 方向的变化与y方向的变化不同时,视图中的图 形会有伸缩变化,图形变形。
2) 当a=c=1,b=d=0,且窗口与视图区的坐标原点也相同,则在视 图区产生与窗口区相同的图形。
•计算机图形学-第5章-几何变换
5.3.3 其他变换
2.错切变换 (2)沿y方向关于x轴的错切 变换矩阵为:
式中shy可取任意实数,此变换只影响y坐标(x坐标保持不变)。 变换时物体上的各点垂直偏移一段距离,偏移量正比于x值。
•计算机图形学-第5章-几何变换
5.3.3 其他变换
2.错切变换
1 d 0
•计算机图形学-第5章-几何变换
5.3.3 其他变换
2.错切变换 这种变换可使物体产生变形,即物体产生扭转(或称为错切)。常用 的两种错切是沿着x向或沿着y向错切变换。 (1)沿x方向关于y轴的错切 对矩形ABCD沿x轴方向进行错切变换,得到矩形A’B’CD。错切的 角度为,令shx=tan , 假定点(x,y)经错切变换后变为(x’,y’) 则:
计算机图形学第5章图形几何变换
![计算机图形学第5章图形几何变换](https://img.taocdn.com/s3/m/31c1d555326c1eb91a37f111f18583d049640f98.png)
二维基本变换-错切变换
a 人们所要描述的图形均在用户域中定义。 b 用户域是一个实数域,理论上是连续无限的。
2. 窗口区:用户指定的任一区域(W) a 窗口区W小于或等于用户域WD b 小于用户域的窗口区W叫做用户域的子域。
c 窗口可以有多种类型,矩形窗口、圆形窗口、多边形窗口 等等 d 窗口可以嵌套,即在第一层窗口中可再定义第二层窗口, 在第I层窗口中可再定义第I+1层窗口等等。
(c f ):对图形进行平移变换 。
⎜⎜⎝⎛
g h
⎟⎟⎠⎞:对图形做投影变换。
g:在x = 1 处产生一个灭点。 g
h:在x = 1 处产生一个灭点。 h
(i):对整体图形进行伸缩 变换。
∵ (x *
y * 1) = (x
y
1)⎜⎜⎛
1 0
0 1
0 ⎟⎞ 0⎟
⎜⎝ 0 0 i ⎟⎠
计算机∴图若形i学> 1,则总体缩小;否则,总 体放大。
把用户坐标系与设备坐标系联系起来; 可由简单图形生成复杂图形; 可用二维图形表示三维形体; 动态显示。
计算机图形学
二维图形的显示流程图
计算机图形学
图形的几何变换
图形变换:对图形的几何信息经过几何变换后产 生新的图形。
图形变换的两种形式: 1.图形不变,坐标系改变; 2.图形改变,坐标系不变。
二维基本变换-对称变换
(x *
y * 1) = (x
y
1)⎜⎜⎛
a b
d e
0 0
⎟⎞ ⎟
=
(ax
+
by
dx + ey
1)
⎜⎝ 0 0 1⎟⎠
当b=d=0,a=-1,e=1时,(x* y* 1)=(-x y 1):与y轴对称的反射变换 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学图形的几何变换的实现算法实验二 图形的几何变换的实现算法班级 08信计 学号 59 姓名 分数一、实验目的和要求:1、掌握而为图形的基本几何变换,如平移,旋转,缩放,对称,错切变换;。
2、掌握OpenGL 中模型变换函数,实现简单的动画技术。
3、学习使用OpenGL 生成基本图形。
4、巩固所学理论知识,加深对二维变换的理解,加深理解利用变换矩阵可由简单图形得到复杂图形。
加深对变换矩阵算法的理解。
编制利用旋转变换绘制齿轮的程序。
编程实现变换矩阵算法,绘制给出形体的三视图。
调试程序及分析运行结果。
要求每位学生独立完成该实验,并上传实验报告。
二、实验原理和内容:. 原理:图像的几何变换包括:图像的空间平移、比例缩放、旋转、仿射变换和图像插值。
图像几何变换的实质:改变像素的空间位置,估算新空间位置上的像素值。
图像几何变换的一般表达式:[,][(,),(,)]u v X x y Y x y = ,其中,[,]u v 为变换后图像像素的笛卡尔坐标, [,]x y 为原始图像中像素的笛卡尔坐标。
这样就得到了原始图像与变换后图像的像素的对应关系。
平移变换:若图像像素点 (,)x y 平移到 00(,)x x y y ++,则变换函数为0(,)u X x y x x ==+,0(,)v Y x y y y ==+,写成矩阵表达式为:00x u x y v y ⎡⎤⎡⎤⎡⎤=+⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦其中,x 0和y 0分别为x 和y 的坐标平移量。
比例缩放:若图像坐标 (,)x y 缩放到( ,x y s s )倍,则变换函数为:00x y s u x s v y ⎡⎤⎡⎤⎡⎤=⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦ 其中, ,x y s s 分别为x 和y 坐标的缩放因子,其大于1表示放大,小于1表示缩小。
旋转变换:将输入图像绕笛卡尔坐标系的原点逆时针旋转θ角度,则变换后图像坐标为:cos sin sin cos u x v y θ-θ⎡⎤⎡⎤⎡⎤=⎢⎥⎢⎥⎢⎥θθ⎣⎦⎣⎦⎣⎦内容:1、对一个三角形分别实现平移,缩放旋转等变化。
2. 在方向、尺寸和形状方面的变换是用改变对象坐标描述的几何变换来完成的。
基本几何变换都是相对于坐标原点和坐标轴进行的几何变换,有平移、旋转、缩放、反射、错切等。
用直线命令画出一个齿(或六边形的一半)→利用旋转变换或对称变换矩阵 实现对其余部分的绘制→调试运行程序→输出图形→分析结果→结束。
编写三维变换算法程序→检查程序的正确性→分段调试程序→输入给出的三维形体各顶点的坐标→执行变换→对算法程序进行必要的调整→更换不同的形体数据继续变换→结束。
3.用实验一的方法解决这个问题,某三角形的三个点点坐标为{5.0.0.25.0},{150.0.25.0},{100.0.100.0},创建一个长度分别为600,600的窗口,窗口的左上角位于屏幕坐标(100,100)处。
然后绘制一个由上述顶点所绘制的三角形,实现该三角形进行下列几何变换:首先使三角形沿着其中心的x 轴和y 轴方向缩小50%,然后沿着出示中心旋转90度;最后沿着y 轴平移100个单位。
三、实验代码如下1实验一#include <GL/glut,h>#include <stdlib.h>Void init (void){glClearVolor (0.0,0.0,0.0,0.0); glShadeModel (GL-FLAT);}Void draw_triangle(void){glBegin(GL_LINE_LOOP);glVertex2f(0.0,25.0);glVertex2f(25.0,-25.0);glVertex2f(-25.0,-25.0);glEnd();}Void display(void){glClear (GL_COLOR_BUEFER_BIT);glColor3f(1.0,1.0,1.0);glLoadIdentity();glColor3f(1.0,1.0,1.0);draw_triangle();glEnable (GL_LINE_STIPPLE);glLineStipple (1,0xF0F0);glLoadIdentity();glTranslatef (-20.0,0.0,0.0);draw_triangle();glLineStipple (1,0xff00);glLoadIdentity ();glScalef (1.5,0.5,1.0);draw_triangle ();glLineStipple (1,0x8888);glLoadIdentity();glRotatef(90.0,0.0,0.0,1.0);draw_triangle ();glDisable (GL_LINE_STIPPLE);glFlush();}Void reshape (int w,,nt h){glViewport (0,0,(GLsizei) w,(GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity ();if (w<=h)gluOrtho2D(-50.0,50.0,-50.0*(GLfloat)h/(GLfloat)w,50.0*(GLfloat)h/(GLfloat)w); glMatrixMode(GL_MODELVIEW);}int main (int argc,char**argv){glutInit(&argc,argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutInitWindowSize (500,500);glutInitWindowPosition (100,100);glutCreatWindow (argv[0]);init ();glutDisplayFunc (display);glutReshapeFunc (reshape);glutMainLoop();return 0;}实验结果如下2实验二代码#include<graphics.h>#include<math.h>inta[14][4]={{30,0,0,1},{30,40,0,1},{0,40,0,1},{0,40,10,1},{0,30,30,1}, {0,0,30,1},{30,0,30,1},{30,10,30,1},{10,10,30,1},{10,30,30,1},{10,40 ,10,1},{10,10,10,1},{30,10,10,1},{30,40,10,1}};float t[4][4],p[14][4];void a400(){int i,j;for(i=0;i<4;i++)for(j=0;j<4;j++)t[i][j]=0;}void a500(){ int k,i,j;for(i=0;i<14;i++){for(j=0;j<4;j++){p[i][j]=0;for(k=0;k<4;k++)p[i][j]=p[i][j]+a[i][k]*t[k][j];}p[i][0]=p[i][0]+280;p[i][1]=-p[i][1]+180;}setcolor(9);moveto(p[0][0],p[0][1]);for(i=0;i<14;i++)lineto(p[i][0],p[i][1]);line(p[6][0],p[6][1],p[0][0],p[0][1]);line(p[7][0],p[7][1],p[12][0],p[12][1]); line(p[8][0],p[8][1],p[11][0],p[11][1]); line(p[9][0],p[9][1],p[4][0],p[4][1]);line(p[10][0],p[10][1],p[3][0],p[3][1]); line(p[13][0],p[13][1],p[10][0],p[10][1]); line(p[1][0],p[1][1],p[13][0],p[13][1]); getch();}main(){int driver,mode,i,j;driver=DETECT;initgraph(&driver,&mode,"d:\\tc"); setbkcolor(3);a400();t[0][0]=0.7071*3;t[0][1]=-0.4082*3;t[1][0]=-0.7071*3;t[1][1]=-0.4082*3;t[2][1]=0.8165*3;t[3][3]=1;a500();closegraph();}实验结果实验三结果三、实验结果分析. 1、该程序实现了而为图形的简单几何变换,包括平移,缩放旋转等。
2、平移变换时最简单的变换,错切变换实际上是用比例因子乘对象的每一坐标和增加位移值。
3、上面所讨论的图形变换时相对于坐标原点或坐标轴来进行的。
实际中,常常需要相对于人一点或任一轴来进行变换。