圆盘覆盖,计算几何(圆盘问题,LA 2572)

博客探讨了在计算几何中如何判断圆盘覆盖的问题。关键在于理解即使输入数据有微小变化,答案也不会改变。解决方案是通过寻找圆的交点,确定每个圆的可见部分,然后枚举圆对,找出覆盖其他圆的圆。文章还提到了特殊情况的处理,即无交点的圆的覆盖判断,并提供了相关代码实现。
摘要由CSDN通过智能技术生成

就是自己不会做呀,不知道该如何判断一个圆盘是否被其他圆盘覆盖了,想通过判断交点是否满足某些条件来判断是否覆盖,但就是很难找到一些的简单的规律吧。

然后看大白书做的。

题目说,就算输入数据有+-5e-13的变化,答案仍然不会有变化。

这句话十分值得注意,它不是在对你作精度要求,而是在告诉你圆盘的可见部分或不可见部分都具有一定的大小。

换句话说,如果我们把eps设得更小一点(这无所谓,只会更准确),比如1e-13,那么离圆心距离r+5e-13的点P1会被判定为在圆外,并且这个点一定在某个我们可以确定的可见部分或者不可见部分里面,不会因为精度问题而刚好在边界上或者跳到了另一个我们不知道的区域里。当然,离圆心距离r-5e-13的点P2也是同样的道理。

那么从上往下看,第一个圈住P1P2的圆(为什么连P2点也要一起圈住呢?首先由于,所以这肯定不会导致错误。其次我也不知道这是为什么。。。自己又交了一份只圈住P1的代码,也AC了,只能说自己认为圈住两个的代码应该会更鲁棒。)将会在P1点被看到,所以vis。

一个圆有如此之多的(P1,P2)点对,那么我该选择哪些来用于判断呢?

显然一个区域找一个点就好了,而一个区域一定是由有限段的弧围成的。那么我们不妨每一段弧找一个点对,这样虽然略有重复,但是重复的不多而且不会漏。

至于弧的话必然就是由圆被交点截出来的。

那么解法就出来了。

枚举任意两个圆,求出交点,把交点在圆上的极角保存到这个圆上。那么这些极角所对应的端点就把圆分成了许多段。最后我们针对每一段弧求一个(P1,P2)点对,然后从上往下找第一个圈住这个点对的圆,并把它标记为vis就好了。(显然第二个以及更后面圈住这个点对的圆已经被第一个圆覆盖了,所以不vis)具体代码还有更多细节需要注意就不详说了。

注意如果一个圆不与任何其他圆有交点,那么当且仅当它被在它上面的圆完全覆盖时,他才会看不见。所以枚举在它上面的圆,然后看一下是否包含了它的圆心即可。

(其实如果圆A上面的圆B包含了A的圆心,是有两种情况的,一是A包含于B,二是B包含于A。在二的情况下A是不会被B完全覆盖的,但是在这种情况下,当我们枚举到B时,A会被重新标记为vis的。我是从下往上枚举得哈。这也算是弄拙成巧了。)


好吧,后来又想了想发现包含P1,P2的意思应该是,分别标记包含P1的圆与包含P2的圆,而不是一起包。详见代码2。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值