DDALine(CDC* pDC, int x1, int y1, int x2, int y2, COLORREF color)
{
double dx, dy, e, x, y;
dx = x2 - x1;
dy = y2 - y1;
e = (fabs(dx) > fabs(dy)) ? fabs(dx) : fabs(dy);
dx /= e; dy /= e;
x = x1;
y = y1;
for (int i = 1; i <= e; i++)
{
pDC->SetPixel(int(x + 0.5), int(y + 0.5), color);
x += dx;
y += dy;
}
}
- Draw a straight line at the midpoint
MPLine(CDC* pDC, int x0, int y0, int x1, int y1, COLORREF color)
{
int a, b, deta1, deta2, d, x, y;
if (x0 == x1)
{
if (y0 < y1)
{
for (int i = y0; i <= y1; i++)
{
pDC->SetPixel(x0, i, color);
}
}
else
{
for (int i = y1; i <= y0; i++)
{
pDC->SetPixel(x0, i, color);
}
}
return;
}
BOOL m = (fabs(y1 - y0) <= fabs(x1 - x0));
if (x0 > x1)
{
d = x0; x0 = x1; x1 = d;
d = y0; y0 = y1; y1 = d;
}
a = y0 - y1;
b = x1 - x0;
x = x0;
y = y0;
if (m)
{
if (y0 < y1)
{
d = 2 * a + b;
deta1 = 2 * a;
deta2 = 2 * (a + b);
while (x < x1)
{
if (d < 0)
{
x++;
y++;
d += deta2;
}
else {
x++;
d += deta1;
}
pDC->SetPixel(x, y, color);
}
}
else
{
d = 2 * a - b;
deta1 = 2 * a;
deta2 = 2 * (a - b);
while (x < x1)
{
if (d < 0)
{
x++;
d += deta1;
}
else
{
x++;
y--;
d += deta2;
}
pDC->SetPixel(x, y, color);
}
}
}
else
{
if (y0 < y1)
{
d = a + 2 * b;
deta1 = 2 * b;
deta2 = 2 * (a + b);
while (y < y1)
{
if (d < 0)
{
y++;
d += deta1;
}
else
{
y++;
x++;
d += deta2;
}
pDC->SetPixel(x, y, color);
}
}
else
{
d = a - 2 * b;
deta1 = -2 * b;
deta2 = 2 * (a - b);
while (y > y1)
{
if (d < 0)
{
y--;
x++;
d += deta2;
}
else
{
y--;
d += deta1;
}
pDC->SetPixel(x, y, color);
}
}
}
- Bresenham draws straight lines
BHLine(CDC* pDC, int x1, int y1, int x2, int y2, COLORREF color)
{
int a, b, delta1, delta2, d, x, y;
if (x1 == x2)
{
if (y1 < y2)
{
for (int i = y1; i <= y2; i++)
pDC->SetPixel(x1, i, color);
}
else
{
for (int i = y2; i <= y1; i++)
pDC->SetPixel(x1, i, color);
}
return;
}
BOOL m = (fabs(y2 - y1) <= fabs(x2 - x1));
if (x1 > x2)
{
d = x1; x1 = x2; x2 = d;
d = y1; y1 = y2; y2 = d;
}
a = y2 - y1;
b = x2 - x1;
x = x1;
y = y1;
pDC->SetPixel(x, y, color);
if (m)
{
if (y1 <= y2)
{
d = 2 * a - b;
delta1 = 2 * a;
delta2 = 2 * (a - b);
while (x < x2)
{
if (d < 0)
{
x++; d += delta1;
}
else
{
x++; y++; d += delta2;
}
pDC->SetPixel(x, y, color);
}
}
else
{
d = -2 * a - b;
delta1 = -2 * a;
delta2 = -2 * (a + b);
while (x < x2)
{
if (d < 0)
{
x++; d += delta1;
}
else
{
x++; y--; d += delta2;
}
pDC->SetPixel(x, y, color);
}
}
}
else
{
if (y1 < y2)
{
d = 2 * b - a;
delta1 = 2 * b;
delta2 = 2 * (b - a);
while (y < y2)
{
if (d < 0)
{
y++; d += delta1;
}
else
{
x++; y++; d += delta2;
}
pDC->SetPixel(x, y, color);
}
}
else
{
d = 2 * b + a;
delta1 = 2 * b;
delta2 = 2 * (a + b);
while (y > y2)
{
if (d < 0)
{
y--; d += delta1;
}
else
{
x++; y--; d += delta2;
}
pDC->SetPixel(x, y, color);
}
}
}
}