计算机图形学实验五:图形变换
《计算机图形学》05 图形的几何变换解析
o
x
o
T1 = 1 0 0 0 1 0 C/A 0 1
x
o
T2=
x
cosα -sinα 0 sinα cosα 0
0
0
1
y
y
y
o
T3 = 1 0 0 0 -1 0 0 0 1
x
o
x
o
T5=
x
1 0 0 0 1 0 -C/A 0 1
cosα sinα 0 T4 = -sinα cosα 0 0 0
1
组合变换矩阵为: cos2α sin2α T =T1×T2×T3×T4×T5= sin2α -cos2α (cos2α-1)C/A sin2α*C/A 0 0 1
原图形上的任意一点 P(x,y) 对该直线的对称变换都可用下
式实现 : [x* y* 1]=[x y 1]· T
5.3 三维图形变换
三维变换矩阵可表示为: T= a d g l b e h m c p f q i r n s
h),h是任一不为0的比例系数。 给定一个点的齐次坐标表示 : (x,y,h), 该点的二维笛卡儿直角坐标: (x / h,y / h)。 同样,对于一个三维空间的向量(x,y,z), 它在四维空间 中对应的向量即齐次坐标为 (x×h ,y×h , z×h , h) ,其中 h≠0 。 齐次坐标的概念可以推广到 n 维空间的向量。齐次坐标的 表示不是唯一的,通常当h=1时,称为规格化齐次坐标。
5.2 二维图形变换
采用齐次坐标可将二维图形变换表示成如下形式: a d 0 [ x* y* 1 ] = [ x y 1 ] b e 0 c f 1 P*
变换后的 顶点坐标
=
P
变换前的 顶点坐标
计算机图形学之图形变换
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) 前面三种变换都可以表示为如下的矩
阵形式
计算机图形学第五次实验报告
《计算机图形学》实验报告实验十一真实感图形一、实验教学目标与基本要求初步实现真实感图形, 并实践图形的造型与变换等。
二、理论基础运用几何造型, 几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。
1.用给定地形高程数据绘制出地形图;2.绘制一(套)房间,参数自定。
三. 算法设计与分析真实感图形绘制过程中, 由于投影变换失去了深度信息, 往往导致图形的二义性。
要消除这类二义性, 就必须在绘制时消除被遮挡的不可见的线或面, 习惯上称之为消除隐藏线和隐藏面, 或简称为消隐, 经过消隐得到的投影图称为物体的真实图形。
消隐处理是计算机绘图中一个引人注目的问题, 目前已提出多种算法, 基本上可以分为两大类:即物体空间方法和图象空间方法。
物体空间方法是通过比较物体和物体的相对关系来决定可见与不可见的;而图象空间方法则是根据在图象象素点上各投影点之间的关系来确定可见与否的。
用这两类方法就可以消除凸型模型、凹形模型和多个模型同时存在时的隐藏面。
1).消隐算法的实现1.物体空间的消隐算法物体空间法是在三维坐标系中, 通过分析物体模型间的几何关系, 如物体的几何位置、与观察点的相对位置等, 来进行隐藏面判断的消隐算法。
世界坐标系是描述物体的原始坐标系, 物体的世界坐标描述了物体的基本形状。
为了更好地观察和描述物体, 经常需要对其世界坐标进行平移和旋转, 而得到物体的观察坐标。
物体的观察坐标能得到描述物体的更好视角, 所以物体空间法通常都是在观察坐标系中进行的。
观察坐标系的原点一般即是观察点。
物体空间法消隐包括两个基本步骤, 即三维坐标变换和选取适当的隐藏面判断算法。
选择合适的观察坐标系不但可以更好地描述物体, 而且可以大大简化和降低消隐算法的运算。
因此, 利用物体空间法进行消隐的第一步往往是将物体所处的坐标系转换为适当的观察坐标系。
这需要对物体进行三维旋转和平移变换。
常用的物体空间消隐算法包括平面公式法、径向预排序法、径向排序法、隔离平面法、深度排序法、光线投射法和区域子分法。
计算机图形学-图形的几何变换
贵州大学实验报告学院:计算机科学与技术专业:软件工程班级:软件132(1)当d=0时,图形的y坐标不变,x坐标随初值(x,y)及变换系数b作线性变化。
(2)当b=0时,图形的x坐标不变,y坐标随初值(x,y)及变换系数d作线性变化。
实验步骤1.设计图形界面。
本实验使用visual studio 2012 C#搭建窗口,设置相应的组件。
如下图。
如图所示,combox此时显示的字符是“平移”,在其下面显示的是关于平移的操作组件。
当选择combox的不同项时,其下面就显示对应的操作组件。
2.运行效果如下。
(1)平移从图中可见,原图形的颜色为黄绿色,平移后的图形为黑色。
(2)旋转(3)对称如图,这是原图形关于x轴对称后由对称后的图形关于原点对称得到的图形。
在界面中可看到一个text为“新变换”的checkbox,其作用是可以自由选择变换原图形或者变换变换后的图形。
(4)缩放有图可知,此时的x、y的缩放比例都是0.5,也就是原图形的x和y都关于原点缩小为原来的一半。
(5)错切此时y上的错切系数为0,即图形的y值不变,x的值随x上的错切系数变化。
(6)三角形的一顶点保持不变,另外两个顶点按缩放比例缩小,然后关于直线-2x+4y+3对称。
这是一个组合变换的问题,要使得三角形的一顶点保持不变,就要将该顶点移动到原点,缩放后再平移回去,然后再关于直线对称就行了。
组合变换时,先作用的变换矩阵在右端,后作用的变换矩阵在左端。
(7)四边形以原点为中心,以15°为间隔旋转。
在程序中设置一个旋转增量,每变换一次,就加上旋转增量,就可得到上图的结果。
实验数据由于代码篇幅过长,下面是代码的主要部分。
private void initMatrix() {temp = new double[3][];for (int i = 0; i < temp.Length; i++){temp[i] = new double[3];}resetTemp(ref temp);temp1 = new double[3][];for (int i = 0; i < temp1.Length; i++){temp1[i] = new double[3];}resetTemp(ref temp1);//初始化平移矩阵move = new double[3][];for (int i = 0; i < move.Length; i++){move[i] = new double[3];}for (int i = 0; i < move.Length; i++) {for (int j = 0; j < move[i].Length; j++) {if (i == j){move[i][j] = 1;}else {move[i][j] = 0;}}}//初始化缩放矩阵zoom = new double[3][];for (int i = 0; i < zoom.Length; i++){zoom[i] = new double[3];}for (int i = 0; i < zoom.Length; i++){for (int j = 0; j < zoom[i].Length; j++) {if (i == j){zoom[i][j] = 1;}else {zoom[i][j] = 0;}}}//初始化旋转矩阵rotate = new double[3][];for (int i = 0; i < rotate.Length; i++){rotate[i] = new double[3];}for (int i = 0; i < rotate.Length; i++){for (int j = 0; j < rotate[i].Length; j++) {if (i == j && i == 2){rotate[i][j] = 1;}else {rotate[i][j] = 0;}}}//初始化对称矩阵symmetry = new double[3][];for (int i = 0; i < symmetry.Length; i++){symmetry[i] = new double[3];}for (int i = 0; i < symmetry.Length; i++){for (int j = 0; j < symmetry[i].Length; j++) {if (i == j){symmetry[i][j] = 1;}else {symmetry[i][j] = 0;}}}//初始化错切矩阵shear = new double[3][];for (int i = 0; i < shear.Length; i++){shear[i] = new double[3];}for (int i = 0; i < shear.Length; i++){for (int j = 0; j < shear[i].Length; j++) {if (i == j){shear[i][j] = 1;}else {shear[i][j] = 0;}}}//初始化目标齐次坐标target = new double[3][];for (int i = 0; i < target.Length; i++){target[i] = new double[1];}for (int i = 0; i < target.Length; i++){for (int j = 0; j < target[i].Length; j++) {if (i == 2 && j == 0){target[i][j] = 1;}else {target[i][j] = 0;}}}//初始化结果齐次坐标result = new double[3][];for (int i = 0; i < result.Length; i++){result[i] = new double[1];}for (int i = 0; i < result.Length; i++){for (int j = 0; j < result[i].Length; j++){if (i == 2 && j == 0){result[i][j] = 1;}else{result[i][j] = 0;}}}}private void coordinate() {Brush brush = new SolidBrush(Color.Black);Pen pen = new Pen(brush,1);//获取x轴getGph().DrawLine(pen, new Point(0, panel1.Height / 2), newPoint(panel1.Width, panel1.Height / 2));getGph().DrawLine(pen, new Point(panel1.Width, panel1.Height / 2), new Point(panel1.Width-10, panel1.Height / 2-5));getGph().DrawLine(pen, new Point(panel1.Width, panel1.Height / 2), new Point(panel1.Width - 10, panel1.Height / 2 + 5));//获取y轴getGph().DrawLine(pen, new Point(panel1.Width / 2, 0), newPoint(panel1.Width / 2, panel1.Height));getGph().DrawLine(pen, new Point(panel1.Width / 2, 0), newPoint(panel1.Width / 2-5, 10));getGph().DrawLine(pen, new Point(panel1.Width / 2 , 0), newPoint(panel1.Width / 2+5,10 ));//获取xoygetGph().DrawString("O(0,0)", new Font("微软雅黑", 8), brush, new Point(panel1.Width/2-13, panel1.Height/2));getGph().DrawString("X", new Font("微软雅黑", 8), brush, newPoint(panel1.Width-15, panel1.Height / 2+5));getGph().DrawString("Y", new Font("微软雅黑", 8), brush, newPoint(panel1.Width/2+8,5));//原点坐标centerX = panel1.Width / 2;centerY = panel1.Height / 2;}private void GetPolygon(List<Point> point,Color color) {for (int i = 0; i <point.Count; i++) {Brush brush = new SolidBrush(color);Pen pen = new Pen(brush, 1);Point st = point[i];Point end = point[(i + 1) % point.Count];st.X += centerX;st.Y += centerY;end.X += centerX;end.Y += centerY;getGph().DrawLine(pen,st,end);Brush brushString = new SolidBrush(Color.Black);getGph().DrawString("("+ (st.X-centerX) + ","+ (centerY-st.Y) + ")", new Font("微软雅黑", 6), brushString, new Point(st.X, st.Y - 12));}}private void changePolygon(double[][] matrix) {List<Point> newPoint=new List<Point>();//用来暂时存储要变换的目标链表if (checkBox1.Checked){for (int i = 0; i < point.Count; i++){newPoint.Add(point[i]);}}else {if (chgPoint.Count == 0){for (int i = 0; i < point.Count; i++){newPoint.Add(point[i]);}}else {for (int i = 0; i < chgPoint.Count; i++) {newPoint.Add(chgPoint[i]);}}}chgPoint.RemoveAll(clear);//准备接收再次变换后的顶点for (int p = 0; p < newPoint.Count; p++){target[0][0] = newPoint[p].X;target[1][0] = newPoint[p].Y;for (int i = 0; i < matrix.Length; i++){for (int j = 0; j < matrix[i].Length; j++){for (int k = 0; k < target[0].Length; k++){result[i][k] += matrix[i][j] * target[j][k];}}}chgPoint.Add(new Point((int)result[0][0], (int)result[1][0]));resetResultMatrix();}GetPolygon(chgPoint, Color.Black);}private void transformation(ref double[][] result,ref double[][] first,ref double[][] second) {//计算矩阵相乘for (int i = 0; i < first.Length; i++){for (int j = 0; j < first[i].Length; j++){for (int k = 0; k < second[0].Length; k++){result[i][k] += first[i][j] * second[j][k];}}}}。
计算机图形学二维图形变换
宁夏师范学院数学与计算机科学学院《计算机图形学》实验报告实验序号:7 实验项目名称:二维图形变换菜单菜单项ID值图形变换(&T)缩放(&Z)ID_TRANSFORM_SCALE图形变换(&T)旋转(&R)ID_TRANSFORM_ROTATE图形变换(&T)对称(&S)ID_TRANSFORM_SYMMETRY 4、在CTransView视图类中添加消息映射函数;对象消息函数ID_TRANSFORM_SCALE COMMAND OnFigureCirleID_TRANSFORM_ROTATE COMMAND OnFigureEllipseID_TRANSFORM_SYMMETRY COMMAND OnTransformSymmetry5、添加自定义的成员变量: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;6、在视图类的OnDraw()函数中加入下列代码,实现视图绘图。
void CTransView::OnDraw(CDC* pDC){CTransDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here//绘出以以(540,220)、(670,130)、(560,120)为顶点的三角形。
pDC->MoveTo(Pt[0]);pDC->LineTo(Pt[1]);三、运行结果变换前:对称变换:缩放变换:旋转变换:五、教师评语成绩签名:日期:年月日。
计算机图形学图形几何变换的实现
计算机图形学图形⼏何变换的实现实验五图形⼏何变换的实现班级 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、齿轮的边缘轮廓⽣成的⼏何变换。
计算机图形学理论及应用技术 第5章 图形变换
2. 图形变换的定义内容 (1) 对图形变换类型的定义。
(2) 定义图形齐次变换矩阵的构造方法。
5.4 立体图形的几何变换 5.4.1 立体图形的比例变换和平移变换阵 设Sx、Sy和 Sz分别为X方向、Y方向和Z方向的比例系数, 比例变换矩阵 S,设Tx、Ty和Tz分别为X方向、Y方向和 Z方向的平移量,平移变换矩阵T。根据平面图形的图形 变换矩阵可以推出:
Sx 0 S 0 0 0 Sy 0 0 0 0 Sz 0 0 0 ; 0 1 1 0 T 0 T x 0 1 0 Ty 0 0 1 Tz 0 0 . 0 1
5.6.2 向视平面坐标系转变的方法 视平面转换的方法有两种: (1)直接转换视平面,使之与物体坐标系重合。 (2)将物体坐标系转换,使它与视平面坐标系重合。 1. 视平面变换步骤 视平面变换需要以下3个步骤进行。 (1) 将物体坐标系原点移到视图参考点上,再沿视平面的 法向量平移视距,使两个坐标系原点相重合。 (2) 将物体坐标系旋转,使它的Z轴与视平面的法向量重 叠。这时的Z轴称之为Z' 轴。这个过程分两步进行: 1) 将物体坐标系绕 X 轴旋转,使物体坐标系的 Z 轴落在 X'OY' 平面上。 2) 将物体坐标系绕Y轴旋转,使Z轴与视平面法向量(Z' 轴) 重叠。 (3) 将物体坐标系绕Z轴旋转,使两个坐标系的X轴、Y轴 相重合。
5.3.1 窗口/视口变换的基本方法 5.3.2 窗口/视口变换矩阵的求法
《计算机图形学》实验报告
实验报告模板《计算机图形学》实验报告一、实验目的及要求1.实习三维图形的坐标系之间的变换;2.三维图形几何变换;3.掌握三维图形的坐标系之间的变换算法及三维图形几何变换的原理和实现;4.实现二维图形的基本变换(平移、旋转、缩放、错切、对称、复合等);5.实现三维图形的基本变换(平移、旋转、缩放、复合等);二、理论基础在齐次坐标理论下,二维图形几何变换矩阵可用下式表示:⎪⎪⎪⎭⎫⎝⎛===ifchebgdaTnkxx kk2,1,0,)(ϕ平移变换:[x* y* 1] =[x y 1] *0000001ts⎛⎫⎪⎪⎪⎝⎭=[t*x s*y 1]比例变换:[x* y* 1]=[x y 1] *1000101m n⎛⎫⎪⎪⎪⎝⎭=[m+x n+y 1]旋转变换:在平面上的二维图形饶原点逆时针旋转Ө角,变换矩阵为[x* y* 1]=[x y 1] *cos sin0sin cos0001θθθθ⎛⎫⎪- ⎪⎪⎝⎭= [x*cosө-y*sinө]复合变换:以上各种变换矩阵都是以原点为参照点,当以任意参照点进行变换的时候,我们就要用到复合变换矩阵。
三维变换类似于二维,在画图时,把三维坐标转换为二维即可。
三、算法设计与分析二维变换:#define dx 50#define dy 100void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+dx;a[1]=m[i][1]+dy;b[0]=m[i+1][0]+dx;b[1]=m[i+1][1]+dy;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define h 0.1745#include<math.h>void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*cos(h)-m[i][1]*sin(h);a[1]=m[i][1]*cos(h)+m[i][0]*sin(h);b[0]=m[i+1][0]*cos(h)-m[i+1][1]*sin(h);b[1]=m[i+1][1]*cos(h)+m[i+1][0]*sin(h);DDALine(a,b, RGB(0, 200, 255), pDC);}}#define k 2;#define f 2.5void CCGWithVCView::OnTransMove() //缩放{// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Scale Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*k;a[1]=m[i][1]*f;b[0]=m[i+1][0]*k;b[1]=m[i+1][1]*f;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define n 2#define d 0void CCGWithVCView::OnTransOther(){// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Other Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+n*m[i][1];a[1]=m[i][1]+d*m[i][0];b[0]=m[i+1][0]+n*m[i+1][1];b[1]=m[i+1][1]+d*m[i+1][0];DDALine(a,b, RGB(0, 200, 255), pDC);}}三维变换:#include<math.h>#define dx 100#define dy 100#define dz 0void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]+dy-p3d[i][0]+dx/sqrt(2);p2d[i][1]=p3d[i][2]+dz+p3d[i][0]+dx/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}#define k 0.1745void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]*cos(k)-p3d[i][2]*sin(k)-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]*cos(k)+p3d[i][1]*sin(k)+p3d[i][0]/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}四、程序调试及结果的分析二维:三维:五、实验心得及建议在实验过程中,尽管过程中任由许多不会的地方,而且有待于今后的提高和改进,但我加深了对书本上知识的理解与掌握,同时也学到了很多书本上没有东西,并积累了一些宝贵的经验,这对我以后的学习与工作是不无裨益的。
计算机图形学 图形几何变换的实现
实验五图形几何变换的实现班级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.二维图形变换,包含了平移变换和旋转变换。
计算机图形学图形变换
计算机图形学图形变换实验五:图形变换⼀、实验⽬的:1、掌握图形变换的基本⽅法。
2、初步掌握映射菜单消息和捕获键盘消息的⽅法。
⼆、实验内容及要求:1、以三⾓形为例,使⽤Visual C++实现⼆维图形的平移、旋转和缩放功能。
2、每⼈单独完成实验。
3、按要求撰写实验报告,写出实验⼼得,并在实验报告中附上程序的核⼼算法代码。
三、实验设备:微机,Visual C++6.0四、实验内容和步骤:1、打开VC,新建⼀个MFC Appwizard项⽬,选择创建单⽂档⼯程(SDI⼯程)。
假设⼯程名为Transform。
如图1和图2所⽰。
图1图22、在图2的界⾯上点击Finish,完成⼯程的创建。
3、在TransformView.h⽂件中,加⼊如下代码:public:CPoint Pt[3]; //存储三⾓形的三个顶点float dAngle; //存储三⾓形旋转的⾓度4、在类CTransformView的构造函数中定义三⾓形的三个顶点的初始坐标和dAngle的初值,代码如下;CTransformView::CTransformView(){// TODO: add construction code herePt[0].x = 200; Pt[0].y = 220;Pt[1].x = 260; Pt[1].y = 300;Pt[2].x = 360; Pt[2].y = 180;dAngle = 0.0;}5、在类CTransformView中添加成员函数void DrawTriangle(CDC *pDC),并实现该函数。
(该部分代码请同学们⾃⼰实现,为了简便编程,可以使⽤MoveTo和LineTo函数,也可以调⽤⾃⼰在实验2中编写的DDA或者Bresenham画线函数);6、在类CTransformView的OnDraw()函数中添加绘制三⾓形的代码;void CTransformView::OnDraw(CDC* pDC){CTransformDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data here}7、映射菜单消息,⽅法是打开ResourceView菜单,依次展开MENU \ IDR_MAINFRAME,添加“图形变换”主菜单项,在其下添加“平移”,如图3所⽰。
计算机图形学实验_简单动画的实现、三维图形变换
学号专业姓名实验日期2018.12.11 教师签字成绩实验报告【实验名称】简单动画的实现、三维图形变换【实验目的】(1)指定图形运动轨迹,实现物体的移动过程和移动速度控制;(2)理解并掌握形体的投影变换的原理;【实验原理】1)简单动画的原理:显示一个对象,然后把它抹去,把这个图形进行变换后,再在新位置予以显示.当上述过程重复执行时,在视觉上便产生了运动;了解getimage函数和 putimage函数、imagesize函数、malloc 函数、 cleardevice 函数的使用。
2)绘制一点透视图的变换矩阵:1 0 0 0T= 0 1 0 00 0 0 1/dL m n 1+n/d得变换后的点坐标为:x’=(x+l)/(d+(n+z)*d)y’=(y+m)/(d+(n+z)*d)z’=0一.设计思想(一)图形的移动分别画出一个六边形和一个三角形,用两个一维数组p和A来存放其各点坐标;运用putimage(x,y,p,op)函数将六边形不断地向三角形平移,直到到达三角形的边界位置为止。
用到的函数如下: getimage(x1,y1,x2,y2,p); 将屏幕左上角(x1,y1),右下角(x2,y2)的矩形区域内的图象存到指针P 所指向的内存区域中。
putimage(x,y,p,op);将p 所指向的内存区域的内容在屏幕上显示,左上角坐标(x,y)。
(二) 一点透视基本步骤如下:1. 将三维物体平移到适当位置(l,m,n);2. 令视点在z 轴,进行透视变换,变换矩阵如下:1000/110000100001d 3. 最后,向xOy 面作正投影变换,将结果变换到xOy 面上。
如此构造的一点透视变换矩阵为:d n n ml d/1/100000100001+ 则三维形体中任意一点(x,y,z )的一点透视变换的齐次坐标计算形式为:[x’,y’,z’,1]=10)/(*)()/(*)(z n d d m y z n d d l x ++++++;【实验内容】1.图形的移动显示两个图形,然后移动其中一个图形.当被移动的图形超出屏幕范围时,输 出错误信息“Coordinate out of range ”并结束。
计算机图形学实验报告几何变换
计算机图形学实验报告计算机图形学实验报告姓名徐沛华班级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;编译,运行:平移:。
计算机图形学---图形几何变换的实现
实验五图形几何变换的实现班级 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.分析使用矩阵保存图形的坐标位置的方法,二维图形的平移就是一个坐标位置移到另一个坐标位置的重定位过程;对于三维的图形的旋转变换就是图形相应的矩阵进行角度的初等变换,而比例变换即是图形矩阵的相应比例变换。
计算机图形学实验五:图形变换
贵州大学实验报告学院:计算机科学与技术专业:计算机科学与技术班级:计科131实验内容#include"stdafx.h"#include<glut.h>#include<stdlib.h>#include<math.h>GLsizei winWidth = 600, winHeight = 600;GLfloat xwcMin = 0.0, xwcMax = 225.0;GLfloat ywcMin = 0.0, ywcMax = 225.0;class wcPt2D{public:GLfloat x, y;};typedef GLfloat Matrix3x3[3][3];Matrix3x3 matComposite;const GLdouble pi = 3.14159;void init(void){glClearColor(1.0, 1.0, 1.0, 0.0);}void matrix3x3SetIdentity(Matrix3x3matIdent3x3){GLint row, col;for (row = 0; row<3; row++)for (col = 0; col<3; col++)matIdent3x3[row][col] = (row == col);//生成{{1,0,0}{0,1,0}{0,0,1}}}void matrix3x3PreMultiply(Matrix3x3m1, Matrix3x3m2){GLint row, col;Matrix3x3 matTemp;for (row = 0; row<3; row++)for (col = 0; col<3; col++)matTemp[row][col] = m1[row][0] * m2[0][col] + m1[row][1] * m2[1][col] + m1[row][2] * m2[2][col];for (row = 0; row<3; row++)for (col = 0; col<3; col++)m2[row][col] = matTemp[row][col];}void translate2D(GLfloat tx, GLfloat ty)//平移{Matrix3x3 matTransl;matrix3x3SetIdentity(matTransl);matTransl[0][2] = tx;matTransl[1][2] = ty;matrix3x3PreMultiply(matTransl, matComposite);}void rotate2D(wcPt2D pivotPt, GLfloat theta)//旋转{Matrix3x3 matRot;matrix3x3SetIdentity(matRot);matRot[0][0] = cos(theta);matRot[0][1] = -sin(theta);matRot[0][2] = pivotPt.x*(1 - cos(theta)) + pivotPt.y*sin(theta);matRot[1][0] = sin(theta);matRot[1][1] = cos(theta);matRot[31][2] = pivotPt.x*(1 - cos(theta)) - pivotPt.y*sin(theta);matrix3x3PreMultiply(matRot, matComposite);}void scale2D(GLfloat sx, GLfloat sy, wcPt2D fixedPt)//缩放{Matrix3x3 matScale;matrix3x3SetIdentity(matScale);matScale[0][0] = sx;matScale[0][2] = (1 - sx)*fixedPt.x;matScale[1][1] = sy;matScale[1][2] = (1 - sy)*fixedPt.y;matrix3x3PreMultiply(matScale, matComposite);}void transformVerts2D(GLint nVerts, wcPt2D * verts)//组合变化后的矩阵{GLint k;GLfloat temp;for (k = 0; k<nVerts; k++){temp = matComposite[0][0] * verts[k].x + matComposite[0][1] * verts[k].y + matComposite[0][2];verts[k].y = matComposite[1][0] * verts[k].x + matComposite[1][1] *verts[k].y + matComposite[1][2];verts[k].x = temp;}}void triangle(wcPt2D*verts){GLint k;glBegin(GL_TRIANGLES);for (k = 0; k<3; k++)glVertex2f(verts[k].x, verts[k].y);glEnd();}void displayFcn(void){GLint nVerts = 3;wcPt2D verts[3] = { { 50.0, 25.0 }, { 150.0, 25.0 }, { 100.0, 100.0 } };wcPt2D centroidPt;GLint k, xSum = 0, ySum = 0;for (k = 0; k<nVerts; k++){xSum += verts[k].x;ySum += verts[k].y;}centroidPt.x = GLfloat(xSum) / GLfloat(nVerts);centroidPt.y = GLfloat(ySum) / GLfloat(nVerts);wcPt2D pivPt, fixedPt;pivPt = centroidPt;fixedPt = centroidPt;GLfloat tx = 0.0, ty = 100.0;GLfloat sx = 0.5, sy = 0.5;GLdouble theta = pi / 2.0;glClear(GL_COLOR_BUFFER_BIT);glColor3f(0.0, 0.0, 1.0);triangle(verts);//三角形matrix3x3SetIdentity(matComposite);scale2D(sx, sy, fixedPt);//缩小transformVerts2D(nVerts, verts);glColor3f(1.0, 0.0, 0.0);triangle(verts);matrix3x3SetIdentity(matComposite);rotate2D(pivPt, theta);//旋转90transformVerts2D(nVerts, verts);glColor3f(1.0, 0.0, 0.0);triangle(verts);matrix3x3SetIdentity(matComposite);translate2D(tx, ty);//平移transformVerts2D(nVerts, verts);glColor3f(1.0, 0.0, 0.0);实验结果。
实验报告 图像变换
实验报告图像变换实验报告:图像变换引言:图像变换是计算机图形学领域的重要研究方向之一。
通过对图像进行变换,可以改变图像的外观、形状和颜色等特征,从而实现图像处理、图像增强和图像合成等应用。
本实验旨在探索图像变换的原理和方法,并通过实际操作,深入理解图像变换的过程和效果。
一、图像变换的基本概念图像变换是指对图像进行一系列操作,从而改变图像的外观和特征。
常见的图像变换包括缩放、旋转、平移、翻转、镜像和灰度变换等。
这些变换可以通过改变图像的像素值、坐标位置和颜色等信息来实现。
二、图像缩放图像缩放是指改变图像的尺寸大小。
在实际应用中,常常需要将图像缩放到特定的尺寸,以适应不同的显示设备或满足特定的需求。
图像缩放可以通过改变图像的像素数量和像素间距来实现。
常用的图像缩放算法有最近邻插值、双线性插值和双三次插值等。
三、图像旋转图像旋转是指改变图像的方向和角度。
在实际应用中,常常需要将图像旋转到特定的角度,以便更好地观察或处理图像。
图像旋转可以通过改变图像的像素位置和坐标系来实现。
常用的图像旋转算法有最邻近插值法、双线性插值法和双三次插值法等。
四、图像平移图像平移是指改变图像的位置和偏移量。
在实际应用中,常常需要将图像平移到特定的位置,以便更好地与其他图像进行配准或合成。
图像平移可以通过改变图像的像素位置和坐标值来实现。
常用的图像平移算法有最邻近插值法、双线性插值法和双三次插值法等。
五、图像翻转图像翻转是指改变图像的方向和镜像。
在实际应用中,常常需要将图像进行水平翻转或垂直翻转,以便更好地观察或处理图像。
图像翻转可以通过改变图像的像素位置和坐标系来实现。
常用的图像翻转算法有最邻近插值法、双线性插值法和双三次插值法等。
六、图像灰度变换图像灰度变换是指改变图像的亮度和对比度。
在实际应用中,常常需要调整图像的亮度和对比度,以便更好地显示或分析图像。
图像灰度变换可以通过改变图像的像素值和灰度级来实现。
常用的图像灰度变换算法有线性变换、非线性变换和直方图均衡化等。
计算机图形学第五讲图形变换ppt课件
经营者提供商品或者服务有欺诈行为 的,应 当按照 消费者 的要求 增加赔 偿其受 到的损 失,增 加赔偿 的金额 为消费 者购买 商品的 价款或 接受服 务的费 用
旋转变换ቤተ መጻሕፍቲ ባይዱ
• 将坐标系平移回原来的原点
1 0 0
x*y*1 x2 y2 1 0 1 0x2 y2 1 Txf yf
二维图形的几何变换
• 设二维图形变换前坐标为(x,y,1),变换后为
(x*,y*,1)
a d g
•
1.
二维变换矩阵
T2D
b
e
h
c f i
• 注意:T2D可看作三个行向量,其中 • [1 0 0]:表示x 轴上的无穷远点
• [0 1 0]:表示y 轴上的无穷远点
• [0 0 1]:表示原点
9
经营者提供商品或者服务有欺诈行为 的,应 当按照 消费者 的要求 增加赔 偿其受 到的损 失,增 加赔偿 的金额 为消费 者购买 商品的 价款或 接受服 务的费 用
x*y*1 xy1 c so in c ss io n 0 0 s xco ys sin xsi n yco1 s
0 0 1
14
经营者提供商品或者服务有欺诈行为 的,应 当按照 消费者 的要求 增加赔 偿其受 到的损 失,增 加赔偿 的金额 为消费 者购买 商品的 价款或 接受服 务的费 用
3、 当h=1时产生的齐次坐标称为“规格化坐
标”,因为前n个坐标就是普通坐标系下的n维坐
标。
7
经营者提供商品或者服务有欺诈行为 的,应 当按照 消费者 的要求 增加赔 偿其受 到的损 失,增 加赔偿 的金额 为消费 者购买 商品的 价款或 接受服 务的费 用
计算机图形学第五章图形变换
计算机图形学第五章图形变换第五章图形变换重点:掌握⼆维⼏何变换、⼆维观察变换、三维⼏何变换以及三维观察变换。
难点:理解常⽤的平移、⽐例、旋转变换,特别是复合变换。
课时安排:授课4学时。
图形变换包括⼆维⼏何变换,⼆维观察变换,三维⼏何变换和三维观察变换。
为了能使各种⼏何变换(平移、旋转、⽐例等)以相同的矩阵形式表⽰,从⽽统⼀使⽤矩阵乘法运算来实现变换的组合,现都采⽤齐次坐标系来表⽰各种变换。
齐次坐标系齐次坐标系:n维空间中的物体可⽤n+1维齐次坐标空间来表⽰。
例如⼆维空间直线ax+by+c=0,在齐次空间成为aX+bY+cW=0,以X、Y和W为三维变量,构成没有常数项的三维平⾯(因此得名齐次空间)。
点P(x、y)在齐次坐标系中⽤P(wx,wy,w)表⽰,其中W是不为零的⽐例系数。
所以从n维的通常空间到n+1维的齐次空间变换是⼀到多的变换,⽽其反变换是多到⼀的变换。
例如齐次空间点P(X、Y、W)对应的笛卡尔坐标是x=X/W和y=Y/W。
将通常笛卡尔坐标⽤齐次坐标表⽰时,W的值取1。
采⽤齐次坐标系可以将平移、⽐例、旋转这三种基本变换都以相同的矩阵形式来表⽰,并统⼀地⽤矩阵乘法来实现变换的组合。
齐次坐标系在三维透视变换中有更重要的作⽤,它使⾮线形变换也能采⽤线形变换的矩阵表⽰形式。
5.1 ⼆维⼏何变换⼆维⼏何变换就是在平⾯上对⼆维点的坐标进⾏变换,从⽽形成新的坐标。
⼆维⼏何变换主要包括:平移、⽐例、旋转、对称、错切、仿射和复合变换。
5.1.1 ⼆维平移变换如图所⽰,它使图形移动位置。
新图p'的每⼀图元点是原图形p中每个图元点在x和y⽅向分别移动Tx和Ty产⽣,所以对应点之间的坐标值满⾜关系式x'=x+Txy'=y+Ty可利⽤矩阵形式表⽰成:[x' y']=[x y]+[Tx Ty]简记为:P'=P+T,T=[Tx Ty]是平移变换矩阵(⾏向量)。
从矩阵形式来看,平移变换是矩阵加法,⽽⽐例和旋转变换则是矩阵乘法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
贵州大学实验报告
学院:计算机科学与技术专业:计算机科学与技术班级:计科131
实验内容#include"stdafx.h"
#include<glut.h>
#include<stdlib.h>
#include<math.h>
GLsizei winWidth = 600, winHeight = 600;
GLfloat xwcMin = 0.0, xwcMax = 225.0;
GLfloat ywcMin = 0.0, ywcMax = 225.0;
class wcPt2D{
public:
GLfloat x, y;
};
typedef GLfloat Matrix3x3[3][3];
Matrix3x3 matComposite;
const GLdouble pi = 3.14159;
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0);
}
void matrix3x3SetIdentity(Matrix3x3matIdent3x3)
{
GLint row, col;
for (row = 0; row<3; row++)
for (col = 0; col<3; col++)
matIdent3x3[row][col] = (row == col);//生成{{1,0,0}{0,1,0}{0,0,1}}
}
void matrix3x3PreMultiply(Matrix3x3m1, Matrix3x3m2)
{
GLint row, col;
Matrix3x3 matTemp;
for (row = 0; row<3; row++)
for (col = 0; col<3; col++)
matTemp[row][col] = m1[row][0] * m2[0][col] + m1[row][1] * m2[1][col] + m1[row][2] * m2[2][col];
for (row = 0; row<3; row++)
for (col = 0; col<3; col++)
m2[row][col] = matTemp[row][col];
}
void translate2D(GLfloat tx, GLfloat ty)//平移
{
Matrix3x3 matTransl;
matrix3x3SetIdentity(matTransl);
matTransl[0][2] = tx;
matTransl[1][2] = ty;
matrix3x3PreMultiply(matTransl, matComposite);
}
void rotate2D(wcPt2D pivotPt, GLfloat theta)//旋转
{
Matrix3x3 matRot;
matrix3x3SetIdentity(matRot);
matRot[0][0] = cos(theta);
matRot[0][1] = -sin(theta);
matRot[0][2] = pivotPt.x*(1 - cos(theta)) + pivotPt.y*sin(theta);
matRot[1][0] = sin(theta);
matRot[1][1] = cos(theta);
matRot[31][2] = pivotPt.x*(1 - cos(theta)) - pivotPt.y*sin(theta);
matrix3x3PreMultiply(matRot, matComposite);
}
void scale2D(GLfloat sx, GLfloat sy, wcPt2D fixedPt)//缩放
{
Matrix3x3 matScale;
matrix3x3SetIdentity(matScale);
matScale[0][0] = sx;
matScale[0][2] = (1 - sx)*fixedPt.x;
matScale[1][1] = sy;
matScale[1][2] = (1 - sy)*fixedPt.y;
matrix3x3PreMultiply(matScale, matComposite);
}
void transformVerts2D(GLint nVerts, wcPt2D * verts)//组合变化后的矩阵
{
GLint k;
GLfloat temp;
for (k = 0; k<nVerts; k++){
temp = matComposite[0][0] * verts[k].x + matComposite[0][1] * verts[k].y + matComposite[0][2];
verts[k].y = matComposite[1][0] * verts[k].x + matComposite[1][1] *
verts[k].y + matComposite[1][2];
verts[k].x = temp;
}
}
void triangle(wcPt2D*verts)
{
GLint k;
glBegin(GL_TRIANGLES);
for (k = 0; k<3; k++)
glVertex2f(verts[k].x, verts[k].y);
glEnd();
}
void displayFcn(void)
{
GLint nVerts = 3;
wcPt2D verts[3] = { { 50.0, 25.0 }, { 150.0, 25.0 }, { 100.0, 100.0 } };
wcPt2D centroidPt;
GLint k, xSum = 0, ySum = 0;
for (k = 0; k<nVerts; k++)
{
xSum += verts[k].x;
ySum += verts[k].y;
}
centroidPt.x = GLfloat(xSum) / GLfloat(nVerts);
centroidPt.y = GLfloat(ySum) / GLfloat(nVerts);
wcPt2D pivPt, fixedPt;
pivPt = centroidPt;
fixedPt = centroidPt;
GLfloat tx = 0.0, ty = 100.0;
GLfloat sx = 0.5, sy = 0.5;
GLdouble theta = pi / 2.0;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.0, 1.0);
triangle(verts);//三角形
matrix3x3SetIdentity(matComposite);
scale2D(sx, sy, fixedPt);//缩小
transformVerts2D(nVerts, verts);
glColor3f(1.0, 0.0, 0.0);
triangle(verts);
matrix3x3SetIdentity(matComposite);
rotate2D(pivPt, theta);//旋转90
transformVerts2D(nVerts, verts);
glColor3f(1.0, 0.0, 0.0);
triangle(verts);
matrix3x3SetIdentity(matComposite);
translate2D(tx, ty);//平移
transformVerts2D(nVerts, verts);
glColor3f(1.0, 0.0, 0.0);
实验结
果。