欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DDA画线算法

程序员文章站 2024-03-16 20:15:46
...

1、算法介绍:

DDA画线算法
已知两个点,(已知的点),确定离散的若干个点,逐个点画起来,就可以形成一条直线。

2、公式推导:

设直线两端点为:起点A(x0,y0);终点为B(x1,y1)。
则直线的斜率和方程为:
DDA画线算法

下面分为两种情况考虑:当斜率小于等于1的时候,x每次增加1,y最多增加1。
DDA画线算法

而当斜率大于1的时候,让y每次递增1,x每次递增最多1。

3、代码如下:
 

#include "stdafx.h"
#include <windows.h>
#include <GL/glu.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include<stdlib.h>  

//DDA算法——digital differentialanalyzer,数字微分析法 
void LineDDA(int x0, int y0, int xEnd, int yEnd)
{
    int dx = xEnd - x0;                             //x的增量
    int dy = yEnd - y0;                             //y的增量
    int steps;                          
    float xIncrement, yIncrement, x = x0, y = y0;
    if (abs(dx) > abs(dy))                          //谁的增量大
    {
        steps = abs(dx);
    }
    else
    {
        steps = abs(dy);
    }

    xIncrement = float(dx) / float(steps);          //x每步骤增量
    yIncrement = float(dy) / float(steps);          //y的每步增量

    glClear(GL_COLOR_BUFFER_BIT);
    //开始画点
    glBegin(GL_POINTS);
    glVertex3f(x0, y0, 0);                          //起点要画下
    for(int k = 0; k <= steps; ++k)
    {
        x += xIncrement;                            //x点+增量
        y += yIncrement;                            //y点+增量
        glVertex3f(x, y, 0);
    }
    glVertex3f(xEnd, yEnd, 0);                      //终点画下
    glEnd();
    glFlush();
}

//主循环方法
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glViewport(0, 0, 500, 500);
    LineDDA(30, 30, 200, 180);
}

//初始化方法
void myInit(void)
{
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glColor3f(1.0, 0.0, 0.0);
    gluOrtho2D(0.0, 500.0, 0.0, 500.0);
    glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(400, 400);
    glutInitWindowPosition(200, 200);
    glutCreateWindow("Point");
    glutDisplayFunc(display);
    myInit();
    glutMainLoop();
    return(0);
}

 

相关标签: cg