1

eChorgi發表於2024-04-27
//數值微分畫線演算法(DDA)
void DDALine(int x1, int y1, int x2, int y2, COLORREF col)
{
    int print_max_i = LINE_STYLE_DATA.thinkness - 1 >> 1;
    int print_begin_i = -(LINE_STYLE_DATA.thinkness >> 1);
    int ls_mode = LINE_STYLE_DATA.mode;
    int printCnt = 0, thickCnt = 0;
    auto printPixel = [&thickCnt, &printCnt, print_max_i, print_begin_i, ls_mode](int x, int y, COLORREF col, bool dir/*0橫向 1縱向*/) {
        if (thickCnt >= LINE_STYLE_DATA.thinkness) {
            printCnt = (printCnt + 1) % 32;
            thickCnt = 0;
        }
        thickCnt++;

        if ((LINE_STYLE_DATA.pattern & (1 << printCnt)) == 0) {
            return;
        }
        if (LINE_STYLE_DATA.mode == MD_LS_SQUARE) {
            printCnt = (printCnt + 1) % 32;
            thickCnt = -LINE_STYLE_DATA.thinkness;
        }

        if (ls_mode == MD_LS_LINE) {
            for (int i = print_begin_i; i <= print_max_i; i++) {
                if (dir == 0) {
                    putpixel(x + i, y, col);
                }
                else {
                    putpixel(x, y + i, col);
                }
            }
        }
        else if (ls_mode == MD_LS_SQUARE) {
            for (int i = print_begin_i; i <= print_max_i; i++) {
                for (int j = print_begin_i; j <= print_max_i; j++) {
                    putpixel(x + i, y + j, col);
                }
            }
        }
        };
    double k = (y2 - y1) / (double)(x2 - x1);

    if (abs(k) <= 1) {
        if (x2 < x1) {
            swap(x1, x2);
            swap(y1, y2);
        }
        for (double x = x1, y = y1; x <= x2; x++) {
            printPixel((int)x, (int)(y + 0.5), col, 1);

            y += k;
        }
    }

    if (abs(k) > 1) {
        if (y2 < y1) {
            swap(x1, x2);
            swap(y1, y2);
        }
        for (double x = x1, y = y1; y <= y2; y++) {
            printPixel((int)(x + 0.5), (int)y, col, 0);
            x += 1 / k;
        }
    }
}```

相關文章