DDA畫線法(考慮所有情況)

使用了第三方圖形庫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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章