Wu反走样算法绘制圆(C++/MFC实现)

Wu反走样圆###

原理:参考Bresenham算法,在主位移过程中计算出离理想圆最近的两个点,赋予不同的亮度值,绘制像素点即可!

MFC 中CXXXView类中添加函数:
//Wu算法画反走样圆
void CMy3_4View::OnwuCir() 
{
	// TODO: Add your command handler code here
	yoci5 dlg;//定义对话框 对象 yoci5:对话框类
	if(IDOK==dlg.DoModal())
	{
		int y=dlg.m_R;//对话框输入半径、圆心
		double e;
		for(int x=0; x<=y; x++)//画1/8圆
		{
			//算上下两点到理想圆的距离,作为亮度参数
			e=y-sqrt(dlg.m_R*dlg.m_R-(x+1)*(x+1));

			if(e>=1)
			{
				e--;
				y--;
			}
			div_8(x, y, e);
			div_8(x, y-1, 1-e);
		}
	}
}

//8分法画圆
void CMy3_4View::div_8(int x, int y, double d)
{
	CDC *pDC = GetDC();
	//定义二维坐标系
	CRect rect;
	GetClientRect(&rect);
	pDC->SetMapMode(MM_ANISOTROPIC);
	pDC->SetWindowExt(rect.Width(), rect.Height());
	pDC->SetViewportExt(rect.Width(), -rect.Height());
	pDC->SetViewportOrg(rect.Width()/2, rect.Height()/2);
	rect.OffsetRect(-rect.Width()/2, -rect.Height()/2);

	COLORREF clr = RGB(d*255, d*255, d*255);
	pDC->SetPixelV(x, y, clr);
	pDC->SetPixelV(y, x, clr);	//关于y=x对称
	pDC->SetPixelV(y, -x, clr);	
	pDC->SetPixelV(x, -y, clr);	//关于x=0对称
	pDC->SetPixelV(-x, -y, clr);//关于原点对称
	pDC->SetPixelV(-y, -x, clr);
	pDC->SetPixelV(-y, x, clr);	
	pDC->SetPixelV(-x, y, clr);	//关于y=0对称

	pDC->DeleteDC();
}

附上效果图:

1.对话框
![](https://img2018.cnblogs.com/blog/1027722/201810/1027722-20181009200628145-709943253.jpg)

2.反走样圆

https://img2018.cnblogs.com/blog/1027722/201810/1027722-20181009200108679-1901193419.jpg(复制链接到搜索框即可查看)


VC++ 6.0编译通过!如有问题,请留言。
原文地址:https://www.cnblogs.com/yocichen/p/9716823.html