900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 二维图形平移变换c语言程序 [转载]计算机图形学Opengl实现二维图形的平移 旋转 缩

二维图形平移变换c语言程序 [转载]计算机图形学Opengl实现二维图形的平移 旋转 缩

时间:2023-11-24 05:52:39

相关推荐

二维图形平移变换c语言程序 [转载]计算机图形学Opengl实现二维图形的平移 旋转 缩

参考课堂教学中关于模型变化的讲解,编写对一个三角形分别实现平移、缩放、旋转等变化的源码及效果图。请以该例为蓝本,实现3题的代码编写。

如下的几幅图,第一幅就是在给出的代码部分进行修改,将GL_FLAT修改为GL_SMOOTH就可以表现出如下的第一幅图的混合色效果。第二幅图中表现得是经过几种分开的变换的效果,分别为平移、旋转、缩放和原图,其中也是使用了混合颜色的方式进行填充的。为了使几个转换之间相互不影响,应注意每一个变换之前要加上这样的一行代码函数:glLoadIdentity();实现的核心代码在第二幅图下面附上。第三幅图中即为要求的完成几种变换的复合变换,这里要注意的为要函数调用采用的为列向量的方式,所以在变换时要注意变换的实际顺序与代码的书写顺序为相反的,所以这里如果不能正确的调用函数,就会出现问题。当然要求尽量调整裁剪窗口使其图形尽量显示在视口的中心,所以这里要调整gluOrtho2D(-200.0,250.0,-100.0*(GLfloat)h/(GLfloat)w,200.0*(GLfloat)h/(GLfloat)w);这样基本上就显示在中间位置了,也就是第三幅图中的效果。详细代码和效果附下:

第一幅图

第二幅图

【注】核心代码,其他不同代码如下面附代码的有色部分:

voiddisplay(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0,1.0,1.0);

glLoadIdentity();

glColor3f(1.0,1.0,1.0);

glTranslatef(-100.0,-50.0,1.0);

draw_triangle();

glLoadIdentity();

glTranslatef(0.0,100.0,1.0);

draw_triangle();

glLoadIdentity();

glRotatef(90.0,0.0,0.0,1.0);

draw_triangle();

glLoadIdentity();

glScalef(0.5,0.5,1.0);

draw_triangle();

glFlush();

}

第三幅图

【注】第三幅图效果的实现代码:

#include

#include

#include

voidinit(void)

{

glClearColor(0.0,0.0,0.0,0.0);

glShadeModel(GL_SMOOTH);

}

voiddraw_triangle(void)

{

glShadeModel(GL_SMOOTH);

glColor3f(0.2,0.7,0.30);

glBegin(GL_TRIANGLES);//画出三角形,为混合色填充方式

glVertex2f(50.0,25.0);

glColor3f(0.4,0.5,0.60);

glVertex2f(150.0,25.0);

glColor3f(0.9,0.7,0.8);

glVertex2f(100.0,100.0);

glEnd();

}

voiddisplay(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0,1.0,1.0);

glLoadIdentity();

glColor3f(1.0,1.0,1.0);

glTranslatef(-100.0,-50.0,1.0);

draw_triangle();

glLoadIdentity();

glTranslatef(0.0,100.0,1.0);

glRotatef(90.0,0.0,0.0,1.0);

glScalef(0.5,0.5,1.0);

draw_triangle();//经过三种变换后画出图形

glFlush();

}

voidreshape(intw,inth)

{

glViewport(0,0,(GLsizei)w,(GLsizei)h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

if(w<=h)

gluOrtho2D(-200.0,250.0,-100.0*(GLfloat)h/(GLfloat)w,

200.0*(GLfloat)h/(GLfloat)w);//调整裁剪窗口

else

gluOrtho2D(-200.0*(GLfloat)w/(GLfloat)h,

250.0*(GLfloat)w/(GLfloat)h,-50.0,200.0);

glMatrixMode(GL_MODELVIEW);

}

intmain(intargc,char**argv)

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowSize(600,600);

glutInitWindowPosition(100,100);

glutCreateWindow(argv[0]);

init();

glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutMainLoop();

return0;

}

二维图形平移变换c语言程序 [转载]计算机图形学Opengl实现二维图形的平移 旋转 缩放复合变换...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。