基于MFC的三种直线算法的实现

基于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

原创文章 165 获赞 197 访问量 8万+

猜你喜欢

转载自blog.csdn.net/weixin_43751983/article/details/105905283