华中科技大学计算机图形学实验报告

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

课程实验报告课程名称:计算机图形学

专业班级:

学号:

姓名:

指导教师:

报告日期:2015-11-11

计算机科学与技术学院

实验一:分形图形绘制

一、实验目的(标题四号黑体)

(1)理解OpenGL 中glut 程序框架;

(2)掌握二维基本图形绘制算法;

(3)利用二维基本图形绘制算法,扩展对其他复杂图形的绘制理解。

二、实验内容

1、实验算法

(a)中点Bresenham算法画线

a)输入直线的两个端点:端点、端点。必要时交换A、

B两点的坐标,使A点不在B点的右边。

令,,,

b)讨论直线的斜率的大小及正负,分四种情况分别逐点画线:

i.当

最大位移方向为x轴。构建判别公式:

其中,初值。

当时,,。

当时,。

ii.当

最大位移方向为x轴。构建判别公式:

其中,初值。

当时,,。

当时,。

iii.当

最大位移方向为x轴。构建判别公式:

其中,初值。

当时,,。

当时,。

iv.当

最大位移方向为x轴。构建判别公式:

其中,初值。

当时,,。

当时,。

c)当直线没有画完时重复b)步骤

(b)绘制分形三角形

a)输入三角形的三个端点:端点、端点、端点

、递归层数n。

b)连接A、B、C三点。

c)当时,连接输入三角形三边的中点,将分割得到的四个三角形

中包含顶点的三个、作为输入参数,递归调用本步骤。

2、源程序

#include

#include

#include

#define ROUND(a) ((int )(a+0.5)) //求某个数的四舍五入值

using namespace std;

//全局变量声明:三角形三顶点及递归层数

GLint Global_xa, Global_ya, Global_xb, Global_yb, Global_xc, Global_yc;

int Global_n;

void init(void)

{

glClearColor(1.0, 1.0, 1.0, 0.0);//指定窗口的背景色为白色

glMatrixMode(GL_PROJECTION);//对投影矩阵进行操作

gluOrtho2D(0.0, 600.0, 0.0, 600.0);//使用正投影

}

//绘制直线的函数

void lineDDA(GLint xa, GLint ya, GLint xb, GLint yb)

{

GLint dx = xb - xa, dy = yb - ya; //计算x,y方向的跨距

int steps, k; //定义绘制直线像素点的步数

float xIcre, yIcre, x = xa, y = ya; //定义步长的增量

//取X,Y方向跨距较大的值为步数if (abs(dx) > abs(dy)) steps = abs(dx);

else steps = abs(dy);

//根据步数来求步长增量

xIcre = dx / (float)steps;

yIcre = dy / (float)steps;

//从起点开始绘制像素点

for (k = 0; k <= steps; k++)

{

glBegin(GL_POINTS);

glVertex2f(x, y);

glEnd();

x += xIcre;

y += yIcre;

}

}

//绘制直线的函数(中点Bresenham算法)

void lineBre(GLint xa, GLint ya, GLint xb, GLint yb)

{

GLint dx, dy, d, UpIncre, DownIncre, x, y; //统一规定UpIncre为能使非最大位移方向坐标改变时的Di增量

//统一规定DownIncre为不能使非最大位移方向坐标改变时的Di增量

if (xa > xb) {

/* 确保a点不在b点的右方*/

x = xb; xb = xa; xa = x;

y = yb; yb = ya; ya = y;

}

x = xa; y = ya; //计算画线起点

dx = xb - xa; dy = yb - ya; //计算dx和dy

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

{

/* 考虑|k|<=1的情况*/

if (dy >= 0) {

/* 考虑k>=0的情况*/

d = dx - 2 * dy; //计算D0

UpIncre = 2 * dx - 2 * dy; DownIncre = -2 * dy; //计算UpIncre和DownIncre

while (x <= xb) {

/* 从线起点画到线终点*/

glBegin(GL_POINTS);

glVertex2i(x, y); // 在(x,y)位置画点

glEnd();

x++; //移动下一画点位置的x轴坐标

if (d < 0) {

/* 考虑Di<0的情况*/

y++; //移动下一画点位置的y轴坐标

d += UpIncre; //迭代d

}

else {

/* 考虑Di>=0的情况*/

d += DownIncre; //迭代d

}

}

}

else {

/* 考虑k<0的情况*/

d = -dx - 2 * dy; //计算D0

UpIncre = -2 * dx - 2 * dy; DownIncre = -2 * dy; //计算UpIncre和DownIncre

while (x <= xb) {

/* 从线起点画到线终点*/

glBegin(GL_POINTS);

glVertex2i(x, y); // 在(x,y)位置画点

glEnd();

x++; //移动下一画点位置的x轴坐标

if (d > 0) {

/* 考虑Di>0的情况*/

y--; //移动下一画点位置的y轴坐标

d += UpIncre; //迭代d

}

else {

/* 考虑Di>=0的情况*/

d += DownIncre; //迭代d

}

相关文档
最新文档