闻心阁

一蓑烟雨看苍生,半壶浊酒笑红尘

Bresenham算法生成圆(MFC)

2011-05-14 约 1 分钟读完 搬砖秘籍

之前已经公布了关于DDA算法画圆的MFC代码实现方法,今天接着上次的说,继续我的狗血实习,继续写代码,今天要写的Bresenham算法生成圆形的算法,还是老规矩,算法我就不仔细解释了,这里直接给出MFC实现方法

代码如下:

void S2BreCircle::BreCircle(CPoint pntStart,CPoint pntEnd,CDC *pDC)

{

 

int t1=abs(pntEnd.x-pntStart.x)*abs(pntEnd.x-pntStart.x);

int t2=abs(pntEnd.y-pntStart.y)*abs(pntEnd.y-pntStart.y);

double r=sqrt(double(t1+t2))/2;

int cx=(pntStart.x+pntEnd.x)/2;

int cy=(pntStart.y+pntEnd.y)/2;

int x=0,y=r,F=3-2*r;

while(x < y)

{

CirPot(cx,cy,x,y,pDC);

if(F<0)

F += 4*x+6;

else

{

F += 4*(x-y)+10;

y–;

}

x++;

}

if (x == y)

CirPot(cx,cy,x,y,pDC);

}

void S2BreCircle::CirPot(int cx, int cy, int x, int y, CDC* pDC)//八分法

{

pDC->SetPixelV((cx+x),(cy+y),m_color);

pDC->SetPixelV((cx+y),(cy+x),m_color);

pDC->SetPixelV((cx+y),(cy-x),m_color);

pDC->SetPixelV((cx+x),(cy-y),m_color);

pDC->SetPixelV((cx-x),(cy-y),m_color);

pDC->SetPixelV((cx-y),(cy-x),m_color);

pDC->SetPixelV((cx-y),(cy+x),m_color);

pDC->SetPixelV((cx-x),(cy+y),m_color);

}

 

说明:这里有两个函数,最后一个函数是八分法画圆。