点关于直线的对称点
Hdu 2857 点关于直线的对称点
#include
#include
#include
int main()
{
double x1,x2,y1,y2,xs,ys,xs1,ys1,xe,ye;
double x,y;
double k1,k2;
double a,b,c;
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&xs,&ys,&xe,&ye);//
//x1,y1,x2,y2是要对称的直线,xs,ys是要被对称的点
b=x2-x1;
a=y1-y2;
c=x1*(y2-y1)-y1*(x2-x1);//求出对称直线的标准方程
// printf("%.3lf %.3lf %.3lf\n",a,b,c);
xs1=((b*b-a*a)*xs-2*a*b*ys-2*a*c)/(a*a+b*b);//求出对称点的公式
ys1=((a*a-b*b)*ys-2*a*b*xs-2*b*c)/(a*a+b*b);
// printf("%.3lf %.3lf\n",xs1,ys1);
if((x2-x1)==0&&(xe-xs1)!=0)//本题的求直线相交
{
x=x1;
y=ye+((ye-ys1)/(xe-xs1))*x-((ye-ys1)/(xe-xs1))*xe;
}
else
if((x2-x1)!=0&&(xe-xs1)==0)
{
x=xe;
y=y1+((y2-y1)/(x2-x1))*(x-x1);
}
else
{
k1=(y2-y1)/(x2-x1);
k2=(ye-ys1)/(xe-xs1);
// printf("%.3lf %.3lf\n",k1,k2);
x=(y1-ye-k1*x1+k2*xe)/(k2-k1);
y=k2*(x-xe)+ye;
}
printf("%.3lf %.3lf\n",x,y);
}
system("pause");
}