社区
机器视觉
帖子详情
高分求矢量图形的扫描线区域填充源程序!
allenhai1980
2003-10-21 11:41:54
谢谢各位大虾。
我在论坛中没有搜索到相关的合适源程序,又没时间自己写,
所以想要现成的,呵呵。
C++语言的。
allenhai@sina.com
...全文
189
15
打赏
收藏
高分求矢量图形的扫描线区域填充源程序!
谢谢各位大虾。 我在论坛中没有搜索到相关的合适源程序,又没时间自己写, 所以想要现成的,呵呵。 C++语言的。 allenhai@sina.com
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
tuxw
2003-12-25
打赏
举报
回复
void LineFill( CDC *pDC, const CRect& rc, int nFillMode, int nDis )
{
CPen pen( PS_SOLID, 0, RGB(255,0,0) ); // 测试用的填充颜色
CPen *pOldPen = pDC->SelectObject( &pen );
const COLORREF crText = RGB(0,0,0); // 已画好的字体颜色
COLORREF cr1, cr2;
if( nFillMode == 0 ) { // 水平填充
for( int row = rc.top; row < rc.bottom; row += nDis ) {
cr1 = pDC->GetPixel( rc.left+1, row );
for( int col = rc.left+2; col < rc.right; ++col ) {
cr2 = pDC->GetPixel( col, row );
if( cr1 != cr2 ) {
if( cr2 == crText )
pDC->MoveTo( col, row );
else if( cr1 == crText )
pDC->LineTo( col, row );
cr1 = cr2;
}
}
}
}
……
pDC->SelectObject( pOldPen );
}
allenhai1980
2003-10-27
打赏
举报
回复
Thanks zzuw very much.
我自己写吧,虽然耗时间!呵呵。
zzwu
2003-10-25
打赏
举报
回复
详细的算法描述见:
http://www.cs.uct.ac.za/courses/CS300W/IG/2003/handouts/scanlineHandout.pdf
zzwu
2003-10-25
打赏
举报
回复
allenhai1980(心蓝世界) :
程序写起来确实很麻烦,要自己从头开始编确实需要许多时间和精力。我估计这里参与讨论的人中做过这样工作的人不一定有,除了我之外,我以前也是因LSI设计工作的需要才做的。
不过,到网上再搜索一下看,说不定会有。
allenhai1980
2003-10-24
打赏
举报
回复
呵呵,想不到,我所要的算法就是zzwu(未名)所说的“桶算法”!
zzwu(未名)给出的四步很粗糙。
算法思想不难,当同时对很多多边形填充时,程序写起来很麻烦。
所以我想请各位提供一些类似的程序,不情之请啊!
allenhai1980
2003-10-24
打赏
举报
回复
大家帮忙啦!
zzwu
2003-10-24
打赏
举报
回复
“桶算法”就是老老实实地对封闭多边形进行由上到下的水平线填充,为此要做的工作大体为:
1.先对多边形的边,按y投影的大小重新排序,设y范围为[ymin,ymax]
2.求水平线hl[y]和多边形的边的交,p[y,1],p[y,2],p[y,3]...,y属于[ymin,ymax]
3.对交点按x大小排序,q[y,1]<q[y,2]<q[y,3]<q[y,4]<....
4.则要填的扫描线就是,q[y,1]-q[y,2],q[y,3]-q[y,4],....
由于桶算法是从上到下依次填充的,所以用不到进出堆栈的操作;同时,因相邻水平线一般都是和多边形的同一些边求交,所以多边形边与y高度水平线的交点可利用与y-1的交点算出(类似bresenham算法),从而速度是快的。
麻烦的是:从上到下求水平线交点时,要控制多边形的边的改变,另外要考察各种特例交点。
zzwu
2003-10-22
打赏
举报
回复
以上算法从速度来看并不高,要考虑速度,应使用“桶算法”,但编写程序较繁了。
alphapaopao
2003-10-22
打赏
举报
回复
不错不错
Freshyy
2003-10-22
打赏
举报
回复
To zzwu(未名) :
“桶算法”的原理能大致介绍一下吗?谢谢!
Freshyy
2003-10-22
打赏
举报
回复
不是一个版块!
积分不一样的!
allenhai1980
2003-10-22
打赏
举报
回复
To alphapaopao(炮炮):
你不是有很多星的么,咋整的?
allenhai1980
2003-10-22
打赏
举报
回复
谢谢zzwu(未名)提供的程序。
我没有说清意图:我并不是想对任意区域填充,我的操作对象是多个多边形,填充也只是一种理解,我本想拿水平直线与所有的封闭多边形求交从而依次得到水平交点,从而将由边描述的矢量多边形转化成由很多水平直线构成的一个多边形区域,水平直线的密度当然不可能很大,种子填充是一种方式,但不好用水平直线的端点来表述。
另外,如果图形太大且很多,会不会发生递归的堆栈溢出?所以我想直接运算。效率很差,呵呵。如果能提供一些较好的直接拿水平直线填充多边形的算法程序,就太好了。
To yalinliu(亚林) :我知道有,谢谢提示。
zzwu
2003-10-21
打赏
举报
回复
我用pascal编过扫描线算法区域填充程序,但未用C++编过这样的程序。
以下是从网上找到的C++区域填充程序,注意,扫描线算法可以有多种类型,这里只是一种,是否适合你的,要检查:
区域填充的扫描线算法:
区域填充的递归算法原理和程序都很简单,但由于多次递归,费时、费内存,效率不高。为了减少递归次数,提高效率可以采用扫描线算法。算法的基本过程如下:当给定种子点(x,y)时,首先填充种子点所在扫描线上的位于给定区域的一个区段,然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段,并依次保存下来。反复这个过程,直到填充结束。
区域填充的扫描线算法可由下列四个步骤实现:
(1)初始化:堆栈置空。将种子点(x,y)入栈。
(2)出栈:若栈空则结束。否则取栈顶元素(x,y),以y作为当前扫描线。
(3)填充并确定种子点所在区段:从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。分别标记区段的左、右端点坐标为xl和xr。
(4)并确定新的种子点:在区间[xl,xr]中检查与当前扫描线y上、下相邻的两条扫描线上的象素。若存在非边界、未填充的象素,则把每一区间的最右象素作为种子点压入堆栈,返回第(2)步。
区域填充的扫描线算法:
typedef struct{ //记录种子点
intx;
int y;
} Seed;
void ScanLineFill4(int x,int y,COLORREF oldcolor,COLORREF newcolor)
{ int xl,xr,i;
bool spanNeedFill;
Seed pt;
setstackempty();
pt.x =x; pt.y=y;
stackpush(pt); //将前面生成的区段压入堆栈
while(!isstackempty())
{ pt = stackpop();
y=pt.y;
x=pt.x;
while(getpixel(x,y)==oldcolor) //向右填充
{ drawpixel(x,y,newcolor);
x++;
}
xr = x-1;
x = pt.x-1;
while(getpixel(x,y)==oldcolor) //向左填充
{ drawpixel(x,y,newcolor);
x--;
}
xl = x+1;
//处理上面一条扫描线
x = xl;
y = y+1;
while(x<xr)
{ spanNeedFill=FALSE;
while(getpixel(x,y)==oldcolor)
{ spanNeedFill=TRUE;
x++;
}
if(spanNeedFill)
{ pt.x=x-1;pt.y=y;
stackpush(pt);
spanNeedFill=FALSE;
}
while(getpixel(x,y)!=oldcolor && x<xr) x++;
}//End of while(i<xr)
//处理下面一条扫描线,代码与处理上面一条扫描线类似
x = xl;
y = y-2;
while(x<xr)
{ ....
}//End of while(i<xr)
}//End of while(!isstackempty())
}
yalinliu
2003-10-21
打赏
举报
回复
计算机图形学上有类似的算法!
Label mx 通用条码标签设计系统.docx
* 支持条码导出为 EMF
矢量图
形
格式 * 支持数值大小写转换、保留小数点位数,数值转金额等功能 * 支持打印边框、内裁切线、外裁切线、裁切点等功能 * 用户可以设置自己喜好的软件环境和标尺颜色 * 支持标签保存文件...
空间数据库技术应用教学案例-校园基础地理空间数据库建设技术报告.docx
- **矢量数据**:包括点、线、面要素,如校园内的建筑物、道路、绿地等。 - **栅格数据**:包括校园航拍图像和遥感影像,可用于构建
高分
辨率的地表模型。 - **属性数据**:与地理空间数据相关的文本和多媒体数据。 ...
登月模拟游戏开发:
矢量图
形
、物理引擎与遗传算法
《登月模拟游戏开发:
矢量图
形
、物理引擎与遗传算法》 摘要: 本章详细介绍了基于Unity的登月模拟游戏开发全过程,涵盖
矢量图
形
处理、物理引擎实现和遗传算法控制三大核心技术。首先讲解了
矢量图
形
的数学基础与Unity...
计算机图
形
学入门,从零基础到精通,收藏这篇就够了!
*图
形
(Graphics)**是指由点、线、面等基本几何元素构成的矢量数据。它具有以下特点:矢量性:图
形
由数学公式描述,可以无限放大而不失真。编辑性:图
形
易于编辑和修改,如改变
形
状、颜色等。文件大小:通常较小,...
栅格数据和矢量数据对比
栅格数据结构 栅格结构是以规则的阵列来表示空间地物或现象分布的数据组织,组织中的每个数据表示地物或现象的非几何属性特征。 栅格结构的显著特点:属性明显,定位隐含...链码(弗里曼链码)比较适合存储图
形
数...
机器视觉
4,499
社区成员
15,351
社区内容
发帖
与我相关
我的任务
机器视觉
图形图像/机器视觉
复制链接
扫一扫
分享
社区描述
图形图像/机器视觉
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章