中点画线算法程序
计算机图形学的课程就这样结束了,想当初刚上课的时候总想在这门课上学点什么,想着在这方面多编程,无奈,又是这样的现状,大学的课程没学好也就是因为这些原因了,有时想为什么当时自己不好好学数据结构,C++,操作系统,计算机网络,有些后悔。。以为自己似乎明白自己没学好的原因,认为现在的自己该知道怎么去学。无奈,又落得这般景象。。。只怪自己,没有好好安排自己的生活,只怪自己思考得还是不够,没有好好管理好自己的时间。目前生活总是有点颓废,过得不是那么精致。。。这不是我想要的生活!!!
回到正题,中点画线的算法:
1 // xtGL.h 2 #pragma once 3 #include <GL/glut.h> 4 #include <stdlib.h> 5 // 全局变量说明 6 static void(*__xtViewportFunc)(int, int, int, int); 7 // 指向用户自定义的构建视口和相关变换的函数 8 // 函数说明 9 int main(int argc, char *argv[]); 10 void xtMain(int argc, char *argv[]); // xtGL的入口函数 11 static void xtDefaultInit(); // 默认初始化 12 void xtViewportFunc(void Func(int, int, int, int)); 13 // 指定用户自定义的构建视口和相关变换的函数 14 static void xtDefaultViewport(int x, int y, int w, int h); 15 // 构建视口和相关变换的默认函数 16 static void xtDefaultReshape(int w, int h); // 默认窗口变化回调函数 17 static void xtDefaultPaint(void); // 默认场景绘制函数 18 static void xtView(GLuint m, GLuint n, int i, int j); // 子区间函数 19 void xtViewInit(int m, int n); // 初始化子区间个数和大小 20 void xtViewBegin(int i, int j); // 第i行第j列子区间 21 void xtViewEnd(); // 结束子区间内对象定义 22 // 函数实现 23 int main(int argc, char *argv[]) 24 { xtDefaultInit(); // 默认初始化 25 xtMain(argc, argv); // xtGL的入口函数 26 glutMainLoop(); // 开始循环执行OpenGL命令 27 } 28 // 默认初始化 29 static void xtDefaultInit() 30 { int scw, sch, w, h; // 屏幕宽度和高度,程序窗口的宽度和高度 31 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); 32 // 显示模式为:双缓冲区,RGBA颜色模式,使用深度缓冲器 33 // 只有一次生效,使用该框架只能使用这里规定的显示模式 34 scw = glutGet(GLUT_SCREEN_WIDTH); // 屏幕宽度 35 sch = glutGet(GLUT_SCREEN_HEIGHT); // 屏幕高度 36 h = sch / 2, w = h * 4 / 3; // 程序窗口的高度和宽度 37 glutInitWindowPosition((scw - w) / 2, (sch - h) / 2); 38 glutInitWindowSize(w, h); 39 // 默认窗口高度为屏幕高度的一半,宽高比为4:3,位于屏幕中央 40 glutCreateWindow(__argv[0]); // 窗口的默认标题 41 glEnable(GL_DEPTH_TEST); // 打开深度测试 42 xtViewportFunc(xtDefaultViewport); // 构建视口和相关变换的默认函数 43 glutReshapeFunc(xtDefaultReshape); // 默认的窗口变化回调函数 44 glutDisplayFunc(xtDefaultPaint); // 默认的场景绘制函数 45 } 46 // 指定用户自定义的构建视口和相关变换的函数 47 void xtViewportFunc(void Func(int, int, int, int)) 48 { __xtViewportFunc = Func; 49 } 50 // 构建视口和相关变换的默认函数 51 static void xtDefaultViewport(int x, int y, int w, int h) 52 { float aspect; 53 if(h <= 0) return ; 54 aspect = 1.0 * w / h; // 窗口横纵比 55 glViewport(x, y, w, h); // 定义视口 56 // 默认投影矩阵,y向观察范围为60度,近平面为1,远平面为1000 57 glMatrixMode(GL_PROJECTION); // 当前矩阵模式为投影矩阵 58 glLoadIdentity(); // 当前矩阵为单位矩阵 59 gluPerspective(60, aspect, 1, 1000); 60 // 定义投影矩阵,参数依次为:y-z夹角;x/y;近平面;远平面 61 glTranslated(0, 0, - 2); // 远移2单位,保证z坐标可以使用+1 62 glMatrixMode(GL_MODELVIEW); // 当前矩阵模式为视图造型矩阵 63 glLoadIdentity(); // 当前矩阵为单位矩阵 64 } 65 // 默认窗口变化回调函数(构建视口和相关变换) 66 static void xtDefaultReshape(int w, int h) 67 { __xtViewportFunc(0, 0, w, h); 68 } 69 // 默认场景绘制函数 70 void xtDefaultPaint() 71 { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 72 // 清除颜色缓存和深度缓存 73 glutSwapBuffers(); // 交换颜色缓存 74 } 75 // 子区间函数,内部使用 76 static void xtView(GLuint m, GLuint n, int i, int j) 77 { int w, h, x, y; // 子区间的宽度和高度以及子区间的左下角坐标 78 static GLuint svm = 1, svn = 1; // 子区间个数 79 static GLuint maxRow = 0; // 最大行号 80 if(i < 0 || j < 0) // 初始化子区间个数 81 { svm = m; svn = n; maxRow = m - 1; return ; } 82 if(svm * svn > 1) 83 { // 只有当子区间的个数大于1时,才构建视口和相关变换 84 w = glutGet(GLUT_WINDOW_WIDTH) / svn; // 子区间宽度 85 h = glutGet(GLUT_WINDOW_HEIGHT) / svm; // 子区间高度 86 x = j * w; y = (maxRow - i) * h; // 第i行j列子区间的左下位置 87 __xtViewportFunc(x, y, w, h); // 构建视口和相关变换 88 } 89 glPushMatrix(); // 保存当前矩阵 90 glPushAttrib(GL_ALL_ATTRIB_BITS); // 保存所有当前属性值 91 } 92 // 初始化子区间个数和大小 93 void xtViewInit(int m, int n) 94 { xtView(m, n, - 1, - 1); 95 } 96 // 第i行第j列子区间(找到该子区间的位置,开始定义对象) 97 void xtViewBegin(int i, int j) 98 { xtView(0, 0, i, j); 99 } 100 // 结束子区间内的对象定义(恢复当前属性值和当前矩阵) 101 void xtViewEnd() 102 { glPopAttrib(); 103 glPopMatrix(); 104 }
1 //Demo.h 2 #pragma once 3 #include <gl/glut.h> 4 #include "xtGlu.h" 5 void init() 6 { glEnable(GL_POINT_SMOOTH); 7 glEnable(GL_LINE_SMOOTH); 8 glEnable(GL_POLYGON_SMOOTH); 9 } 10 11 void axis(int x1, int y1, int x2, int y2) 12 { int x, y; 13 glEnable(GL_LINE_STIPPLE); 14 glLineStipple(1, 0XCCCC); 15 glLineWidth(1); 16 glColor3f(0.5, 0.5, 0.5); 17 glBegin(GL_LINES); 18 for (x = x1; x <= x2; ++x) 19 glVertex2i(x, y1), glVertex2i(x, y2); 20 for (y = y1; y <= y2; ++y) 21 glVertex2i(x1, y), glVertex2i(x2, y); 22 glEnd(); 23 glDisable(GL_LINE_STIPPLE); 24 for (x = x1; x <= x2; ++x) 25 xtStrokeText(x, y1 - 0.5, 0.003, "%d", x); 26 for (y = y1; y <= y2; ++y) 27 xtStrokeText(x1 - 0.75, y, 0.003, "%d", y); 28 }
1 #include <gl/glut.h> 2 #include "Demo.h" 3 void Mid_Line1(int x1, int y1, int x2, int y2) 4 { int a, b, c, x, y, p, _2a, _2a_2b; 5 if(x2 < x1) 6 { int temp; 7 temp = x1, x1 = x2, x2 = temp; 8 temp = y1, y1 = y2, y2 = temp; 9 } 10 a = y1 - y2, b = x2 - x1; 11 _2a = 2 * a , _2a_2b = _2a + 2 * b; 12 y = y1, p = 2 * a + b; 13 for(x = x1; x <= x2; ++x) 14 { glVertex2i(x, y); 15 if(p > 0) 16 p = p + _2a; 17 else 18 ++y, p += _2a_2b; 19 } 20 } 21 // 22 void reshape(int w, int h) 23 { glViewport(0, 0, w, h); 24 glLoadIdentity(); 25 gluOrtho2D(19, 31, 9, 21); 26 } 27 // 28 void display() 29 { 30 glClearColor(1, 1, 1, 0); 31 glClear(GL_COLOR_BUFFER_BIT); 32 axis(20, 10, 30, 18); 33 glLineWidth(3); 34 glColor3f(0, 0, 1); 35 glBegin(GL_LINES); 36 glVertex2i(20, 10), glVertex2i(30, 18); 37 glEnd(); 38 glPointSize(15); 39 glColor3f(1, 0, 0); 40 glBegin(GL_POINTS); 41 Mid_Line1(20, 10, 30, 18); 42 glEnd(); 43 glFlush(); 44 } 45 // 46 int main() 47 { glutInitWindowSize(400, 400); 48 glutCreateWindow("中点画线算法演示!"); 49 glutReshapeFunc(reshape); 50 init(); 51 glutDisplayFunc(display); 52 glutMainLoop(); 53 }
运行效果:
作者:wj704
出处:http://www.cnblogs.com/wj204/