加载中…
个人资料
沧海森林
沧海森林
  • 博客等级:
  • 博客积分:0
  • 博客访问:2,535
  • 关注人气:47
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

OpenGL 实现DDA法和Bresenham法绘制直线图元 计算机图形学

(2011-10-27 20:04:06)
标签:

计算机

图形学

dda算法

bresenham算法

画线

it

分类: 计算机图形学OpenGL

http://s5/middle/5e94b103xb0469dbe4354&690实现DDA法和Bresenham法绘制直线图元 计算机图形学" TITLE="OpenGL 实现DDA法和Bresenham法绘制直线图元 计算机图形学" />

其中蓝色的线为DDA算法画出来的线,而红色为Bresenham法画出的线,我们从图中可以看出,绿色圈出来的地方,DDA算法明显有所跳跃的现象,在浅蓝色圈出来的地方,Bresenham法画的线也有一点间隔,但是总体来看还是红色线代表的Bresenham效果比较好一点。

【注】代码如下程序段,其中void lineBres(int x0,int y0,int xEnd,int yEnd)Bresenham算法画线,void lineDDA(int x0,int y0,int xEnd,int yEnd)DDA画线算法:

#include<windows.h>

 

#ifdef __APPLE__

#include <GLUT/glut.h>

#else

#include <GL/glut.h>

#endif

 

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

 

 

void init (void)

{

    glClearColor (1.0, 1.0, 1.0, 0.0);  // Set display-window color to white.

    glMatrixMode (GL_PROJECTION);       // Set projection parameters.

    gluOrtho2D (0.0, 200.0, 0.0, 150.0);

}

 

int round(const float a)

{

       return (int)(a+0.5);

}

 

void lineDDA(int x0,int y0,int xEnd,int yEnd)

{

    glColor 3f(0.0,0.0,1.0);

    glPointSize(3.0f);

       int dx = xEnd - x0;

       int dy = yEnd - y0;

       int steps,k;

       float xIncrement,yIncrement,x = x0,y = y0;

 

       if(fabs (dx) > fabs(dy))

              steps = fabs(dy);

       else

              steps = fabs(dx);

       xIncrement = (float)(dx)/(float)(steps);

       yIncrement = (float)(dy)/(float)(steps);

 

       glBegin(GL_POINTS);

       glVertex2i(round(x),round(y));

       glEnd();

       glFlush();

       for (k=0;k<steps;k++)

       {

              x += xIncrement;

              y += yIncrement;

              glBegin(GL_POINTS);

              glVertex2i(round(x),round(y));

              glEnd();

              glFlush();

       }

}

 

void lineBres(int x0,int y0,int xEnd,int yEnd)

{

    glColor3f(1.0,0.0,0.0);

    glPointSize(3.0f);

       int dx = fabs(xEnd - x0);

       int dy = fabs(yEnd - y0);

       int p = 2*dy-dy;

       int twoDy = 2*dy,twoDyMinusDx = 2*(dy - dx);

       int x,y;

 

       if (x0>xEnd)

       {

           x = xEnd;

           y = yEnd;

           xEnd = x0;

       }

       else

       {

           x = x0;

           y = y0;

       }

 

       glBegin(GL_POINTS);

       glVertex2i(x,y);

       glEnd();

       glFlush();

 

       while(x < xEnd)

       {

           x++;

           if (p < 0)

            p += twoDy;

        else

        {

            y++;

            p += twoDyMinusDx;

        }

        glBegin(GL_POINTS);

        glVertex2i(x,y);

        glEnd();

        glFlush();

       }

}

 

void pointFun(void)

{

       int x0 = 0,y0 = 0,xEnd = 100,yEnd = 100;

       //scanf("%d%d%d%d",&x0,&y0,&xEnd,&yEnd);

       lineDDA(x0,y0+1,xEnd,yEnd);//调用DDA画线函数

       lineBres(x0+1,y0,xEnd,yEnd);//调用Bresenham画线函数

}

 

int main (int argc, char** argv)

{

 

    glutInit (&argc, argv);                         // Initialize GLUT.

    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);   // Set display mode.

    glutInitWindowPosition (50, 100);   // Set top-left display-window position.

    glutInitWindowSize (800, 600);      // Set display-window width and height.

    //glutFullScreen();

    glutCreateWindow ("An Example OpenGL Program"); // Create display window.

       init();                           // Execute initialization procedure.

    glutDisplayFunc (pointFun);       // Send graphics to display window.

    glutMainLoop ( );// Send graphics to display window.                  // Display everything and wait.

       return 0;

}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有