http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19096
這題做的很艱難,真有點高中白讀了的感覺,一些基本東西快忘完了都!
給定一塊對邊相等的土地,然後每條邊的每個方向都有一快鄰居的土地與你共用一條邊,鄰居土地都是正方形,給定對邊鄰居土地的中心點,求另兩塊土地的中心點。
抽象出來,就是給定正方形的一對對立頂點,求另外一對頂點。
證明四個中心點是正方形是利用全等三角形,邊角邊證明。
之後用向量的方法,把其餘頂點求出來。假設已知點爲 A(x1,y1) C(x2,y2) 則向量 P=AC=(px,py)=(x2-x1,y2-y1); 因爲BD與AC垂直且
中點座標爲C=(cx,cy)=( (x1+x2)/2, (y1+y2)/2 ) 得出兩點座標一個是 C+ (py,-px) /2 一個是 C - (py,px)/2 .知道中點和BD的向量就可以求出BD的座標,點按向量平移。
#include<cstdio>
#include<cmath>
#define eps 1e-8
int main()
{
double x1,y1,x2,y2;
while(~scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2))
{
if(fabs(x1-x2)<eps&&fabs(y1-y2)<eps) //不能構成正方形
{
printf("Impossible.\n");
continue;
}
double px=(x1-x2)/2,py=(y1-y2)/2;
double cx=(x1+x2)/2,cy=(y1+y2)/2;
printf("%.10lf %.10lf %.10lf %.10lf\n",cx+py,cy-px,cx-py,cy+px);
}
return 0;
}