多边形填充算法?

wx_dwl 2004-09-29 04:14:35
求多边形填充算法.
...全文
239 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
handwolf 2004-09-30
  • 打赏
  • 举报
回复
共享给你吧!别忘记结帖哦,兄弟!

typedef struct tEdge
{
int ymin;
float x,dx;
struct tEdge *next;
}Edge;
typedef Edge* pEdge;

void InsertEdge(Edge *list,Edge *edge)
{
Edge *p,*q=list;
p=q->next;
while(p)
{
if(edge->x<p->x||edge->x+edge->dx<p->x+p->dx)
p=0;
else
{
q=p;
p=p->next;
}
}
edge->next=q->next;
q->next=edge;
}

void BuildEdgeList(int cnt,POINT *pts,Edge *edges[],int nScanMin)
{
Edge *edge;
POINT p1,p2;
int i;
p1=pts[cnt-1];
for(i=0;i<cnt;i++)
{
p2=pts[i];
if(p1.y!=p2.y)
{
edge=(Edge *)malloc(sizeof(Edge));
edge->dx=-(float)(p2.x-p1.x)/(p2.y-p1.y);
if(p1.y>p2.y)
{
edge->x=float(p1.x);
edge->ymin=p2.y;
InsertEdge(edges[p1.y-nScanMin],edge);
}
else
{
edge->x=float(p2.x);
edge->ymin=p1.y;
InsertEdge(edges[p2.y-nScanMin],edge);
}
}
p1=p2;
}
}


void BuildActiveList(int scan,Edge *active,Edge *edges[],int nScanMin)
{
Edge *p,*q;
p=edges[scan-nScanMin]->next;
while(p)
{
q=p->next;
InsertEdge(active,p);
p=q;
}
}



void FillScan(CDC *pDC,int scan,Edge *active,COLORREF color)
{
Edge *p1,*p2;
p1=active->next;
while(p1)
{
p2=p1->next;
pDC->MoveTo(int(p1->x+0.5),scan);
pDC->LineTo(int(p2->x+0.5),scan);
p1=p2->next;
}
}


void DeleteAfter(Edge *q)
{
Edge *p=q->next;
q->next=p->next;
free(p);
}

void UpdateActiveList(int scan,Edge *active)
{
Edge *q=active,*p=active->next;
while(p)
{
if(scan<=p->ymin)
{
p=p->next;
DeleteAfter(q);
}
else
{
p->x=p->x+p->dx;
q=p;
p=p->next;
}
}
}

void AreaFill(CDC *pDC,int cnt,POINT *pts,COLORREF color)
{
Edge *active;
int i,scan,scanmin=1000,scanmax=0;
for(i=0;i<cnt;i++)
{
if(scanmax<pts[i].y) scanmax=pts[i].y;
if(scanmin>pts[i].y) scanmin=pts[i].y;
}
pEdge *edges=(pEdge *)malloc((scanmax-scanmin+1)*sizeof(Edge));
for(scan=scanmin;scan<=scanmax;scan++)
{
edges[scan-scanmin]=(Edge *)malloc(sizeof(Edge));
edges[scan-scanmin]->next=0;
}

BuildEdgeList(cnt,pts,edges,scanmin);
active=(Edge *)malloc(sizeof(Edge));
active->next=0;
for(scan=scanmax;scan>=scanmin;scan--)
{
BuildActiveList(scan,active,edges,scanmin);
FillScan(pDC,scan,active,color);
UpdateActiveList(scan-1,active);
}

free(active);
for(scan=scanmin;scan<=scanmax;scan++)
{
free(edges[scan-scanmin]);
}
free(edges);
}

调用 AreaFill(CDC *pDC,int cnt,POINT *pts,COLORREF color) 就可以了
handwolf 2004-09-30
  • 打赏
  • 举报
回复
我有,但是分数太低了哦!

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