问题描述:
reo 开始涉猎几何领域了。他现在正在研究小马喝水问题。
众所周知,这个问题中有一匹口渴的小马,一条笔直的河,以及小马的家。小马需要去河边喝水,然后再去家里。它需要走最短的路径。
解决这个问题也很简单,其中有一个步骤是要做小马家关于河水的对称点。
reo 正对此感到一些烦恼。他不会做这个。他想请你帮他作一条过小马家且垂直于河水的线,然后告诉 reo 垂足的位置。
思路:
直线uv斜率 a = (uy-vy)/(ux-vx)
直线uv为 y = a(x-ux)+uy
直线xp为 y = -(x-px)/a+py
联立就可以计算出x的坐标了。
代码:
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <algorithm>
#include<bits/stdc++.h>
using namespace std;
const double N = 1e6+10;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
const inline int read(){
int k = 0, f = 1; char c = getchar();
for(;!isdigit(c); c = getchar())
if(c == '-') f = -1;
for(;isdigit(c); c = getchar())
k = k * 10 + c - '0';
return k * f;
}
#define ll long long
#define CL(a,b) memset(a,b,sizeof(a))
#define MAXN 100010
int a[MAXN];
int main()
{
int t;
cin >>t;
while(t--)
{
double px,py,ux,uy,vx,vy;
cin >> px >> py >> ux >> uy >> vx >> vy;
if(ux == vx) printf("%.7lf %.7lf\n",ux,py);
else if(uy == vy)
printf("%.7lf %.7lf\n",px,uy);
else
{
double a = (uy-vy)/(ux-vx);
double x = (px+a*py+a*a*ux-a*uy)/(a*a+1);
double y = py + (px - x) / a;
printf("%.7lf %.7lf\n",x,y);
}
}
return 0;
}