opengl DDA直线算法的实现

本文介绍了数值微分法中的DDA算法原理及其在计算机图形学中的应用。通过直线的微分方程计算x或y的增量,实现直线的扫描转换。提供了完整的C++代码示例,展示了如何绘制不同斜率的直线。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DDA算法

数值微分法,根据直线的微风方程来计算x或者y的增加量生成直线的扫描转换算法。

设直线为:y=kx+b
有x2 = x1+1
推导:y1 = kx1+b ——-> y2 = kx2+b —->y2= k(x1+1)+b
——–>y2 = kx1+k+b ——>y2 = y1+k
即有推论:
假设x方向的增量为1:
|k|<=1:
yi = kxi +b(i为下标)
yi+1 = yi +k(i+1为下标)
同理|k|>1:
xi = 1/k*yi +b(i为下标)
xi+1 = xi +1/k(i+1为下标)

代码如下:

#include <GL/glut.h>
void DDA_Line(int x1, int y1, int x2, int y2) {
    float k, t, x, y;
    float dx = x2 - x1, dy = y2 - y1;
    int d = 1;
    if (abs(x2 - x1) >= abs(y2 - y1)) {
        k = dy / dx;
        t = dx;
    } else {
        k = dx / dy;
        t = dy;
        d = 0;
    }
    x = x1;
    y = y1;
    for (int i = 0; i <= t; i++) {
        glPointSize(5.0);
        glBegin(GL_POINTS);
        if (d == 1) {
            glVertex2f(x, int(y + 0.5));
            glEnd();
            x++;
            y = y + k;
        } else {
            glVertex2f(int(x + 0.5), y);
            glEnd();
            x = x + k;
            y++;
        }

    }

}

void display(void) {
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glViewport(0, 0, 500, 500);

    //直线起点终点坐标
     DDA_Line(0, 500, 500, 0);
    DDA_Line(0, 0, 500, 600);
    DDA_Line(250, 0, 250, 500);
    DDA_Line(0, 250, 500, 250);

    glFlush();
}

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RED);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("DDA_line");
    glutDisplayFunc(display);


    glColor3f(0.0, 1.0, 1.0);//颜色
    gluOrtho2D(0.0, 500.0, 0.0, 500.0);

    glutMainLoop();
    return 0;

}

效果截图:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值