- DDA绘制直线
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;
}
}
- 中点绘制直线
MPLine(CDC* pDC, int x0, int y0, int x1, int y1, COLORREF color)
{
// TODO: 在此处添加实现代码.
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;
}
//m为真说明斜率绝对值小于等于1
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;
//pDC->SetPixel(x, y, color);
//k绝对值小于等于1
if (m)
{
//也就是k小于等于1大于0
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);
// pDC->SetPixel(x, y, color);
}
}
//也就是k大于等于-1小于0
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);
//pDC->SetPixel(x, y, color);
}
}
}
//k绝对值大于等于1
else
{
//k大于等于1到正无穷
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);
//pDC->SetPixel(x, y, color);
}
}
//k大于等于-1到负无穷
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绘制直线
BHLine(CDC* pDC, int x1, int y1, int x2, int y2, COLORREF color)
{
// TODO: 在此处添加实现代码.
int a, b, delta1, delta2, d, x, y;
//两个端点x值相等
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;
}
//如果斜率的绝对值大于1,m为FALSE,反之为TRUE;
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);
//绝对值小于等于1
if (m)
{
//斜率0-1
if (y1 <= y2)
{
d = 2 * a - b;//2*(y2 - y1)-(x2 - x1)
delta1 = 2 * a; //d<0
delta2 = 2 * (a - b); //d>=0
while (x < x2)
{
if (d < 0)
{
x++; d += delta1;
}
else
{
x++; y++; d += delta2;
}
pDC->SetPixel(x, y, color);
}
}
//斜率-1-0
else
{
d = -2 * a - b;//-2*(y2 - y1)-(x2 - x1)
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);
}
}
}
//绝对值大于1
else
{
//斜率>1
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);
}
}
//斜率 小于-1到负无穷
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);
}
}
}
}
版权声明:本文为qq_45549336原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。