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编译通过!如有问题,请留言。