OpenGL 实现DDA法和Bresenham法绘…

本文通过示例展示了OpenGL中使用DDA和Bresenham算法绘制线段的效果。DDA算法在某些地方存在明显的跳跃现象,而Bresenham法虽然在特定区域有轻微间隔,但整体效果更优。代码提供了两种算法的实现,用于在OpenGL环境中绘制线条。
摘要由CSDN通过智能技术生成

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

其中蓝色的线为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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值