计算几何的一些基础操作.
为了后续处理起来方便,可以先将坐标系平移,使得圆心成为坐标系的原点.
考虑枚举两个点,计算它们在移动过程中出现的最近距离来更新答案.
每个点的运动路径是 $k$ 条线段组成的折线,考虑先把这 $k$ 条线段的起止位置,时间都算出来.
尝试去模拟点的运动,通过解方程可以确定在哪里撞上边界,撞上后需要更新速度.
假设交点是 $B$ ,先找到 $A$ 满足 $\vec{AB}=\vec v$ ,求出交点处的法线,把 $A$ 沿着它对称过去得到 $A’$ ,则新的速度为 $\vec{BA’}$ .
点关于直线 $y=\tan\theta \cdot x$ 的对称可以通过角度的运算实现,用 $\alpha,\beta$ 分别表示对称前后的极角,则 $\beta=2\theta-\alpha$ .
这样可以求出一个点的 $k$ 条线段的信息.
考虑两个点的最近距离,每个点有 $k$ 个关键时间点,所以最多需要考虑 $2k$ 个时间段.
每个时间段内两个点的方向都不会变,设 $t$ 表示「当前时刻 - 该时间段开始的时刻」,则距离的平方是 $t$ 的二次函数.
用二次函数在区间内求最小值的方法,就可以求出该时间段内两点的最近距离,注意可能有退化成一次函数的情况.
时间复杂度 $O(n^2\cdot k)$ .
1 | //%std |