中点Bresenham画圆算法|MFC|计算机图形学

中点Bresenham画圆算法|MFC|计算机图形学

Bresenham中点画圆算法

计算机图形学-基本图元的生成-圆

基于学习直线的生成算法后,又展开了圆、椭圆的讲解;
此次试验是简单的MFC应用,其原理不再赘述,仅简单的展示一下代码供大家参考
(如有错误,欢迎指出,共同探讨进步)

1.进行各项设置如下图:
中点Bresenham画圆算法|MFC|计算机图形学_第1张图片

中点Bresenham画圆算法|MFC|计算机图形学_第2张图片
2.添加代码于图1的类中

void CDraw2View::OnBresenhamcircle()//Bresenham 圆
{
     

	DrawCircleSetting dialogCircle;//创建对象
	if (dialogCircle.DoModal() == IDOK)//检测环境,弹出窗口
	{
     
		
		CDC* pDC = this->GetDC();//提供画布

		int x0= dialogCircle.x0, y0= dialogCircle.y0, r= dialogCircle.r;//圆心坐标,半径;
		int c = RGB(45, 2, 56);//颜色;
		int x, y, d;//当前像素点的坐标,判别式;

		x = 0;
		y = r;
		d = 1 - r;//避免浮点运算简化后的判别式初值;

		//对称画法
		pDC->SetPixel((x0 + x), (y0 + y), c);//(x,y)
		pDC->SetPixel((x0 - x), (y0 + y), c);//(-x,y)
		pDC->SetPixel((x0 + x), (y0 - y), c);//(x,-y)
		pDC->SetPixel((x0 - x), (y0 - y), c);//(-x,-y)
		pDC->SetPixel((x0 + y), (y0 + x), c);//(y,x)
		pDC->SetPixel((x0 - y), (y0 + x), c);//(-y,x)
		pDC->SetPixel((x0 + y), (y0 - x), c);//(y,-x)
		pDC->SetPixel((x0 - y), (y0 - x), c);//(-y,-x)


		while (x < y)//8对称原则
		{
     
			if (d < 0)
				d = d + 2 * x + 3;//增量思想,表示M点在圆内,Y取上面点
			else
			{
     
				d = d + 2 * (x - y) + 5;//表示M点在圆外
				y--;//Y取下面点
			}

			x++;//x一直要移步

			pDC->SetPixel((x0 + x), (y0 + y), c);//(x,y)
			pDC->SetPixel((x0 - x), (y0 + y), c);//(-x,y)
			pDC->SetPixel((x0 + x), (y0 - y), c);//(x,-y)
			pDC->SetPixel((x0 - x), (y0 - y), c);//(-x,-y)
			pDC->SetPixel((x0 + y), (y0 + x), c);//(y,x)
			pDC->SetPixel((x0 - y), (y0 + x), c);//(-y,x)
			pDC->SetPixel((x0 + y), (y0 - x), c);//(y,-x)
			pDC->SetPixel((x0 - y), (y0 - x), c);//(-y,-x)

		}
	}
}
在这里插入代码片

3.调试结果如下
中点Bresenham画圆算法|MFC|计算机图形学_第3张图片

中点Bresenham画圆算法|MFC|计算机图形学_第4张图片
4.注意事项:
不要忘记在自己的view.cpp中添加#include “对话框里自己设置的类名”

欢迎各位老师批评指正。

你可能感兴趣的:(算法,计算机视觉)