闵可夫斯基和.
对于给出的两个点集可以分别做出两个凸包 $A,B$ ,
记询问给出的向量为 $w=(dx,dy)$ ,若存在向量 $a\in A,b\in B$ 满足 $a=b+w$ ,则会产生冲突.
即判断是否存在 $a\in A,b\in B$ 满足 $w=a-b$.
将 $B$ 中所有点关于原点对称得到 $-B$ ,那么 $A$ 与 $-B$ 的闵可夫斯基和就是所有 $a-b$ 的集合.
两个凸包的闵可夫斯基和仍是一个凸包,将两个凸包的边拿出来归并排序即可得到求和后的凸包.
有可能存在三点共线,所以归并排序后对点集再求一次凸包.
最后只需要判定 $w$ 是否在凸包内,将 $w$ 和凸包一起平移,使得凸包第一个点与原点重合.
先判断 $w$ 是否超出左右的边界,若在边界内,根据极角二分出凸包上相邻的两个点进行判断即可.
如图,红点和蓝点由叉积知在边界外,绿点可以用二分找出两个相邻的黄点,用叉积判断是否在凸包内.
1 | //%std |