思路:注意不要漏掉两个点在异侧的情况
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
double dis(double x1,double y1,double x2,double y2)
{
return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
struct point
{
double x,y;
};
double multi(point a,point b,point c)//abxac,ab(b.x-a.x,b.y-a.y),ac(c.x-a.x,c.y-a.y)
{
return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
int main()
{
int t,i;
double k,ax,ay,ax1,ay1,bx,by,cx,cy,dx,dy,A,B,C,ans,u,v;
scanf("%d",&t);
while(t--)
{
scanf("%lf",&k);
scanf("%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&cx,&cy);
dx=0;
dy=cy-k*cx;
point aa,bb,cc,dd;
aa.x=ax;aa.y=ay;
bb.x=cx;bb.y=cy;
cc.x=dx;cc.y=dy;
u=multi(bb,cc,aa);
dd.x=bx;dd.y=by;
v=multi(bb,cc,dd);
if(u*v<=0.00000001)
{
ans=dis(bx,by,ax,ay);
cout<<fixed<<setprecision(2)<<ans<<endl;
}
else
{
A=k;
B=-1;
C=cy-k*cx;
//cout<<A<<" "<<B<<" "<<C<<endl;
ax1=ax-2*A*(A*ax+B*ay+C)/(A*A+B*B);
ay1=ay-2*B*(A*ax+B*ay+C)/(A*A+B*B);
ans=dis(ax1,ay1,bx,by);
cout<<fixed<<setprecision(2)<<ans<<endl;
}
}
}
//人一我百,人百我万
//时间