基于MFC的三种直线算法的实现
1、DDA算法的实现
实现代码
void CGR1View::OnDdaline()
{
// TODO: 在此添加命令处理程序代码
CDC *pDC = GetDC();
int x0 = 100, y0 = 100, x1 = 300, y1 = 200, c = RGB(255, 0, 0);
int x, y, i;
float dx, dy, k;
dx = (float)(x1 - x0);
dy = (float)(y1 - y0);
k = dy / dx;
x = x0;
y = y0;
if (abs(k) < 1) {
for (; x <= x1; x++) {
pDC->SetPixel(x, int(y + 0.5), c);
y = y + k;
}
}
else {
for (; y <= y1; y++) {
pDC->SetPixel(int(x + 0.5), y, c);
x = x + 1 / k;
}
}
ReleaseDC(pDC);
}
生成图片1
2、中点算法的实现
实现代码
void CGR1View::OnMidpointline()
{
// TODO: 在此添加命令处理程序代码
CDC *pDC = GetDC();
int x0 = 100, y0 = 100, x1 = 400, y1 = 300, c = RGB(0, 0, 0);
float a, b, d1, d2, d, x, y;
a = y0 - y1;
b = x1 - x0;
d = 2 * a + b;
d1 = 2 * a;
d2 = 2 * (a = b);
x = x0;
y = y0;
pDC->SetPixel(x, y, c);
while (x < x1) {
if (d < 0) {
x++;
y++;
d += d2;
}
else {
x++;
d += d1;
}
pDC->SetPixel(x, y, c);
}
ReleaseDC(pDC);
}
生成图片2
3、Bresenham算法的实现
实现代码
void CGR1View::OnBresenhamline()
{
// TODO: 在此添加命令处理程序代码
CDC *pDC = GetDC();
int x0 = 100, y0 = 100, x1 = 500, y1 = 600, c = RGB(0, 0, 255);
int i, x, y, dx, dy;
float k, e;
dx = x1 - x0;
dy = y1 - y0;
e = -dx;
x = x0;
y = y0;
for (i = 0; i <= dx; i++) {
pDC->SetPixel(x, y, c);
x++;
e += 2 * dy;
if (e >= 0) {
y++;
e -= 2 * dx;
}
}
ReleaseDC(pDC);
}
生成图片3