您的位置:首页 > 其它

中点画线算法程序

2013-06-11 15:14 344 查看
计算机图形学的课程就这样结束了,想当初刚上课的时候总想在这门课上学点什么,想着在这方面多编程,无奈,又是这样的现状,大学的课程没学好也就是因为这些原因了,有时想为什么当时自己不好好学数据结构,C++,操作系统,计算机网络,有些后悔。。以为自己似乎明白自己没学好的原因,认为现在的自己该知道怎么去学。无奈,又落得这般景象。。。只怪自己,没有好好安排自己的生活,只怪自己思考得还是不够,没有好好管理好自己的时间。目前生活总是有点颓废,过得不是那么精致。。。这不是我想要的生活!!!

回到正题,中点画线的算法:

// xtGL.h
#pragma once
#include <GL/glut.h>
#include <stdlib.h>
// 全局变量说明
static void(*__xtViewportFunc)(int, int, int, int);
// 指向用户自定义的构建视口和相关变换的函数
// 函数说明
int main(int argc, char *argv[]);
void xtMain(int argc, char *argv[]); // xtGL的入口函数
static void xtDefaultInit(); // 默认初始化
void xtViewportFunc(void Func(int, int, int, int));
// 指定用户自定义的构建视口和相关变换的函数
static void xtDefaultViewport(int x, int y, int w, int h);
// 构建视口和相关变换的默认函数
static void xtDefaultReshape(int w, int h); // 默认窗口变化回调函数
static void xtDefaultPaint(void); // 默认场景绘制函数
static void xtView(GLuint m, GLuint n, int i, int j); // 子区间函数
void xtViewInit(int m, int n); // 初始化子区间个数和大小
void xtViewBegin(int i, int j); // 第i行第j列子区间
void xtViewEnd(); // 结束子区间内对象定义
// 函数实现
int main(int argc, char *argv[])
{  xtDefaultInit(); // 默认初始化
xtMain(argc, argv); // xtGL的入口函数
glutMainLoop(); // 开始循环执行OpenGL命令
}
// 默认初始化
static void xtDefaultInit()
{  int scw, sch, w, h; // 屏幕宽度和高度,程序窗口的宽度和高度
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
// 显示模式为:双缓冲区,RGBA颜色模式,使用深度缓冲器
// 只有一次生效,使用该框架只能使用这里规定的显示模式
scw = glutGet(GLUT_SCREEN_WIDTH); // 屏幕宽度
sch = glutGet(GLUT_SCREEN_HEIGHT); // 屏幕高度
h = sch / 2, w = h * 4 / 3; // 程序窗口的高度和宽度
glutInitWindowPosition((scw - w) / 2, (sch - h) / 2);
glutInitWindowSize(w, h);
// 默认窗口高度为屏幕高度的一半,宽高比为4:3,位于屏幕中央
glutCreateWindow(__argv[0]); // 窗口的默认标题
glEnable(GL_DEPTH_TEST); // 打开深度测试
xtViewportFunc(xtDefaultViewport); // 构建视口和相关变换的默认函数
glutReshapeFunc(xtDefaultReshape); // 默认的窗口变化回调函数
glutDisplayFunc(xtDefaultPaint); // 默认的场景绘制函数
}
// 指定用户自定义的构建视口和相关变换的函数
void xtViewportFunc(void Func(int, int, int, int))
{  __xtViewportFunc = Func;
}
// 构建视口和相关变换的默认函数
static void xtDefaultViewport(int x, int y, int w, int h)
{  float aspect;
if(h <= 0) return ;
aspect = 1.0 * w / h; // 窗口横纵比
glViewport(x, y, w, h); // 定义视口
// 默认投影矩阵,y向观察范围为60度,近平面为1,远平面为1000
glMatrixMode(GL_PROJECTION); // 当前矩阵模式为投影矩阵
glLoadIdentity(); // 当前矩阵为单位矩阵
gluPerspective(60, aspect, 1, 1000);
// 定义投影矩阵,参数依次为:y-z夹角;x/y;近平面;远平面
glTranslated(0, 0, - 2); // 远移2单位,保证z坐标可以使用+1
glMatrixMode(GL_MODELVIEW); // 当前矩阵模式为视图造型矩阵
glLoadIdentity(); // 当前矩阵为单位矩阵
}
// 默认窗口变化回调函数(构建视口和相关变换)
static void xtDefaultReshape(int w, int h)
{  __xtViewportFunc(0, 0, w, h);
}
// 默认场景绘制函数
void xtDefaultPaint()
{  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 清除颜色缓存和深度缓存
glutSwapBuffers(); // 交换颜色缓存
}
// 子区间函数,内部使用
static void xtView(GLuint m, GLuint n, int i, int j)
{  int w, h, x, y; // 子区间的宽度和高度以及子区间的左下角坐标
static GLuint svm = 1, svn = 1; // 子区间个数
static GLuint maxRow = 0; // 最大行号
if(i < 0 || j < 0) // 初始化子区间个数
{ svm = m; svn = n; maxRow = m - 1; return ; }
if(svm * svn > 1)
{  // 只有当子区间的个数大于1时,才构建视口和相关变换
w = glutGet(GLUT_WINDOW_WIDTH) / svn; // 子区间宽度
h = glutGet(GLUT_WINDOW_HEIGHT) / svm; // 子区间高度
x = j * w; y = (maxRow - i) * h; // 第i行j列子区间的左下位置
__xtViewportFunc(x, y, w, h); // 构建视口和相关变换
}
glPushMatrix(); // 保存当前矩阵
glPushAttrib(GL_ALL_ATTRIB_BITS); // 保存所有当前属性值
}
// 初始化子区间个数和大小
void xtViewInit(int m, int n)
{  xtView(m, n, - 1, - 1);
}
// 第i行第j列子区间(找到该子区间的位置,开始定义对象)
void xtViewBegin(int i, int j)
{  xtView(0, 0, i, j);
}
// 结束子区间内的对象定义(恢复当前属性值和当前矩阵)
void xtViewEnd()
{  glPopAttrib();
glPopMatrix();
}


