DDA (método de diferenciación numérica) para dibujar líneas rectas (C ++, VS2019)

1 、 DDA (Analizador diferencial digital) 算法

El algoritmo DDA es el algoritmo más simple para dibujar líneas rectas en gráficos por computadora.
Se conocen los dos extremos P0 (x0, y0) y P1 (x1, y1) del segmento de línea .
Entonces se puede obtener la pendiente de la línea recta:

  k = (y2 - y1) / (x2 - x1)

Con la condición de que se calculen tanto k como b, siempre que sepamos un valor de x, podemos calcular un valor de y.

  y = kx + b

Si la abscisa x aumenta en 1 cada vez (llamamos a este paso 1, es decir, x = x +1), entonces el paso de y es k + b.

  x = x + 1
  y = y + (k + b)

También conociendo un valor de y también se puede calcular el valor de x. En este momento, el paso de y es 1, y el paso de x es (1-b) / k.

   y = y + 1
   x = x +(1 - b) / k

De acuerdo con los valores de xey calculados, redondee hacia abajo para obtener las coordenadas (x ', y') y dibuje un punto en el segmento de línea recta en (x ', y').

Para simplificar aún más el cálculo, normalmente podemos establecer b en 0 y considerar el punto de partida como (0,0).
Suponga que las coordenadas del punto actual son (x i , y i ), y las coordenadas del siguiente punto de píxel son (x i + 1 , y i + 1 ),
luego use el algoritmo DDA para resolver la fórmula de cálculo de (xi +1, yi + 1). Resumido como:

x i + 1 = x i + xPaso (1)
y i + 1 = y i + yPaso (2)

Generalmente, determinamos xStep y yStep calculando Δx y Δy:

Si Δx> Δy, significa que la diferencia máxima del eje x es mayor que la diferencia máxima del eje y, y la dirección del eje x es la dirección principal del paso.

xPaso = 1 , yPaso = k ;

Si Δy> Δx, significa que la diferencia máxima del eje y es mayor que la diferencia máxima del eje x, y la dirección del eje y es la dirección principal del paso.

yPaso = 1 , xPaso = 1 / k。

De acuerdo con esta fórmula, (x i , y i ) se puede calcular iterativamente (x i + 1 , y i + 1 ), y luego el punto de coordenadas calculado (x, y) se puede dibujar en el sistema de coordenadas.

Herramientas de implementación:
1)

Nuevo proyecto VS2019 (C ++) :
Inserte la descripción de la imagen aquí
2) Descarga del complemento: Easyx. Consulte el sitio web oficial para el uso y la descarga: https://www.easyx.cn/
haga clic para descargar y luego instalar Haga clic para instalar Inserte la descripción de la imagen aquí
en VC2019

Inserte la descripción de la imagen aquí
El código fuente es el siguiente:

#include <iostream>
#include <graphics.h>
#include <math.h>
#include <conio.h>
using namespace std;

void DDALine(int x1, int y1, int x2, int y2)
{
    
    
    int x0 = 400;
    int y0 = 300;                  //记录原点坐标
    int steps;                     //记录步长
    int dx, dy;                    //记录起点和终点的坐标差值
    float x, y;                    //记录即时坐标
    float delta_x, delta_y;        //记录划线过程中的坐标增量
    dx = x2 - x1;
    dy = y2 - y1;
    if (abs(dx) > abs(dy))         //比较横纵坐标增量的大小
        steps = dx;
    else
        steps = dy;                //确保每次的增量不超过一个单位长度
    x = x1;
    y = y1;                        //记录画线起点
    delta_x = float(dx) / steps;
    delta_y = float(dy) / steps;   //计算相邻两个点的增量
    putpixel(x, y, RED);
    for (int i = 0; i < steps; i++)
    {
    
    
        x = x + delta_x;
        y = y + delta_y;
        putpixel(x +int( x0 + 0.5), y0 - int(y + 0.5), RED);
    }
}

int main()
{
    
    
    int x1, x2, y1, y2;
    int x0 = 400, y0 = 300;			                       //坐标轴中心(x0,y0)
    cout << "请输入两个整数点的坐标(x1,y1),(x2,y2)" << endl;
    cin >> x1 >> y1 >> x2 >> y2;
    initgraph(x0 * 2, y0 * 2);		                       //初始化图形窗口大小
    line(0, y0, x0 * 2, y0);			                   //坐标轴X
    line(x0, 0, x0, y0 * 2);			                   //坐标轴Y
    DDALine(x1, y1, x2, y2);                               //DDA画线算法
    _getch();                                              //等待一个任意输入结束
    closegraph();                                          //关闭图形窗口
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_46659057/article/details/115360398
Recomendado
Clasificación