链接:https://ac.nowcoder.com/acm/contest/86/B
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
Special Judge, 64bit IO Format: %lld
空间限制:C/C++ 262144K,其他语言524288K
Special Judge, 64bit IO Format: %lld
题目描述
Et´ereoEte´reo 开始涉猎几何领域了。他现在正在研究小马喝水问题。
众所周知,这个问题中有一匹口渴的小马,一条笔直的河,以及小马的家。小马需要去河边喝水,然后再去家里。它需要走最短的路径。
解决这个问题也很简单,其中有一个步骤是要做小马家关于河水的对称点。
Et´ereoEte´reo 正对此感到一些烦恼。他不会做这个。他想请你帮他作一条过小马家且垂直于河水的线,然后告诉 Et´ereoEte´reo 垂足的位置。
输入描述:
第一行一个整数 TT ,表示 Et´ereoEte´reo 的询问个数。
接下去 TT 行,每行 66 个实数 Px,Py,Ux,Uy,Vx,VyPx,Py,Ux,Uy,Vx,Vy,表示小马家在点 P(Px,Py)P(Px,Py) ,河水为直线 L=[U(Ux,Uy),V(Vx,Vy)]L=[U(Ux,Uy),V(Vx,Vy)]
输出描述:
输出共 TT 行,每行两个实数 Qx,QyQx,Qy, 表示答案垂足点的坐标 QQ。
当你的答案与标准输出的误差小于 10−510−5 时,视为答案正确。
示例1
备注:
1≤T≤5001≤T≤500
−105≤Px,Py,Ux,Uy,Vx,Vy≤105−105≤Px,Py,Ux,Uy,Vx,Vy≤105
分析:这个题我们可以直接用两点求直线的一般式AX+BY+C=0,并由此得其垂线系为BX-AY+M=0;
由两点求一般式的方法为:
A=y2-y1
B=x2-x2
m=x2*y1-x1*y2
先用公式求出AB,再将AB带入第一个公式求M,在算两线交点即可,属于计算几何入门题
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int inf=1<<30; 4 typedef long long ll; 5 const double pi=acos(-1); 6 const int mod=1e9+7; 7 const int maxn=1e5+1; 8 int a[maxn]; 9 int main(){ 10 int T;scanf("%d",&T); 11 while(T--){ 12 double x,y,ux,uy,vx,vy;scanf("%lf%lf%lf%lf%lf%lf",&x,&y,&ux,&uy,&vx,&vy); 13 double k=(vy-uy)/(vx-ux); 14 double A,B,c; 15 A=vy-uy,B=ux-vx,c=vx*uy-ux*vy; 16 double yy,xx,m; 17 m=A*y-B*x; 18 double res=(m*A-B*c)/(A*A+B*B); 19 printf("%.5lf %.5lf ",A/B*res-m/B,(m*A-B*c)/(A*A+B*B)); 20 } 21 return 0; 22 }