/*
显然,如果A,B在直线的同一侧,则min(PA+PB)=dis(A,B),
否则,求出B关于直线的对称点B`,min(PA+PB)=dis(A,B`)
*/
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int main()
{
int c;
double k,x1,y1,x2,y2,x3,y3,x,y,dis,t,a,b;
cin>>c;
while(c--)
{
cin>>k>>x1>>y1>>x2>>y2>>x3>>y3;
if(x3!=1.0) t=k-k*x3+y3; //用直线上的(1,t)和(x3,y3)表示这条直线L
else t=2*k-k*x3+y3; //用直线上的(2,t)和(x3,y3)表示这条直线L
a=(1-x3)*(y2-y3)-(t-y3)*(x2-x3);
b=(1-x3)*(y1-y3)-(t-y3)*(x1-x3);
if(a*b>0) //a,b为AC,BC两直线和直线L的叉积,异号则在直线异侧
{
y=(2*y3+(k*k-1)*y2+2*k*(x2-x3))/(k*k+1); //联立向量(CA+CB)所在直线的斜率为k和向量AB所在直线的斜率为-1/k两个方程解得B`
x=x2-k*(y-y2);
dis=sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y));
}
else dis=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
printf("%.2lf\n",dis);
}
return 0;
}
HDU 2671 Can't be easier 求点关于直线的对称点
最新推荐文章于 2020-12-20 12:55:42 发布