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編譯通過!如有問題,請留言。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM