过一点求对一个直线的垂足

链接:https://ac.nowcoder.com/acm/contest/86/B

来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制: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。 
当你的答案与标准输出的误差小于 10510−5 时,视为答案正确。
示例1

输入

复制
3
0 1 0 0 1 1
2.13 -6.89 1.78 1.20 -7.73 0.56
3.473 -4.326 -4.851 -0.819 2.467 -2.729

输出

复制
0.5000000 0.5000000
1.5864392 1.1869738
3.7990750 -3.076672

备注:

1T5001≤T≤500
105Px,Py,Ux,Uy,Vx,Vy105−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 }
 
原文地址:https://www.cnblogs.com/qingjiuling/p/10361791.html