//数值微分画线算法(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;
}
}
}```