中点画线算法程序
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(); }
运行效果:
相关文章推荐
- 直线扫描转换算法-中点画线法
- 中点画线算法(任意斜率)
- 直线生成算法---中点画线法
- Breaseman算法绘制圆形|中点算法绘制圆形_程序片段
- 计算机图形学 -- 画线算法 [DDA] [中点画线] [Bresenham]
- 计算机图形学 学习笔记(一):概述,直线扫描转换算法:DDA,中点画线算法,Bresenham算法
- 【Computer Graphics】2.直线生成算法(中点画线 算法)
- 直线的扫描转换-中点线算法推导
- 程序的灵魂——算法
- 【程序设计实践】第2章 算法和数据结构
- 数学建模--常用算法及程序
- R语言 模糊c均值(FCM)算法程序(转)
- 24点算法C++程序
- 二维小波变换算法程序
- 极限学习机(ELM) 算法及MATLAB程序实现
- 组合算法的程序实现及分析比较
- 程序设计实习MOOC / 程序设计与算法(一)第三周测验(2017冬季)3:点和正方形的关系
- 程序算法与人生选择
- 实现算法2.20、2.21的程序
- Java高并发程序-Chapter4 并行模式与算法(第二十六讲)Future 模式