中点画线算法程序

  计算机图形学的课程就这样结束了,想当初刚上课的时候总想在这门课上学点什么,想着在这方面多编程,无奈,又是这样的现状,大学的课程没学好也就是因为这些原因了,有时想为什么当时自己不好好学数据结构,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 }

运行效果:

原文地址:https://www.cnblogs.com/wj204/p/3131799.html