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;
}
较简洁的代码:
#include<stdio.h>
int
main()
{
int
t;
double
x1,y1,x2,y2,xs,ys,xe,ye;
double
k1,k2,x3,y3,a,b;
scanf(
"%d",&t);
while(t--)
{
scanf(
"%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&xs,&ys,&xe,&ye);
if(x1==x2)
{
y3=ys;
x3=(-
1)*xs;
k2=(ye-y3)/(xe-x3);
a=
0;
b=ye-k2*xe;
}
else
{
k1=(y1-y2)/(x1-x2);
y3=(k1*k1*ys-ys+
2*xs*k1+
2*y2-
2*k1*x2)/(
1+k1*k1);
x3=xs-k1*y3+k1*ys;
if(xe==x3)
{
a=
0;
b=y2-k1*x2;
}
else
{
k2=(ye-y3)/(xe-x3);
a=(ye-y2+k1*x2-k2*xe)/(k1-k2);
b=k1*a-k1*x2+y2;
}
}
printf(
"%.3f %.3f
\n
",a,b);
}
return
0;
}