计算机图形学(二)输出图元_19_显示窗口重定形函数

OpenGL显示窗口重定形函数

在介绍性的OpenGL程序中,我们讨论了建立初始显示窗口的函数。但是在生成图形后,常需要用鼠标将显示窗口拖到屏幕的另一位置或改变其形状。改变显示窗口的尺寸可能改变其纵横比并引起对象形状的改变。

为了允许对显示窗口尺寸的改变做出反应,GLUT库提供下面的函数:

glutReshapeFunc(winReshapeFcn);

该函数可和其他GLUT函数一起放在程序的主过程中,它在显示窗口尺寸输入后立即激活。该GLUT函数的变量是接受新窗口宽度和高度的过程名。我们可以接着使用新尺寸去重新设置投影参数并完成任何其他操作,包括改变显示窗口颜色。另外,我们可以保存宽度和高度给程序中的其他过程使用。

作为一个例子,下列程序展示了怎样构造winReshapeFcn过程。命令glLoadIdentity包含在重定形函数中,从而使前面任意的投影参数值对新的投影设置不起作用。该程序显示了讨论的规则六边形。尽管本例中的六边形中心(在圆的中心位置)用显示窗口参数的概念描述,但是该六边形的位置不受显示窗口尺寸的任何改变的影响。这是因为六边形在显示表中定义,并且仅仅是最初的中心坐标存储在表中。如果希望在改变显示窗口尺寸时改变六边形的位置,则需要使用另一种方法来定义六边形或改变显示窗口的坐标参考。图3.64给出了该程序的输出。

#include <GL/glut.h>
#include <math.h>
#include <stdlib.h>

const double TWO_PI = 6.2831853;

/* Intial display-window size.*/
GLsizei winWidth = 400, winHeight = 400;
GLuint regHex;

class screenPt
{
   private:
       GLint x,y;
	public:
	/* Default Constructor: initializes coordinate position to (0, 0).*/
	screenPt ( ) {
	   x = y = 0;
	}
	void setCoords (GLint xCoord, GLint yCoord) {
	   x = xCoord;
	   y = yCoord;
	}
	GLint getx () const {
	   return x;
	}
	GLint gety () const {
	   return y;
	}
};
static void init (void)
{
    screenPt hexVertex, circCtr;
	GLdouble theta;
	GLint k;

	/* Set circle center coordinates.*/
	circCtr.setCoords (winWidth / 2, winHeight/2);

	glClearColor (1.0, 1.0, 1.0, 0.0);//Display-window color = white.

	/* Set up a display list for a red regular hexagon.
	 * Vertices for the hexagon are Six equally spaced
	 * points around the circumference of a circle.
	 */
	 regHex = glGenLists (1); // Get an identifier for the display list.
	 glNewList (regHex, GL_COMPILE);
	    glColor3f (1.0, 0.0, 0.0); // Set fill color for hexagon to red.
		glBegin (GL_POLYGON);
		    for (k = 0; k < 6; k++){
		    theta = TWO_PI * k / 6.0;
		        hexVertex.setCoords (circCtr.getx () + 150 * cos (theta), circCtr.gety () + 150 * sin (theta));
		        glVertex2i (hexVertex.getx (), hexVertex.gety ());
		    }
	    glEnd ();
	glEndList ();
}
void regHexagon (void)
{
    glClear (GL_COLOR_BUFFER_BIT);
	glCallList (regHex);
	glFlush();
}

void winReshapeFcn (int newWidth, int newHeight)
{
    glMatrixMode (GL_PROJECTION);
	glLoadIdentity ( );
	gluOrtho2D (0.0, (GLdouble) newWidth, 0.0, (GLdouble) newHeight);

	glClear (GL_COLOR_BUFFER_BIT);
}

void main (int argc, char** argv)
{
    glutInit (&argc, argv);
	glutInitDispayMode (GLUT_SINGLE | GLUT_RGB);
	glutInitWindowPosition (100, 100);
	glutInitWindowSize (winWidth, winHeight);
	glutCreateWinow ("Reshape-Function & Display-List Example");

	init ( );
	glutDisplayFunc (regHexagon);
	glutReshapeFunc (winReshapeFcn);

	glut MainLoop ();
}
时间: 2024-10-06 22:30:54

计算机图形学(二)输出图元_19_显示窗口重定形函数的相关文章

计算机图形学(二)输出图元_18_显示列表_2_执行OpenGL显示表

