#P1070. Deformed Wheel
Deformed Wheel
描述
村庄的木工坊位于山坡附近。木工的两个小男孩正在玩一块看起来像变形车轮的木头,它有两个相同的凸多边形面。一个男孩将木制车轮放在山顶的斜坡上,让它滚下来。另一个男孩需要迅速站到他猜测车轮会停下来的位置。你的程序需要帮助他做出正确的猜测。
更正式地说,我们将木制车轮视为一个简单的凸多边形,而山坡则近似为一系列连接的线段,其斜率逐渐减小。假设序列中最后一个线段的斜率为零,而第一个线段的斜率为正数。最初,车轮被放置在山坡上,使得车轮与线段之间至少有一个接触点。例如在下图中,车轮的初始位置用实线绘制,而最终位置用虚线绘制。
在任何瞬间,如果车轮的重心的 坐标减小,车轮就会绕着其中一个顶点(假设为点 )旋转(注意这个条件在运动过程中的任何瞬间都是必要的)。可以很容易地证明,在任何瞬间,最多只有一个这样的顶点。绕点 的旋转会在车轮接触到一个线段时停止。运动将持续进行,直到找不到任何顶点可以绕其旋转为止。在任何瞬间,假设重心在任何方向上移动最多 个单位不会影响车轮的稳定性。还假设车轮与山坡表面之间的摩擦力非常高,以至于车轮永远不会在表面上滑动。
输入
输入的第一行包含一个整数 (),表示测试用例的数量,随后是每个测试用例的输入数据。在每个测试用例的第一行中,有一个整数 (),表示车轮顶点的数量。在接下来的 行中,每行包含一对数字,分别是顶点的 和 坐标。之后,有一行包含车轮重心的初始 和 坐标。你可以假设重心在多边形内部或边界上(注意,给定的重心不一定是根据车轮的几何形状计算出来的)。接下来的输入数据将描述山坡的形状。山坡的表面用一系列斜率逐渐减小的线段近似表示,最后以一条水平线段结束。对于每条线段,有一行包含线段的长度和斜率(它们都是实数)。这些线段按斜率递减的顺序排列(这部分输入的最后一行斜率为零)。你可以假设最后一个(水平)线段足够长,以至于车轮不会滚过它的末端。在每个测试用例的最后一行中,有一行包含第一段右端点的 和 坐标。所有坐标和斜率都是实数。
输出
对于每个测试用例,输出中应有一行,包含两个数字,分别是车轮重心的 和 坐标。将输出中的数字四舍五入到小数点后三位。
输入数据 1
1
4
40 30
30 37
24 30
30 26
27 29
30 1
100 0
40 30
输出数据 1
28.854 20.031
来源
德黑兰 2001