直线段扫描算法

第一个是DDA直线扫描算法,其基本思想是根据直线的点斜式来实现

第二个是重点画线算法,其基本思想是直线的一般方程ax+by+c=0

第三个是Bresenham算法

三个算法的共同特点是都使用了增量的思想

#include <GL/glut.h>
#include <stdio.h>
void DDAlien(int x1, int y1, int x2, int y2) 
{
    int x;
    float dx, dy,k,y;
    dy = y2 - y1;
    dx = x2 - x1;
    k = dy / dx;
    y = y1;
    glBegin(GL_POINTS);
    for (x = x1; x <= x2; x++)
    {
        //drawPixels(x, int(y + 0.5), color);
        glColor3i(1, 0, 0);
        glVertex2i(x, int(y + 0.5));
        y = y + k;
    }
    glEnd();
}

void MidpointLine(int x1, int y1, int x2, int y2)
{
    int a, b, d1, d2, d, x, y;
    a = y1 - y2;
    b = x2 - x1;
    d = 2 * a + b;
    d1 = a * 2;
    d2 = 2 * (a + b);
    x = x1;
    y = y1;
    glBegin(GL_POINTS); // 开始绘制线段
    // 画线
    glColor3i(255, 0, 0);
    glVertex2i(x, y);
    while (x <= x2)
    {
        if (d < 0)
        {
            // 画线 (x++,y++)
            x++;
            y++;
            d += d2;
        }
        else
        {
            // 画线(x++,y)
            x++;
            d += d1;
        }
        // 画线
        glColor3i(255, 0, 0);
        glVertex2i(x, y);
    }
    glEnd(); // 结束绘制线段
}

// 用整数代理浮点数运算提高效率
void BresenHamline(int x1, int y1, int x2, int y2)
{
    glBegin(GL_POINTS);
    int x, y, dx, dy, e;
    dx = x2 - x1;
    dy = y2 - y1;
    e = -dx;
    x = x1;
    y = y1;
    while (x <= x2)
    {
        glColor3i(255, 0, 0);
        glVertex2i(x, y);
        x++;
        e += 2 * dy;
        if (e >= 0)
        {
            y++;
            e = e - 2 * dx;
        }
        
    }
    glEnd();
}

void myDisplay(void)
{
    glClearColor(1.0, 1.0, 1.0, 1.0); // 设置清除颜色为白色
    glClear(GL_COLOR_BUFFER_BIT);
    //glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
    //DDAlien(0,0,100,100,1);
    //MidpointLine(100, 100, 300, 300);
    BresenHamline(100, 100, 300, 300);
    glFlush();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("第一个OpenGL程序");
    glutDisplayFunc(&myDisplay);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 400, 0, 400, -1, 1); // 设置投影矩阵
    glMatrixMode(GL_MODELVIEW);
    glutMainLoop();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值