zoukankan      html  css  js  c++  java
  • 中点画线算法程序

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

    运行效果:

  • 相关阅读:
    FPN/lua-sdk-for-UPYUN
    结合keepalived实现nginx反向代理群集高可用
    Tengine + Lua + GraphicsMagick 实现图片自动裁剪/缩放
    cloudflare的新waf,用Lua实现的
    tengine+lua实现时时在线图片缩放,剪切。
    构建基于Nginx的文件服务器思路与实现
    Nginx+Lua+Redis整合实现高性能API接口
    使用nginx+lua实现自己的logserver | 星期八的博客 web & game
    让nginx支持文件上传的几种模式
    利用nginx+lua+memcache实现灰度发布
  • 原文地址:https://www.cnblogs.com/wj204/p/3131799.html
Copyright © 2011-2022 走看看