zoukankan      html  css  js  c++  java
  • 《图形学》实验四:中点Bresenham算法画直线

    开发环境:

    VC++6.0,OpenGL

    实验内容:

    使用中点Bresenham算法画直线。

    实验结果:

    代码:

      1 //中点Bresenham算法生成直线
      2 #include <gl/glut.h>
      3 #include <math.h>
      4 
      5 #define WIDTH    500        //窗口宽度
      6 #define HEIGHT    500        //窗口高度
      7 #define DRAWLINE1 MidpointBresenham(100,200,200,100);    //画直线
      8 #define DRAWLINE2 MidpointBresenham(200,100,450,400);    //画直线
      9 
     10 #pragma comment(linker, "/subsystem:"windows" /entry:"mainCRTStartup"")        //取消控制台
     11 
     12 void Init()    //初始化
     13 {
     14     glClearColor(1.0f,1.0f,1.0f,1.0f);    //设置背景颜色,完全不透明
     15     glColor3f(1.0f,0.0f,0.0f);    //设置画笔颜色
     16     
     17     glMatrixMode(GL_PROJECTION);            //设置投影
     18     gluOrtho2D(0.0, WIDTH, 0.0, HEIGHT);    //设置投影区域
     19 }
     20 
     21 void MidpointBresenham(int x0,int y0,int x1,int y1)    //中点Bresenham算法画线
     22 {
     23     int dx,dy,d,UpIncre,DownIncre,x,y;
     24     if(x0>x1){
     25         x=x1;x1=x0;x0=x;
     26         y=y1;y1=y0;y0=y;
     27     }
     28     x = x0,y = y0;
     29     dx = x1-x0;
     30     dy = y1-y0;
     31     if(dy>0&&dy<=dx){    //0<k<=1
     32         d = dx-2*dy;
     33         UpIncre = 2*dx-2*dy;
     34         DownIncre = -2*dy;
     35         while(x<=x1){
     36             glBegin(GL_POINTS);
     37             glVertex2i(x,y);
     38             glEnd();
     39             x++;
     40             if(d<0){
     41                 y++;
     42                 d+=UpIncre;
     43             }
     44             else
     45                 d+=DownIncre;
     46         }
     47     }
     48     else if((dy>=(-dx))&&dy<=0) //-1<=k<=0
     49     { 
     50         d=dx-2*dy;
     51         UpIncre=-2*dy;
     52         DownIncre=-2*dx-2*dy;
     53         while(x<=x1)
     54         {
     55             glBegin(GL_POINTS);
     56             glVertex2i(x,y);
     57             glEnd();
     58             x++;
     59             if(d>0)
     60             {  
     61                 y--;
     62                 d+=DownIncre;
     63             }   
     64             else d+=UpIncre;
     65         }   
     66     }
     67     else if(dy<(-dx)) //k<-1
     68     {
     69         d=-dy-2*dx;
     70         UpIncre=2*dx+2*dy;
     71         DownIncre=2*dx;
     72         while(y>=y1)
     73         {
     74             glBegin(GL_POINTS);
     75             glVertex2i(x,y);
     76             glEnd();
     77             y--;
     78             if(d<0)
     79             {  
     80                 x++;
     81                 d-=UpIncre;
     82             }   
     83             else d-=DownIncre;
     84         }   
     85     }
     86     
     87     else //k>1和k不存在
     88     { 
     89         d=dy-2*dx;
     90         UpIncre=2*dy-2*dx;
     91         DownIncre=-2*dx;
     92         while(y<=y1)
     93         {
     94             glBegin(GL_POINTS);
     95             glVertex2i(x,y);
     96             glEnd();
     97             y++;
     98             if(d<0)
     99             {  
    100                 x++;
    101                 d+=UpIncre;
    102             }   
    103             else d+=DownIncre;
    104         }   
    105     }
    106 }
    107 
    108 void Display()    //显示函数
    109 {
    110     glClear(GL_COLOR_BUFFER_BIT);    //清空颜色堆栈
    111     
    112     DRAWLINE1    //画直线
    113     DRAWLINE2    //画直线
    114     
    115     glFlush();    //清空缓冲区指令
    116 }
    117 
    118 int main(int argc,char** argv)
    119 {
    120     glutInit(&argc,argv);
    121     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);    //初始化显示模式
    122     glutInitWindowSize(WIDTH,HEIGHT);    //设置窗口尺寸
    123     glutInitWindowPosition(200,100);    //设置窗口位置
    124     glutCreateWindow("画直线");    //创建窗口
    125     
    126     glutDisplayFunc(Display);    //注册显示函数
    127     Init();        //初始化
    128     glutMainLoop();    //进入程序循环
    129     return 0;
    130 }

    Freecode : www.cnblogs.com/yym2013

  • 相关阅读:
    我心中的核心组件(可插拔的AOP)~第十三回 实现AOP的拦截组件Unity.Interception
    .NET 使用unity实现依赖注入
    AOP技术基础
    PowerShell 远程管理之 about_Remote_Troubleshooting
    PowerShell远程连接主机进行会话
    PowerShell_零基础自学课程_9_高级主题:静态类和类的操作
    PowerShell_零基础自学课程_8_高级主题:WMI对象和COM组件
    PowerShell 中的目录文件管理
    解决360浏览器兼容模式不兼容,极速模式兼容问题
    reportng之测试报告升级美化
  • 原文地址:https://www.cnblogs.com/yym2013/p/4619256.html
Copyright © 2011-2022 走看看