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 ++) :
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
en VC2019
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;
}