hdu 2857 Mirror and Light 两直线交点
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define eps 1e-8
using namespace std;
double x[5],y[5],k1;
void qiushuzhi()
{
double k2;
k2=(y[4]-y[3])/(x[4]-x[3]);
printf("%.3lf %.3lf\n",x[1],k2*(x[1]-x[3])+y[3]);
}
void qiushuipin()
{
double k2;
k2=(y[4]-y[3])/(x[4]-x[3]);
printf("%.3lf %.3lf\n",(y[1]-y[3])/k2+x[3],y[1]);
}
void qiucrosspoint()
{ double k2,a,b;
if(fabs(x[3]-x[4])<eps)
{
printf("%.3lf %.3lf\n",x[3],k1*(x[3]-x[1])+y[1]);
return ;
}
k2=(y[4]-y[3])/(x[4]-x[3]);
if(fabs(k1-k2)<eps)return;
a=(y[3]-y[1]+k1*x[1]-k2*x[3])/(k1-k2);
b=k1*(a-x[1])+y[1];
printf("%.3lf %.3lf\n",a,b);
}
int main()
{
int t;
double xzh,yzh;
scanf("%d",&t);
while(t--)
{
scanf("%lf%lf%lf%lf",&x[1],&y[1],&x[2],&y[2]);
scanf("%lf%lf%lf%lf",&x[3],&y[3],&x[4],&y[4]);
if(fabs(x[1]-x[2])<eps)
{
x[3]=-x[3];
qiushuzhi();
continue;
}
if(fabs(y[1]-y[2])<eps)
{
y[3]=-y[3];
qiushuipin();
continue;
}
k1=(y[2]-y[1])/(x[2]-x[1]);
xzh=(k1*y[3]-k1*y[1]+k1*k1*x[1]+x[3])/(k1*k1+1);
yzh=k1*(xzh-x[1])+y[1];
x[3]=2*xzh-x[3];
y[3]=2*yzh-y[3];
qiucrosspoint();
}
return 0;
}
较简洁的代码:
int
{
}