闻心阁

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

DDA算法生成圆(MFC)

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

之前已经写过两篇帖子记录计算机中怎样生成直线的算法,从今天我开始我要介绍怎样生成圆形的算法。总共会介绍三种,还是老规矩,我就不介绍原理了。这是我们的实习内容,我这里只是完成实习后做到一个mark,以便以后用,当然也希望帮到需要的人。

回到正题,今天说的是DDA生成圆的算法。

代码如下:

void S2DDACircle::DDACircle(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,n=r;

double cr = (double)r;

double z=1.0/cr;

double a=x,b=y;

double tmp;

while(n > 0)

{

 

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

tmp=a;

a-=b*z;

b+=tmp*z;

x = (int)(a);

y = (int)(b);

n–;

}

if(x == y)

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

}

void S2DDACircle::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);

}

 

说明:这里用到了两个函数,其中后面的函数是八分法画圆。