概述
一、实验目的
1.了解和掌握2D图形变换:学会使用OpenGL平移、旋转和比例缩放函数,掌握基本图形变换和复合图形变换实现的方法。
2.综合运用2D图形变换函数、人机交互函数,设计2D交互图形程序。
二、实验内容
要求使用OpenGL几何变换函数改写代码。
1)使用glTranslatef()函数,实现2D图形平移,可以改写实验二的矩形交互移动程序,如实验图6-1所示。
实验代码:
#include "shiyan6(1).h"
#include "stdafx.h"
#include <GL/glut.h>
#include <math.h>
#define PI 3.14159
int n=6,R=10;
float tx=0,ty=0;
void Keyboard(unsigned char key, int x,int y);
void Display(void);
void Reshape(int w,int h);
void myidle();
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
char *argv[]={"hello"," "};
int argc=2;
glutInit(&argc, argv);
glutInitWindowSize(700,700);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("A Moving Polygon");
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutIdleFunc(myidle);
glutMainLoop();
return 0;
}
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(tx,ty,0);
glColor3f(1.0, 0, 0);
glBegin(GL_POLYGON);
for (int i = 0; i < n; i++)
glVertex2f(R*cos(i * 2 * PI / n), R*sin( i * 2 * PI / n));
glEnd();
glutSwapBuffers();
}
void myidle()
{
tx+=0.001;
if(tx>100)
tx=0;
if(ty>100)
ty=0;
glutPostRedisplay();
}
void Reshape(GLsizei w,GLsizei h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.5*R*w/h,1.5*R*w/h,-1.5*R,1.5*R);
glViewport(0,0,w,h);
glMatrixMode(GL_MODELVIEW);
}
实验结果:
平移前:
平移后:
2)使用glRotatef()函数,实现2D图形绕平面固定点旋转,可以改写实验三的六边形旋转程序,如实验图6-2所示。
实验代码:
#include "stdafx.h"
#include "shiyan6(2).h"
#include <GL/glut.h>
#include <math.h>
#define PI 3.14159
int n=6,R=10;
float cx=0,cy=0;
float theta=0.0;
void Keyboard(unsigned char key, int x,int y);
void Display(void);
void Reshape(int w,int h);
void myidle();
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
char *argv[]={"hello"," "};
int argc=2;
glutInit(&argc, argv);
glutInitWindowSize(700,700);//设置显示窗口大小
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // 设置显示模式(注意双缓存)
glutCreateWindow("A Rotating Square"); // 创建显示窗口
glutDisplayFunc(Display); // 注册显示回调函数
glutReshapeFunc(Reshape); //注册窗口改变回调函数
glutIdleFunc(myidle);
glutMainLoop();
return 0;
}
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(cx,cy,0);
glRotatef(theta,0,0,1);
glColor3f(1.0, 0, 0);
glBegin(GL_POLYGON);
for (int i = 0; i < n; i++)
glVertex2f(R*cos(i * 2 * PI / n), R*sin( i * 2 * PI / n));
glEnd();
glutSwapBuffers();
}
void myidle()
{
theta+=0.01;
if(theta>360)
theta-=360;
glutPostRedisplay();
}
void Reshape(GLsizei w,GLsizei h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.5*R*w/h,1.5*R*w/h,-1.5*R,1.5*R);
glViewport(0,0,w,h);
glMatrixMode(GL_MODELVIEW);
}
实验结果:
旋转前:
旋转后:
3)使用glScalef()函数,实现绕固定点缩放2D图形,在前面程序基础上设计修改,如实验图6-3所示。
实验代码:
#include "shiyan6(3).h"
#include "stdafx.h"
#include <GL/glut.h>
#include <math.h>
#define PI 3.14159
int n=6,R=10;
float cx=0,cy=0;
float sx=1,sy=1;
float theta=0.0;
void Keyboard(unsigned char key, int x,int y);
void Display(void);
void Reshape(int w,int h);
void myidle();
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
char *argv[]={"hello"," "};
int argc=2;
glutInit(&argc, argv);
glutInitWindowSize(700,700);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("A Rotating Square");
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutIdleFunc(myidle);
glutMainLoop();
return 0;
}
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(cx,cy,0);
glRotatef(theta,0,0,1);
glScalef(sx,sy,1);
glTranslatef(-cx,-cy,0);
glColor3f(1.0, 0, 0);
glBegin(GL_POLYGON);
for (int i = 0; i < n; i++)
glVertex2f(R*cos(i * 2 * PI / n), R*sin( i * 2 * PI / n));
glEnd();
glutSwapBuffers();
}
void myidle()
{
theta+=0.001;
if(theta>=360)
theta-=360;
sx=sx*1.0001;
sy=sy*1.0001;
if(sx>3)
sx=1;
if(sy>3)
sy=1;
glutPostRedisplay();
}
void Reshape(GLsizei w,GLsizei h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.5*R*w/h,1.5*R*w/h,-1.5*R,1.5*R);
glViewport(0,0,w,h);
glMatrixMode(GL_MODELVIEW);
}
缩放前:
放大后:
缩小后:
4)修改代码,使得一面带杆小三角红旗沿着杆底不断旋转,见实验图6-4。
实验代码:
// shiyan6(4).cpp : 定义应用程序的入口点
//
#include "stdafx.h"
#include "shiyan6(4).h"
#include <GL/glut.h>
#include "math.h"
// lab-basis.cpp : 定义应用程序的入口点
#define PI 3.14159
int n = 6, R = 10;
float cx = 0, cy = 0; // 平移量
float theta = 0.0; // 旋转角度
void Display(void); // 回显函数
void Reshape(int w, int h); // 窗口改变函数
void myidle();
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
char* argv[] = {"hello ", " "};
int argc = 2;
glutInit(&argc,argv);
glutInitWindowSize(600,600);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("A Rotating Square");
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutIdleFunc(myidle);
glutMainLoop();
return 0;
}
void Display()
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(cx,cy,0); // 平移
glRotatef(theta,0,0,1); // 旋转
glTranslatef(-cx,-cy,0); // 平移
glColor3f(1,1,1);
glBegin(GL_LINES);
glVertex2f(0,0);
glVertex2f(0,10);
glEnd();
// 画三角形
glColor3f(1,0,0);
glBegin(GL_POLYGON);
glVertex2f(0,5);
glVertex2f(0,10);
glVertex2f(5,10);
glEnd();
glutSwapBuffers();
}
void myidle()
{
theta += 0.0001;
if(theta >= 360) theta -= 360;
glutPostRedisplay();
}
void Reshape(int w,int h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.5*R*w/h,1.5*R*w/h,-1.5*R,1.5*R);
glViewport(0,0,w,h);
glMatrixMode(GL_MODELVIEW);
}
实验结果:
5)正六边形边旋转边放大,放大到接近整个显示屏后再不停缩小,如此反复。
实验结果:
- 思考题
1、绕某个固定点旋转时,代码的顺序改写为:
glTranslatef(-cx,-cy,0); //平移回原点
glRotatef(ALPHA,0,0,1); //绕原点旋转ALPHA角度
glTranslatef(cx,cy,0); //平移回去
图形将变成怎样?
答:图形将绕(-cx,-cy)进行旋转。
2、绕某个固定点进行比例缩放时,代码的顺序改写为:
glTranslatef(-cx,-cy,0); //平移回原点
glScalef(Sx,Sy,0); //绕原点水平缩放系数Sx,垂直缩放系数Sy
glTranslatef(cx,cy,0); //平移回去
图形将变成怎样?
答:图形将以(-cx,-cy)为中心进行比例放缩
代码有点问题,但不是很影响写报告,图片没放
最后
以上就是怕孤单豌豆为你收集整理的计算机图形学 实验六 2D图形变换的全部内容,希望文章能够帮你解决计算机图形学 实验六 2D图形变换所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复