题意
给出 n 个点和若干条直线,每一条直线用两个点的形式给出。对每一条直线,问所有点是不是在这条直线的同一侧。题目保证直线不会经过n个点。
思路
首先就有一个特殊情况。因为 n >= 0。当 n <= 1 的时候,可以直接判定为对每一条直线,n个点都在它的同一侧。
对于n > 1的情况,显然是求凸包与直线是否相交的问题。这里利用了凸包的一个性质。
对于凸包上相邻的两个点构成的向量的极角,取 [-pi/2, 3/2pi]时,是单调递增的。
求出凸包上边的极角后,
用二分法,找出极角分别大于给出直线的两个方向向量的第一个向量, 这两个向量的起点,就是在垂直于这条直线的方向上距离最远的两个点。
只需要判断这两个点是否在直线的同一侧,就能判断这条直线是不是穿过凸包。
可以画画图理解一下。
链接
http://poj.org/problem?id=1912
代码
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;