基本图元的生成算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基本图元的生成算法

一、实验目的1、初步了解显示窗口与视区的关系2、掌握OpengGL点、直线、多边形的绘制3、掌握DDA直线生成算法。4、掌握Bresenham直线生成算法二、实验环境硬件要求:PC机,主流配置,最好为独立显卡,显存512M以上。

软件环境:操作系统:Windows XP。语言开发工具:VC6.0。

三、实验内容与要求

1、调出实验一的源代码运行,调整修改使得显示窗口大小改变时,绘制的矩形大小随之改变。如图2-1所示。提示:(1)在main函数里添加注册窗口变化函数glutReshapeFunc(myreshape); (放在glutMainLoop()之前)(2)在程序中添加窗口改变子函数,参数w,h为当前显示窗口的宽和高

void myreshape(GLsizei w, GLsizei h)

{

glViewport(0,0,w,h); //设置视区位置

glMatrixMode(GL_PROJECTION);//设置投影变换模式

glLoadIdentity(); //调单位矩阵,清空当前矩阵堆栈

if(w<=h)

gluOrtho2D(0,300,0,300*(GLfloat)h/(GLfloat)w);

//设置裁剪窗口大小

else

gluOrtho2D(0,300*(GLfloat)w/(GLfloat)h,0,300);

}

a) 显示窗口改变前 b)显示窗口变大后

未修改前的初始源程序参考如下:

/*my first program.cpp*/

#include

void display(void)

{

glClear(GL_COLOR_BUFFER_BIT); //刷新颜色缓冲区

glRectf(0,0,0.5,0.5);

glFlush(); //用于刷新命令队列和缓冲区,使所有尚未被执行的

OpenGL命令得到执行

}

void main(int argc, char** argv)

{

glutInit(&argc, argv); //初始化GLUT库

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); //设置显示模式 glutInitWindowSize(100, 200);

glutCreateWindow("hello"); //创建窗口,标题为“hello”

glutDisplayFunc(display); //用于绘制当前窗口

glutMainLoop(); //表示开始运行程序,用于程序的结尾

}

2、自己参照讲义或教材按照自己的构思画二维平面图形, 修改样本程序

circle-algorithm.cpp将上面的矩形替换成自己构思的二维平面图形。注意顶点的顺序。

参考函数:

(1)、点绘制举例

glPointSize(2.0) //点的大小设置

glBegin(GL_POINTS);

glColor3f(1.0,1.0,1.0);

glVertex2f(-0.5,-0.5); //顶点

glColor3f(1.0,0.0,1.0);

glVertex2f(-0.5,0.5);

glColor3f(0.0,1.0,1.0);

glVertex2f(0.5,0.5);

glColor3f(1.0,1.0,0.0);

glVertex2f(0.5,-0.5);

glEnd()

(2)、直线/三角形/四边形绘制举例

glLineWidth(2.0);

glBegin(GL_LINES);

// glBegin(GL_LINE_STRIP);

// glBegin(GL_LINE_LOOP);

// glBegin(GL_TRIANGLES);

// glBegin(GL_TRIANGLE_STRIP);

// glBegin(GL_TRIANGLE_FAN);

// glBegin(GL_QUADS);

// glBegin(GL_TRIANGLE_STRIP);

glVertex2f(-0.5,0.5);

glVertex2f(-0.5,-0.5);

glColor3f(1.0,1.0,1.0);

glVertex2f(-0.5,0.5);

glColor3f(1.0,1.0,0.0);

glVertex2f(0.5,-0.5);

glEnd();

(3)、多边形举例

glBegin(GL_POLYGON);

glVertex2f(-0.5,0.5);

glVertex2f(-0.5,-0.5);

glColor3f(1.0,1.0,1.0);

glVertex2f(0,-0.5);

glColor3f(1.0,1.0,0.0);

glVertex2f(0.5,-0.5);

glVertex2f(0.5,0.5);

glEnd();

3、读懂DDA直线生成算法伪代码,并修改伪代码,使之变成可行的OpenGL

代码,验证DDA直线生成算法。

DDA直线生成伪代码

//x0,y0 表示直线的起始点, x1,y1表示直线的终止点,color表示直线的绘制颜色

void DDA_line(int x0, int y0, int x1, int y1,int color)

{

int dx = x1 – x0, dy = y1 – y0, k;

float xIncrement , yIncrement ,steps, x = x0, y = y0;

if (abs (dx) > abs (dy)) steps = abs (dx);

else steps = abs (dy);

xIncrement = (float) (dx) /steps;

yIncrement = (float) (dy) /steps;

for (k =0; k

{

Setpixel(round(x), round(y),color);

x += xIncrement; y += yIncrement;

}

}

提示:

使用学过的画点函数替换setpixel(round(x), round(y),color)函数。

相关文档
最新文档