社区
图形处理/算法
帖子详情
多边形填充算法?
wx_dwl
2004-09-29 04:14:35
求多边形填充算法.
...全文
278
2
打赏
收藏
多边形填充算法?
求多边形填充算法.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
我有,但是分数太低了哦!
mfc
多边形
扫描线
填充
算法
博客介绍了
多边形
扫描线
填充
算法
,给出在
多边形
内部点击一点进行
填充
的操作说明,包括区域原色和
填充
原色的设定,还定义了结构体Seed用于
算法
实现,此外还提及MFC画直线、圆等图形及裁剪相关内容可关注其博客。
图形学篇:
多边形
有效边表
填充
算法
博客介绍了
多边形
的定义、表示方法,指出
多边形
扫描转换是从顶点表示法到点阵表示法的过程。还阐述了基础
填充
方式、光栅及光栅化概念。重点讲解有效边表
填充
算法
,包括原理、优势、边界像素处理原则等,最后介绍了
算法
实现步骤。
快速
多边形
填充
算法
本文对已有
多边形
填充
方法做改进及整理。介绍了判断像素点是否在
多边形
内的高复杂度思路,提出一行一行扫描找
填充
区间段的方法。定义了边与行的有效交点,给出相关性质和推论,得出
算法
步骤及伪代码,该
算法
效率更高,可省去排序运算。
扫描线
填充
多边形
算法
详解与代码
本文详细介绍了扫描线
填充
多边形
的
算法
,包括处理特殊情况,如边的重合和顶点交点,以及使用随机快速排序对交点数组进行排序。同时,讨论了如何通过DDA
算法
减少计算量,以提高效率。最终,扫描线
填充
算法
相比于四邻域种子
填充
算法
有显著的性能提升。
多边形
有效边表
填充
算法
本文介绍了一种使用桶结构和邻接表来实现
多边形
填充
的
算法
。通过边链表E[]存储线段信息,利用AET(Active Edge Table)进行排序,遍历每个扫描线,动态调整边表,最终实现
多边形
内部的
填充
。代码中展示了具体的类定义和
填充
流程,包括创建桶、构建边表、
填充
多边形
等关键步骤。
图形处理/算法
19,464
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章