//Demo.h
#pragma once
#include <gl/glut.h>
#include "xtGlu.h"
void init()
{  glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_POLYGON_SMOOTH);
}

void axis(int x1, int y1, int x2, int y2)
{  int x, y;
glEnable(GL_LINE_STIPPLE);
glLineStipple(1, 0XCCCC);
glLineWidth(1);
glColor3f(0.5, 0.5, 0.5);
glBegin(GL_LINES);
for (x = x1; x <= x2; ++x)
glVertex2i(x, y1), glVertex2i(x, y2);
for (y = y1; y <= y2; ++y)
glVertex2i(x1, y), glVertex2i(x2, y);
glEnd();
glDisable(GL_LINE_STIPPLE);
for (x = x1; x <= x2; ++x)
xtStrokeText(x, y1 - 0.5, 0.003, "%d", x);
for (y = y1; y <= y2; ++y)
xtStrokeText(x1 - 0.75, y, 0.003, "%d", y);
}


#include <gl/glut.h>
#include "Demo.h"
void Mid_Line1(int x1, int y1, int x2, int y2)
{  int a, b, c, x, y, p, _2a, _2a_2b;
if(x2 < x1)
{  int temp;
temp = x1, x1 = x2, x2 = temp;
temp = y1, y1 = y2, y2 = temp;
}
a = y1 - y2, b = x2 - x1;
_2a = 2 * a , _2a_2b = _2a + 2 * b;
y = y1, p = 2 * a + b;
for(x = x1; x <= x2; ++x)
{  glVertex2i(x, y);
if(p > 0)
p = p + _2a;
else
++y, p += _2a_2b;
}
}
//
void reshape(int w, int h)
{  glViewport(0, 0, w, h);
glLoadIdentity();
gluOrtho2D(19, 31, 9, 21);
}
//
void display()
{
glClearColor(1, 1, 1, 0);
glClear(GL_COLOR_BUFFER_BIT);
axis(20, 10, 30, 18);
glLineWidth(3);
glColor3f(0, 0, 1);
glBegin(GL_LINES);
glVertex2i(20, 10), glVertex2i(30, 18);
glEnd();
glPointSize(15);
glColor3f(1, 0, 0);
glBegin(GL_POINTS);
Mid_Line1(20, 10, 30, 18);
glEnd();
glFlush();
}
//
int main()
{  glutInitWindowSize(400, 400);
glutCreateWindow("中点画线算法演示!");
glutReshapeFunc(reshape);
init();
glutDisplayFunc(display);
glutMainLoop();
}


运行效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: