描述
在几何题目中我们常常会碰到求某个点关于某直线对称的点。方向向量在很多情况下会让问题变得简单。我们知道如果已知一个点和一个方向向量也可以确定一条直线。那么我们来练一下方向向量的使用吧。题目给出直线L上的一点和直线的方向向量,并另给出一点S,求点S关于直线L对称的点的坐标。
输入
输入包含多组数据,每组一行,包含6个浮点型数据,分别是直线上的一点的坐标、直线的方向向量的坐标、点S的坐标。所有数据不超过1000。
输出
输出点S关于直线L对称的点的坐标,结果保留两位小数。(注意小数点后第三位要四舍五入)
样例输入
0 0 2 2 2 0
0 1 2 2 0 0
样例输出
0.00 2.00
-1.00 1.00
#include<stdio.h>
int main()
{
double a,b,c,d,e,f,g,h,i;
while(~scanf("%lf %lf %lf %lf %lf %lf",&a,&b,&c,&d,&e,&f))
{
double x,y,x1,y1,k1,k2,b1,x2,y2,x3,y3;
x=a;
y=b;
x1=a+c;
y1=b+d;
if(x1==x)
{
if(e>x)x2=x-(e-x);
else x2=x+(x-e);
y2=f;
}
else
{
k1=(y1-y)*1.0/(x1-x);
b1=y-k1*x*1.0;
g=k1;
h=-1;
i=b1;
x2=(h*h*e-g*g*e-2*g*h*f-2*g*i)*1.0/(g*g+h*h);
y2=(g*g*f-h*h*f-2*g*h*e-2*h*i)*1.0/(g*g+h*h);
}
if(x2>0)x3=(int)(x2*100.0+0.5);
else x3=(int)(x2*100.0-0.5);
if(y2>0)y3=(int)(y2*100.0+0.5);
else y3=(int)(y2*100.0-0.5);
printf("%.2f %.2f\n",x3/100.0,y3/100.0);
}
return 0;
}