计算机图形学图形的几何变换的实现算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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.},{},{},创建一个长度分别为600,600的窗口,窗口的左上角位于屏幕坐标(100,100)处。然后绘制一个由上述顶点所绘制的三角形,实现该三角形进行下列几何变换:首先使三角形沿着其中心的x轴和y轴方向缩小50%,然后沿着出示中心旋转90度;最后沿着y轴平移100个单位。

三、实验代码如下

1实验一

#include

#include <>

Void init (void)

{

glClearVolor ,,,;

glShadeModel (GL-FLAT);

}

Void draw_triangle(void)

{

glBegin(GL_LINE_LOOP);

glVertex2f,;

glVertex2f,;

glVertex2f,;

glEnd();

}

Void display(void)

{

glClear (GL_COLOR_BUEFER_BIT);

glColor3f,,;

glLoadIdentity();

glColor3f,,;

draw_triangle();

glEnable (GL_LINE_STIPPLE);

glLineStipple (1,0xF0F0);

glLoadIdentity();

glTranslatef ,,;

draw_triangle();

glLineStipple (1,0xff00);

glLoadIdentity ();

glScalef ,,;

draw_triangle ();

glLineStipple (1,0x8888);

glLoadIdentity();

glRotatef,,,;

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,,*(GLfloat)h/(GLfloat)w,*(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;

}

实验结果如下

相关文档
最新文档