POJ 3304:Segments & Acwing 2984:线段 (计算几何基础 枚举 判断点在直线两侧)

这篇博客介绍了如何解决计算机图形学中的一个问题——判断一组线段是否存在一条直线,使得所有线段到这条直线的投影有交点。通过转换问题,寻找与原直线垂直的直线,再利用向量叉积判断线段与直线的相交情况,最终实现O(n^3)复杂度的解决方案。代码中展示了C++实现的详细过程。
摘要由CSDN通过智能技术生成

题目链接

POJ 3304:Segments
Acwing 2984:线段

题目大意

有n条线段,给出所有线段的两端点,判断是否存在一条直线,使得所有线段到这条直线上的投影都有交点,若存在输出Yes!,否则输出No!。

思路

首先要找这条直线不好直接找,所以我们就要将问题转化一下,若存在一条直线1和所有线段都有交点,则一定存在一条和该直线垂直的直线2,使得所有线段到直线2上的投影都有交点,交点就是所有线段和直线1的交点在直线2上的投影。如下图:
eg
那么这样就好找这条直线了,因此这就将问题转化成了求一条直线和所有线段都有交点,那么现在如何求这条直线呢?我们考虑将这条直线绕任意一点旋转,那么他一定会被一条线段所限制,他最多可旋转到某条直线的一个端点,如图:
eg
这里的红色端点就是限制他的点,然后我们再绕该红色点旋转,一点还会有另一个蓝点来限制这条直线,如图:
eg
因此,我们就会发现,这条直线在这种情况下一点会经过所有线段端点的某两个,因此我们只需要枚举两个点,然后再判断一次即可。那么问题来了如何判断直线是否和线段相交呢?我们可以用向量的叉积来判断,如图直线ij和线段ab相交:
eg
做向量 j i ⃗ \vec {ji} ji j a ⃗ \vec {ja} ja j b ⃗ \vec {jb} jb

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值