计算机图形学图形的几何变换的实现算法实验二 图形的几何变换的实现算法班级 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、上面所讨论的图形变换时相对于坐标原点或坐标轴来进行的。
实际中,常常需要相对于人一点或任一轴来进行变换。