最近学习计算机图形学,写了个多边形扫描转换算法,贴出来分享一下;4JkHTML5中文学习网 - HTML5先行者学习网
MFC还不是太明白,主要还是使用OnDraw函数...4JkHTML5中文学习网 - HTML5先行者学习网
大家多指教...4JkHTML5中文学习网 - HTML5先行者学习网
void CPolyFillView::OnDraw(CDC* pDC)4JkHTML5中文学习网 - HTML5先行者学习网
{4JkHTML5中文学习网 - HTML5先行者学习网
CPolyFillDoc* pDoc = GetDocument();4JkHTML5中文学习网 - HTML5先行者学习网
ASSERT_VALID(pDoc);4JkHTML5中文学习网 - HTML5先行者学习网
// TODO: add draw code for native data here4JkHTML5中文学习网 - HTML5先行者学习网
const int POINTNUM=6; //多边形点数.4JkHTML5中文学习网 - HTML5先行者学习网
/定义结构体用于活性边表AET和新边表NET/4JkHTML5中文学习网 - HTML5先行者学习网
typedef struct XET4JkHTML5中文学习网 - HTML5先行者学习网
{4JkHTML5中文学习网 - HTML5先行者学习网
float x;4JkHTML5中文学习网 - HTML5先行者学习网
float dx,ymax;4JkHTML5中文学习网 - HTML5先行者学习网
XET* next;4JkHTML5中文学习网 - HTML5先行者学习网
}AET,NET;4JkHTML5中文学习网 - HTML5先行者学习网
/定义点结构体point*/4JkHTML5中文学习网 - HTML5先行者学习网
struct point4JkHTML5中文学习网 - HTML5先行者学习网
{4JkHTML5中文学习网 - HTML5先行者学习网
float x;4JkHTML5中文学习网 - HTML5先行者学习网
float y;4JkHTML5中文学习网 - HTML5先行者学习网
}polypoint[POINTNUM]={250,50,550,150,550,400,250,250,100,350,100,100};//多边形顶点4JkHTML5中文学习网 - HTML5先行者学习网
//mypoint[POINTNUM]={100,100,200,100,200,200,100,200};//正方形4JkHTML5中文学习网 - HTML5先行者学习网
/计算最高点的y坐标(扫描到此结束)**/4JkHTML5中文学习网 - HTML5先行者学习网
int MaxY=0;4JkHTML5中文学习网 - HTML5先行者学习网
int i;4JkHTML5中文学习网 - HTML5先行者学习网
for(i=0;i<POINTNUM;i++)4JkHTML5中文学习网 - HTML5先行者学习网
if(polypoint[i].y>MaxY)4JkHTML5中文学习网 - HTML5先行者学习网
MaxY=polypoint[i].y;4JkHTML5中文学习网 - HTML5先行者学习网
/*初始化AET表/4JkHTML5中文学习网 - HTML5先行者学习网
AET *pAET=new AET;4JkHTML5中文学习网 - HTML5先行者学习网
pAET->next=NULL;4JkHTML5中文学习网 - HTML5先行者学习网
/初始化NET表*/4JkHTML5中文学习网 - HTML5先行者学习网
NET *pNET[1024];4JkHTML5中文学习网 - HTML5先行者学习网
for(i=0;i<=MaxY;i++)4JkHTML5中文学习网 - HTML5先行者学习网
{4JkHTML5中文学习网 - HTML5先行者学习网
pNET[i]=new NET;4JkHTML5中文学习网 - HTML5先行者学习网
pNET[i]->next=NULL;4JkHTML5中文学习网 - HTML5先行者学习网
}4JkHTML5中文学习网 - HTML5先行者学习网
/扫描并建立NET表*/4JkHTML5中文学习网 - HTML5先行者学习网
for(i=0;i<=MaxY;i++)4JkHTML5中文学习网 - HTML5先行者学习网
{4JkHTML5中文学习网 - HTML5先行者学习网
for(int j=0;j<POINTNUM;j++)4JkHTML5中文学习网 - HTML5先行者学习网
if(polypoint[j].y==i)4JkHTML5中文学习网 - HTML5先行者学习网
{4JkHTML5中文学习网 - HTML5先行者学习网
if(polypoint[(j-1+POINTNUM)%POINTNUM].y>polypoint[j].y)4JkHTML5中文学习网 - HTML5先行者学习网
{4JkHTML5中文学习网 - HTML5先行者学习网
NET *p=new NET;4JkHTML5中文学习网 - HTML5先行者学习网
p->x=polypoint[j].x;4JkHTML5中文学习网 - HTML5先行者学习网
p->ymax=polypoint[(j-1+POINTNUM)%POINTNUM].y;4JkHTML5中文学习网 - HTML5先行者学习网
p->dx=(polypoint[(j-1+POINTNUM)%POINTNUM].x-polypoint[j].x)/(polypoint[(j-1+POINTNUM)%POINTNUM].y-polypoint[j].y);4JkHTML5中文学习网 - HTML5先行者学习网
p->next=pNET[i]->next;4JkHTML5中文学习网 - HTML5先行者学习网
pNET[i]->next=p;4JkHTML5中文学习网 - HTML5先行者学习网
}4JkHTML5中文学习网 - HTML5先行者学习网
if(polypoint[(j+1+POINTNUM)%POINTNUM].y>polypoint[j].y)4JkHTML5中文学习网 - HTML5先行者学习网
{4JkHTML5中文学习网 - HTML5先行者学习网
NET *p=new NET;4JkHTML5中文学习网 - HTML5先行者学习网
p->x=polypoint[j].x;4JkHTML5中文学习网 - HTML5先行者学习网
p->ymax=polypoint[(j+1+POINTNUM)%POINTNUM].y;4JkHTML5中文学习网 - HTML5先行者学习网
p->dx=(polypoint[(j+1+POINTNUM)%POINTNUM].x-polypoint[j].x)/(polypoint[(j+1+POINTNUM)%POINTNUM].y-polypoint[j].y);4JkHTML5中文学习网 - HTML5先行者学习网
p->next=pNET[i]->next;4JkHTML5中文学习网 - HTML5先行者学习网
pNET[i]->next=p;4JkHTML5中文学习网 - HTML5先行者学习网
}4JkHTML5中文学习网 - HTML5先行者学习网
}4JkHTML5中文学习网 - HTML5先行者学习网
}4JkHTML5中文学习网 - HTML5先行者学习网
/建立并更新活性边表AET/4JkHTML5中文学习网 - HTML5先行者学习网
for(i=0;i<=MaxY;i++)4JkHTML5中文学习网 - HTML5先行者学习网
{4JkHTML5中文学习网 - HTML5先行者学习网
//计算新的交点x,更新AET/4JkHTML5中文学习网 - HTML5先行者学习网
NET *p=pAET->next;4JkHTML5中文学习网 - HTML5先行者学习网
while(p)4JkHTML5中文学习网 - HTML5先行者学习网
{4JkHTML5中文学习网 - HTML5先行者学习网
p->x=p->x + p->dx;4JkHTML5中文学习网 - HTML5先行者学习网
p=p->next;4JkHTML5中文学习网 - HTML5先行者学习网
}4JkHTML5中文学习网 - HTML5先行者学习网
//更新后新AET先排序4JkHTML5中文学习网 - HTML5先行者学习网