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.對話框

2.反走樣圓
https://img2018.cnblogs.com/blog/1027722/201810/1027722-20181009200108679-1901193419.jpg(復制鏈接到搜索框即可查看)
VC++ 6.0編譯通過!如有問題,請留言。
