extern int nMinX, nMaxX, nMinY, nMaxY;
typedef struct { int x1, x2, y, dy; } LINESEGMENT;
#define MAXDEPTH 10000
#define PUSH(XL, XR, Y, DY) \
if( sp < stack+MAXDEPTH && Y+(DY) >= nMinX && Y+(DY) <= nMaxY ) \
{ sp->xl = XL; sp->xr = XR; sp->y = Y; sp->dy = DY; ++sp; }
#define POP(XL, XR, Y, DY) \
{ --sp; XL = sp->xl; XR = sp->xr; Y = sp->y+(DY = sp->dy); }
// Fill background with given color
void SeedFill_4(int x, int y, COLORREF new_color)
{
int left, x1, x2, dy;
COLORREF old_color;
LINESEGMENT stack[MAXDEPTH], *sp = stack;
old_color = GetPixel(x, y);
if( old_color == new_color )
return;
if( x < nMinX || x > nMaxX || y < nMinX || y > nMaxY )
return;
PUSH(x, x, y, 1); /* needed in some cases */
PUSH(x, x, y+1, -1); /* seed segment (popped 1st) */
while( sp > stack ) {
POP(x1, x2, y, dy);
for( x = x1; x >= nMinX && GetPixel(x, y) == old_color; --x )
SetPixel(x, y, new_color);
if( x >= x1 )
goto SKIP;
left = x+1;
if( left < x1 )
PUSH(y, left, x1-1, -dy); /* leak on left? */
x = x1+1;
do {
for( ; x<=nMaxX && GetPixel(x, y) == old_color; ++x )
SetPixel(x, y, new_color);
PUSH(left, x-1, y, dy);
if( x > x2+1 )
PUSH(x2+1, x-1, y, -dy); /* leak on right? */
SKIP: for( ++x; x <= x2 && GetPixel(x, y) != old_color; ++x ) {;}
left = x;
} while( x<=x2 );
}
}
fill_point.rar_扫描线 填充算法_扫描线 种子填充_扫描线填充_种子填充_种子填充算法
版权申诉
92 浏览量
2022-09-23
23:02:02
上传
评论
收藏 1016B RAR 举报
林当时
- 粉丝: 95
- 资源: 1万+
最新资源
- 通道处理过程的模拟通常涉及对通道处理机制的理解与实现.txt
- Flume进阶-自定义拦截器jar包
- Dubins曲线算法讲解和在运动规划中的使用.pdf
- 上市公司-股票性质数据-工具变量(民企、国企、央企)2003-2022年.dta
- 上市公司-股票性质数据-工具变量(民企、国企、央企)2003-2022年.xlsx
- Reeds+Shepp曲线算法讲解和实现.pdf
- 毕业设计基于SpringBoot+MyBatisPlus+MySQL+Vue的外卖配送信息系统源代码+数据库
- 词向量(Word Embeddings)是自然语言处理(NLP)领域的一种重要技术.txt
- Surfer,线性函数
- MyBatis 的动态 SQL 是其核心特性之一.txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