扫描线算法

基本思想

 

 

 

 

 

 

 

 

 

按扫描线顺序,

计算扫描线与多边形的相交区间,

再用要求的颜色显示这些区间的

象素,即完成填充工作。

 

对于一条扫描线填充过程可以分为四个步骤:

 

 

 

 

 

(1) 

 

求交:计算扫描线与多边形各边的交点

 

 

 

 

 

(2) 

 

排序:把所有交点按

 

坐标递增顺序来排序

 

 

 

 

 

(3) 

 

配对:确定扫描线与多边形的相交区间,第一个与第二个,第三个与第四个等等,

每对交点代表扫描线与多边形的一个相交区间

 

 

 

 

 

(4) 

 

填充:显示相交区间的象素


基本思想          按扫描线顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的象素,即完成填充工作。 

对于一条扫描线填充过程可以分为四个步骤:  

   (1)  求交:计算扫描线与多边形各边的交点      

   (2)  排序:把所有交点按 x 坐标递增顺序来排序     

    (3)  配对:确定扫描线与多边形的相交区间,第一个与第二个,第三个与第四个等等,每对交点代表扫描线与多边形的一个相交区间  

    (4)  填充:显示相交区间的象素

存在问题1:当扫描线与多边形顶点相交时,交点的取舍问题  

解决方法:当扫描线与多边形的顶点相交时,若共享顶点的两条边分别落在扫描线的两边, 交点只算一个;若共享顶点的两条边在扫描线的同一边,这时交点作为零个或两个,取决于该点是多边形的局部最高点或局部最低点。  

具体实现:只需检查顶点的两条边的另外两个端点的 y  值,按这两个 y  值中大于交点 y 值的个数是0,1,2 来决定。 

  存在问题2:多边形边界上象素的取舍

  解决方法:规定右/上边界的象素不予填充;左/下边界的象素予以填充。

 具体实现:对扫描线与多边形的相交区间取左闭右开。 


   算法的实现 

求交  一条扫描线往往只和少数几条边相交。          与当前扫描线相交的边称为活性边,把它们按与扫描线交点 x 坐标递增的顺序存入一个链表中,称为活性边表 ( AET, Active Edge Table)          由边的连贯性(当某条边与当前扫描线相交时,它很可能也与下一条扫描线相交)和扫描线的连贯性(当前扫描线与各边的交点顺序,与下一条扫描线与各边的交点顺序很可能相同或类似),只需对当前扫描线的活性边表作更新,即可得到下一条扫描线的活性边表。 

计算下一条扫描线与边的交点          设直线方程:a x + b y + c = 0, 

 当前交点坐标:(xi , yi),

下一交点坐标:(xi+1  ,yi+1)  xi+1= ((-b yi+1)-c)/a = ((-b yi+1)-c)/a = xi-b/a    

增量为 -b/a  

故在活性边表中需要存放的信息:  

   x:当前扫描线与边的交点  

  △x = -b/a:从当前扫描线到下一条扫描线之间的 x 增量   

 ymax:该边所交的最高扫描线 

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab扫描线算法是一种用于填充多边形区域的算法。该算法的基本思想是从给定的种子点开始,沿着扫描线向左右两个方向填充位于给定区域内的像素。具体步骤如下: 1. 初始化一个空的栈,将种子像素(x, y)入栈。 2. 当栈非空,重复执行以下步骤: a. 栈顶像素出栈。 b. 沿着扫描线对出栈像素的左右像素进行填充,直到遇到边界像素为止。 c. 将上述区间内最左和最右的像素分别记为xLeft和xRight。 d. 在区间\[xLeft, xRight\]内检查与当前扫描线相邻的上下两条扫描线是否全为边界像素或已填充的像素,若为非边界和未填充,则将每个区间的最右像素xRight作为种子像素压入栈,重复步骤(2)。 3. 重复步骤(2)直到填充结束。 这个算法可以用于填充任意形状的多边形区域。在Matlab,可以使用Bresenham线算法计算扫描线上的像素点,然后使用plot函数将这些像素点绘制出来,实现填充效果。 请注意,以上是对Matlab扫描线算法的一般描述,具体实现可能会有一些细微的差异。 #### 引用[.reference_title] - *1* *2* [【CV系列】扫描线算法区域填充](https://blog.csdn.net/SoaringLee_fighting/article/details/90322682)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [MATLAB等距线扫描程序实现思路与源程序](https://blog.csdn.net/weixin_36296063/article/details/115851906)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值