我是靠谱客的博主 怕孤单豌豆,最近开发中收集的这篇文章主要介绍计算机图形学 实验六 2D图形变换,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、实验目的

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图形变换所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部