题意:
给出两个凸包AAA和BBB,有若干询问,每次给出一个向量V=(x,y)V = (x,y)V=(x,y),将BBB按照VVV的方向平移到B′B'B′,然后回答AAA和B′B'B′是否相交。
题解:
题目的条件等价于 存在点a,ba,ba,b,其中a∈A,b∈Ba\in A, b \in Ba∈A,b∈B,且满足a=b+Va = b + Va=b+V。
则得到等价条件V=a−bV = a - bV=a−b。
即VVV要在AAA与−B-B−B的闵可夫斯基和中。
显然−B-B−B也是一个凸包,因此我们只需要求两个凸包的闵可夫斯基和。
而两个凸包的闵可夫斯基和也一定是个凸包,而且这个新凸包的每条边(看作向量),一定是原来两个凸包的边(看作向量)。实际上就是归并转一下两个凸包就行了
然后判断点在凸包内。
算是做的第一道真正意义的计算几何题吧。。。太菜了。。。
Code:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10000 + 50;
template<class type>
struct point{
type x,y;
point(){
};
point(type x_,type y_):x(x_),y(y_){
}
point operator +(const point &p)const {
<