华中科技大学计算机图形学实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
}