CF32E 题解

题目翻译差评,明明镜子是有两个反射面的

考虑只有 2 种情况

第一种是没有经过镜面反射就可以到达 b,另一种是经过了镜面反射。

第一种情况直接叉积判线段相交 a,b 两个点直接连线是否经过墙或者镜子就行。

注意:当镜子和 a,b 共线的时候要特判一下。

第二种情况考虑让两个点对镜子做一下对称,然后再用上面的方法判一下新的点相连是否经过阻挡。

虽然你感觉我说的很简单,但中间各种同侧、共线和精度问题还是挺烦人的。

代码

这份代码仅供参考,不保证正确性。

对于求对称点这个操作,代码如下

inline point footpoint(point p,point a,point b)// 求垂足
{
    point a1 = a-p,a2=b-p,a3=b-a;
    db len1 = Dot(a1,a3)/molen(a3),len2=-1.0*Dot(a2,a3)/molen(a3);
    return a+a3*(len1/(len1+len2));
}
inline point symmetry(point p,point a,point b)// 求对称点
{
    return p + (footpoint(p,a,b)-p)*2;
}
posted @ 2021-09-26 21:42  ·Iris  阅读(78)  评论(0编辑  收藏  举报