光影切割问题

来源:互联网 发布:航空大亨3飞机数据 编辑:程序博客网 时间:2024/04/29 01:48

光影切割问题”是游戏场景中经常出现的,例如一些房屋场景里面,在里面上会因为阳光从屋顶的漏洞或窗口照射进来而形成许多光照区域和阴影区域。

下面是一个在平面中的直线分割示意图,右图

两条直线有一个交点——空间分成4部分

三条直接有三个交点——空间分成7部分

没增加一条直线,则跟前面的n-1条直接有n-1个交点,新增加n块新区域

推出:如果总共有N条直线,M个交点,那么区域的数目为N+M+1

然而,这样的问题往往是要快速计算某个时刻,在坐标中的区域被光影划分成多少块。如何设计算法?

我们可以换一种思路,如图,三条直线,跟Y坐标的交线,从上往下为(a,b,c),而右边界上的交点的顺序为(c,b,a),可以看到,顺序被反过来了,由于是有了交点才被反过来的,没有交点的话顺序就是不会反过来的。这样可以得出:区域内的交点数目就等于一个边界上交点顺序相对于另一个边界交单顺序的逆序总数。例如右图中a=1,b=2,c=3,那么(c,b,a)=(3,2,1),它的逆序数为3

因此,问题就转化成为求一个N个元素的数组的逆序数

原创粉丝点击