执行OpenGL显示表 采用下面的语句可执行一个显示表: glCallList (listID); 下面的程序段用于创建并执行一个显示表.我们先在xy平面上建立以(200,200)为中心坐标.半径为150的圆周上六个等距顶点描述的规则六边形的显示表.然而调用glCallList来显示该六边形. const double TWO_PI = 6.2831853; GLuint regHex; GLdouble theta; GLint x, y, k; /* Set up a display lis

计算机图形学(二)输出图元_18_显示列表_1_创建和命名OpenGL显示表

OpenGL显示列表 把对象描述成一个命名的语句序列(或任何其他的命令集)并存储起来既方便又高效.在OpenGL中使用称为显示表(display list)的结构可以做到这一点.一旦建立了显示表,就可以用不同的显示操作来多次引用该表.在网格中,描述图形的显示表存放在服务器中,以避免每次显示场景时都要传送表中的命令.我们可以为以后的执行来建立并存储显示表,或指定表中的命令立即执行.显示表对层次式建模特别有用,因为一个复杂的对象可以用一组简单的对象来描述. 创建和命名OpenGL显示表 使用glNe

计算机图形学(二)输出图元_18_显示列表_3_删除 OpenGL 显示表

删除 OpenGL 显示表 要删除连续的一组显示表,可调用函数: glDeleteLists (startID, nLists); 参数startID给出最前面的显示表标识,而参数nLists给出要删除的显示表总数.例如,语句: glDeleteLists (5, 4); 删除4个显示表,其标识为5, 6, 7和8.没有显示表对应的标识被忽略.

计算机图形学(二)输出图元_20_章节总结(上)

输出图元章节总结 发了好久第2章终于结束了,本章中讨论的输出图元为使用直线.曲线.填充区域.单元阵列样式和文本构造图形提供了基本的工具.我们通过在笛卡儿世界坐标系统中给出几何描述来指定图元. 用于沿线段路径绘制像素的三种方法是DDA算法.Bresenham算法和中点算法,Bresenham算法和中点算法是等同的并且是最有效的.沿线段路径的像素的颜色位存储按照递增地计算内存地址的方式而有效完成.任何线段生成算法都可以通过分割线段并将分割的线段分布到可用处理器上来获得并行的实现. 圆和椭圆采用中点算

计算机图形学(二)输出图元_10_多边形填充区_1_多边形分类和识别

多边形填充区 一个多边形(polygon)在数学上定义为由三个或者更多称为顶点的坐标位置描述的平面图形,这些顶点由称为多边性的边(edge或者side)顺序连接.进一步来看,几何上要求多边形的边除了端点之外没有其他公共点.因此,根据定义,一个多边形在其单一平面上必须有其所有的顶点且边之间无交叉.多边形的例子有三角形.矩形.八边形和十六边形等.有时,任一有封闭折线边界的平面图形暗指一个多边形,而若其没有交叉边则称为标准多边形(( standard polygon)或简单多边形( simple po

计算机图形学(二)输出图元_6_OpenGL曲线函数_5_其他曲线

其他曲线 许多曲线函数在对象建模.动画轨迹的描述.数据和函数的图形化以及其他图形应用中是十分有用的.常见的曲线包括圆锥曲线.三角和指数函数.概率分布.通用多项式和样条函数.这些曲线的显示可采用类似于前面讨论的圆和椭圆函数来生成.沿曲线轨迹的位置可直接从表达式y =f (x)或参数方程中得到.此外,还可以使用增量中点算法绘制用隐式函数f(x,y) = 0描述的曲线. 显示一指定的曲线函数的简单方法是使用直线段来逼近曲线.这时,对于要得到沿曲线轨迹的等距线段的端点位置,则可以使用参数表达式.也可以按

计算机图形学和OpenGL(二)坐标系和绘制点线函数

这节开始前我们先了解一下图元的概念.图形软件包中用来描述各种图形元素的函数称为图形输出原语,也称图元(primitive).而描述对象几何要素的输出图元一般称为几何图元.点和线是最简单的几何图元,本节就会简单介绍点和线段的绘制方法. 一.坐标系统. 坐标系统一般分为屏幕坐标和OpenGL中的绘图坐标. 在上一节中我们简单的写了个示例程序,程序中介绍了gluOrtho2D命令.我们可以利用该命令设定一个二维笛卡尔坐标系.该函数的四个变量制定的是显示图形x和y坐标范围.所以我们可以使用下面代码制定一

[计算机图形学] 基于C#窗口的Bresenham直线扫描算法、种子填充法、扫描线填充法模拟软件设计(一)

一.首先说明: 这是啥? —— 这是利用C#FORM写的一个用来演示计算机图形学中 ①Bresenham直线扫描算法(即:连点成线):②种子填充法(即:填充多边形):③扫描线填充法 有啥用? ——  无论是连点成线还是区域填充在高级编程中基本上都提供很高效的库函数来调用.这里拿出这些算法一方面有利于大家理解那些封装的函数底层是实现:另一方面是方便嵌入式TFT屏幕底层驱动开发时借鉴的. 是啥样? ——  如下面的操作,不言而喻. 二.进入正题: 2-1.直线的扫描转换 图形的扫描转换实质就是在光栅

【计算机图形学课程】二.MFC鼠标响应函数模拟画图软件

上一篇文章我们讲述MFC绘制图形的基本函数,包括绘制直线.绘制矩形.绘制椭圆及绘制文字,同时通过绕圆旋转和矩形平移简单的理解了图形学知识.这篇文章我将介绍鼠标响应和键盘响应,通过这些事件让学生实现一个类似画图的简单软件,同时充分发挥学生想象,自己创作东西.        前文:       [计算机图形学课程]一.MFC基本绘图函数使用方法 一. MFC工程创建及鼠标响应 新建一个MFC 单文档的应用程序"MousePic". 然后,选择"View(视图)"->