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;
}