题意:给定镜子的两个坐标,入射光线和出射光线的经过的点,求镜子上发生反射的点。
分析:利用对称的性质,作反向延长线,再联立方程求与镜子的交点。要注意镜子垂直x轴的情况的考虑和反向延长线垂直镜子的情况。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<climits>
using namespace std;
const double EPS=1e-8;
int main()
{
int t,i;
double x1,y1,x2,y2,xs,ys,xe,ye,k1,k2,b1,b2,xee,yee,x,y;
//freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
scanf("%lf%lf",&x1,&y1);
scanf("%lf%lf",&x2,&y2);
scanf("%lf%lf",&xs,&ys);
scanf("%lf%lf",&xe,&ye);
x=INT_MAX;
if(fabs(x1-x2)>EPS)//镜子不垂直x轴时。
{
k1=(y2-y1)/(x2-x1);
b1=y1-k1*x1;
xee=(-k1*k1*xe+2*k1*ye-2*b1*k1+xe)/(k1*k1+1);
yee=k1*xee+k1*xe+2*b1-ye;
}
else//镜子垂直x轴时。
{
x=x1;
xee=2*x1-xe;
yee=ye;
}
if(fabs(xs-xee)>EPS)//反射延长线不垂直x轴时。
k2=(ys-yee)/(xs-xee);
else
{
printf("%.3lf %.3lf\n",xs,y1);
continue;
}
b2=ys-k2*xs;
if(fabs(x-INT_MAX)<EPS)
x=(b2-b1)/(k1-k2);
y=k2*x+b2;
printf("%.3lf %.3lf\n",x,y);
}
return 0;
}