使用了第三方圖形庫EGEv19.01,C++編寫。
#include <cmath>
#include <graphics.h>
#include <iostream>
using namespace std;
void DDA_Line(int x0, int y0, int x1, int y1)
{
float dx, dy, k, x, y;
dx = x1 - x0;
dy = y1 - y0;
k = dy / dx;
if (dx == 0) {
//因爲C++除法操作除數爲零時候可能會出現undefined的結果
//簡化後續if判斷
k = 1000;
}
x = x0;
y = y0;
if (k > 0) {
if (dx > 0) {
//k>0且dx>0
if (dy < dx) {
//0<k<1,步進方向爲x,y增量爲k
for (; x <= x1; ++x) {
putpixel(x, int(y + 0.5), BLACK);
y += k;
}
} else {
//k>=1,步進方向爲y,x增量爲1/k
for (; y <= y1; ++y) {
putpixel(int(x + 0.5), y, BLACK);
x += 1 / k;
}
}
} else {
//k>0且dx<0,dy<0,此處判斷反向畫線
if (abs(dy) < abs(dx)) {
//0<k<1,步進方向爲x,y增量爲-k
for (; x >= x1; --x) {
putpixel(x, int(y + 0.5), BLACK);
y -= k;
}
} else {
//k>=1,步進方向爲y,x增量爲-1/k
for (; y >= y1; --y) {
putpixel(int(x + 0.5), y, BLACK);
x -= 1 / k;
}
}
}
} else {
if (dx > 0) {
//k<0且dx>0,dy<0
if (abs(dy) < abs(dx)) {
//-1<k<0,步進方向爲x,y增量爲k
for (; x <= x1; ++x) {
putpixel(x, int(y + 0.5), BLACK);
y += k;
}
} else {
//k<=-1,步進方向爲y,x增量爲1/k
for (; y >= y1; --y) {
putpixel(int(x + 0.5), y, BLACK);
x -= 1 / k;
}
}
} else {
//k<0且dx<0,dy>0,此處判斷反向畫線
if (abs(dy) < abs(dx)) {
//-1<k<0,步進方向爲x,y增量爲-k
for (; x >= x1; --x) {
putpixel(x, int(y + 0.5), BLACK);
y -= k;
}
} else {
//k>=-1,步進方向爲y,x增量爲-1/k
for (; y <= y1; ++y) {
putpixel(int(x + 0.5), y, BLACK);
x += 1 / k;
}
}
}
}
}
int main()
{
initgraph(640, 480);
setbkcolor(WHITE);
DDA_Line(30, 50, 10, 60); //-1<k<0
DDA_Line(10, 60, 30, 50);
DDA_Line(30, 50, 10, 90); //k<-1
DDA_Line(10, 90, 30, 50);
DDA_Line(30, 50, 10, 40); //0<k<1
DDA_Line(10, 40, 30, 50);
DDA_Line(30, 50, 10, 10); //k>1
DDA_Line(10, 10, 30, 50);
DDA_Line(10, 90, 10, 10); //k==0,x==10
DDA_Line(10, 10, 10, 90);
DDA_Line(30, 50, 10, 50); //k==0,y==50
DDA_Line(10, 50, 30, 50);
getch();
closegraph();
return 0;
}