//数学题
//直线 y = k * x + b
//直线 ax+by+c=0; 点 (x0,y0); 点到直线距离 d = (ax0+by0+c)/sqrt(a^2+b^2)
/*
*****************************************************************
关于直线对称公式如下:
1。点(a,b)关于直线 y=kx+m (k=1或-1)的
对称点为:(b/k-m/k,ka+m),实际上是将表达式中的x,y的值互换,
因为直线方程 y=kx+m 中有 x=y/k-m/k 且 y=kx+m,这种方法只适用于 k=1或-1
的情况。还可以推广为 曲线 f(x,y)=0关于直线 y=kx+m 的 对称曲线 为
f(y/k-m/k,kx+m)=0。
2.当 k不等于1或-1时,点(a,b)关于直线 Ax+By+C=0 的对称点为
(a-(2A*(Aa+Bb+C))/(A*A+B*B),b-(2B*(Aa+Bb+C))/(A*A+B*B)),
同样可以扩展到曲线关于直线对称方面,有 f(x,y)=0关于
直线 Ax+By+C=0 的对称曲线为
f(x-(2A*(Ax+By+C))/(A*A+B*B),y-(2B*(Ax+By+C))/(A*A+B*B))=0.
以上包含了所有关于直线对称的情况。
顺便把点关于点对称的也写在这,方便大家使用。
点(x,y)关于 点(a,b)对称点是 (2a-x,2b-y);
曲线 f(x,y)=0 关于 点(a,b)对称曲线为 f(2a-x,2b-y)=0。
*****************************************************************
*********************************************
设直线方程为Ax+By+C=0,两点为(x1,y1),(x2,y2)
(Ax1+By1+C)(Ax2+By2+C)>0
同侧
(Ax1+By1+C)(Ax2+By2+C)<0
异侧
*********************************************
*/
#include<math.h> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int main() { int m; double k,ax,ay,bx,by,cx,cy; scanf("%d",&m); while(m--) { scanf("%lf",&k); scanf("%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&cx,&cy); double b1 = cy-k*cx; double A = k, B = -1, C = b1; //判断两点是否同侧 if((A * ax + B * ay + C) * ( A * bx + B * by + C) < 0)//同侧 { printf("%.2lf ",sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by))); } else { double xn = ax - (2 * A * (A * ax + B * ay + C)) / (A * A + B * B); double yn = ay - (2 * B * (A * ax + B * ay + C)) / (A * A + B * B); printf("%.2lf ",sqrt((xn - bx) * (xn - bx) + (yn - by) * (yn - by))); } } return 0; }