区间扫描线算法

Posted cnblog-wuran

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区间扫描线算法相关的知识,希望对你有一定的参考价值。

区间扫描线算法

下面介绍区间扫描线算法。该算法放弃了z-buffer的思想,是 一个新的算法,这个算法被认为是消隐算法中最快的

 

因为不管是哪一种z-buffer算法,都是在像素级上处理问题 ,要进行消隐,

每个像素都要进行计算判别,甚至一个像素 要进行多次(一个像素可能会被多个多边形覆盖)

 

技术分享图片

扫描线的交点把这条扫描线分成了若干个区间,每个区间 上必然是同样一种颜色

对于有重合的区间,如a6a7这个区间,要么显示F2的颜 色,要么显示F3的颜色,不会出现颜色的跳跃

如果把扫描线和多边形的这些交点都求出来,对每个区间, 只要判断一个像素的要画什么颜色,那么整个区间的颜色都 解决了,这就是区间扫描线算法的主要思想

算法的优点:将象素计算改为逐段计算,效率大大提高!

 

如何实现这个算法?

首先要有投影多边形,然后求交点,然后交点进行排序排序

 

排序的结果就分成了一个个区间,然后在每个区间找当中的 一个像素(i,j),

在(i,j)处计算每个相关面的z值,对 相关深度值z进行比较,其中最大的一个就表示是可见的。

整 个这段区间就画这个z值最大面的颜色

 

如何确定小区间的颜色 ?

技术分享图片

(1)小区间上没有任何多边形,如[a4,a5],用背景色显示

(2)小区间只有一个多边形,如[a1,a2],显示该多边形的颜色

(3)小区间上存在两个或两个以上的多边,比如[a6,a7], 必须通 过深度测试判断哪个多边形可见

 

这个算法存在几个问题:

1、真的去求交点吗?利用增量算法简化求交!

2、每段区间上要求z值最大的面,这就存在一个问题。如何 知道在这个区间上有哪些多边形是和这个区间相关的?

 

以上是关于区间扫描线算法的主要内容,如果未能解决你的问题,请参考以下文章

(使用线段树实现的)扫描线算法

专题偏序,扫描线

[H扫描线] lc218. 天际线问题(扫描线求轮廓+边界情况+好题+算法技巧)

快速排序分区以及优化方法

快速排序分区以及优化方法

POJ2482 Stars in Your Window(扫描线+区间最大+区间更新)