光影切割问题

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

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

两条直线有一个交点——空间分成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个元素的数组的逆序数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值