计算机图形学图形的几何变换的实现算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二图形的几何变换的实现算法
班级 08 信计 学号 59 姓名 _____ 分数 _____
一、 实验目的和要求:
1、 掌握而为图形的基本几何变换,如平移,旋转,缩放,对称,错切变换;<
2、 掌握OpenG 冲模型变换函数,实现简单的动画技术。
3、 学习使用OpenGL 生成基本图形。
4、 巩固所学理论知识,加深对二维变换的理解,加深理解利用变换矩阵可 由简单图形得到复杂图形。加深对变换矩阵算法的理解。
编制利用旋转变换绘制齿轮的程序。编程实现变换矩阵算法,绘制给出形体 的三视图。调试程序及分析运行结果。要求每位学生独立完成该实验,并上传实 验报告。
二、 实验原理和内容:
.原理:
图像的几何变换包括:图像的空间平移、比例缩放、旋转、仿射变换和图像插值。
图像几何变换的实质:改变像素的空间位置,估算新空间位置上的像素值。
图像几何变换的一般表达式:[u,v ]=[X (x, y ),Y (x, y )],其中,[u,v ]为变换后图像
像素的笛卡尔坐标, [x, y ]为原始图像中像素的笛卡尔坐标。这样就得到了原始图像与变 换后图像的像素的对应关系。
平移变换:若图像像素点(x, y )平移到(x x 。,y ■ y 。),则变换函数为
u = X (x, y ) =x 沟,
v 二丫(x, y ) = y ■ y 。,写成矩阵表达式为:
比例缩放:若图像坐标 (x,y )缩放到(S x ,s y )倍,则变换函数为:
S x ,S y 分别为x 和y 坐标的缩放因子,其大于1表示放大, 小于1表示缩小。
旋转变换:将输入图像绕笛卡尔坐标系的原点逆时针旋转 v 角度,则变换后图像坐标为: u COST
内容:
:u l :Sx
k ;0 其中,x 0和y 0分别为x 和y 的坐标平移量。
其中,
1、对一个三角形分别实现平移,缩放旋转等变化。
2. 在方向、尺寸和形状方面的变换是用改变对象坐标描述的几何变换来完成的。基本几何变换都是相对于坐标原点和坐标轴进行的几何变换,有平移、旋转、缩放、反射、错切等。
用直线命令画出一个齿(或六边形的一半)7利用旋转变换或对称变换矩阵实现对其
余部分的绘制T调试运行程序T输出图形T分析结果T结束。
编写三维变换算法程序7检查程序的正确性7分段调试程序7输入给出的三维形体各顶点的坐标7执行变换7对算法程序进行必要的调整7更换不同的形体数据继续变换7结束。
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
#include
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;
}
实验结果如下