- 描述
-
百度地圖有自己的一套座標系(你可以把它看作一個笛卡爾座標系),在這套座標系裏,一個標準單位爲1km。而在這座標系上針對地理信息進行標註的數據,大多數時候是通過購買的方式完成的。爲了節約數據更新的成本,數據組裏的鑫哥想出了一個好主意——自己測數據。
鑫哥按照他的預想開始實驗;在每組試驗中,鑫哥選取了三個已經被準確標註在百度地圖的座標系裏的移動運營商的基站作爲信號接收點(這裏可以準確的得到信號的接收時間信息)。當信號接收點附近的用戶手機簽到時,三個信號接收點就會先後接收到這個信號,並可以準確的知曉接收到信號的時間(將第一個信號點接收到信號的時間記爲0秒時刻)。由此,我們就可以確定用戶手機簽到的位置的在地圖的準確座標了。
現在已知以下數據:
1.三個信號接收點在百度地圖座標系中的具體座標(x1,y1), (x2,y2), (x3,y3);
2.三個信號點得到用戶發出的信號的時間t1, t2, t3(t1, t2, t3 ≥ 0),單位s; t1, t2, t3至少有一個數爲0;
3.信號的轉播速度C,單位m/s;
請幫助鑫哥寫個程序,計算下用戶發出信號的位置在百度地圖座標系內的座標(這個點是唯一的)。 - 輸入
- 輸入包含多組數據,每組數據格式如下:
C
x1 y1 x2 y2 x3 y3
t1 t2 t3
最後一組數據爲0,表示輸入結束。 - 輸出
- 針對每組測試數據,請先輸出這個組的編號(第n組就是輸出“Case n:”);然後換行輸出信號發出點的座標(x,y) 。x,y應該由空格分隔,並被舍入到小數點後第六位。
- 樣例輸入
-
1000 0 1 1 1 2 1 0 0.6 1.6 1000 0 0 0 1 1 0 0.4142135 0 0 1000 0 0 1 0 2 1 0 0.414213562373 1 1000 0 0 0 -1 0 1 0 0 1 1000 0 0 0 1 0 -1 0 1 0 1000 0 0 1 0 -1 0 0 1 0 1000 0 0 -1 0 1 0 0 0 1 100 0 0 0 1 1 0 0 10 10 0
- 樣例輸出
-
Case 1: 0.200000 1.000000 Case 2: 1.000000 1.000000 Case 3: 0.000000 1.000000 Case 4: 0.000000 -0.500000 Case 5: 0.000000 -0.500000 Case 6: -0.500000 0.000000 Case 7: -0.500000 0.000000 Case 8: 0.000000 0.000000
【題解】
解方程!!!!!!
還要分類討論!!!!
直接給代碼
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int cc=0;
int main()
{
freopen("in.txt","r",stdin);
double T,P,tt,c,A,B,k,b,m,n,p,q,r,u,v,w,d,xa,ya,sa,sb,xb,yb,x1,yy1,x2,y2,x3,y3,t1,t2,t3;
while (cin >> c)
{
if (c==0) break;
c/=1000;
cc++;
printf("Case %d:\n",cc);
cin >> x1 >> yy1 >> x2 >> y2 >> x3 >> y3;
cin >> t1 >> t2 >> t3;
if (t1==0 && t2==0 && t3==0)
{
A=(x1+x2+x3)/3;
B=(yy1+y2+y3)/3;
printf("%.6f %.6f\n",A,B);
}
if (t1!=0)
{
if (t2==0)
{
swap(t1,t2);
swap(x1,x2);
swap(yy1,y2);
}
else if (t3==0)
{
swap(t1,t3);
swap(x1,x3);
swap(yy1,y3);
}
}
if (t2==0)
{
swap(t2,t3);
swap(x2,x3);
swap(y2,y3);
}
A=x2*x2+y2*y2-x1*x1-yy1*yy1-c*c*t2*t2;
B=x3*x3+y3*y3-x1*x1-yy1*yy1-c*c*t3*t3;
tt=(yy1-y2)*t3-(yy1-y3)*t2;
if (-1e-8<tt && tt<1e-8)
{
xa=xb=(A*t3-B*t2)/(2*(x1-x3)*t2-2*(x1-x2)*t3);
T=2*(x1-x2)*xa+A;
P=2*(yy1-y2);
T/=2*c*t2;
P/=2*c*t2;
u=P*P-1;
v=2*P*T+2*yy1;
w=T*T-(xa-x1)*(xa-x1)-yy1*yy1;
d=v*v-4*u*w;
if (-1e-8<d && d<0) d=-d;
if (-1e-8<u && u<1e-8)
ya=yb=-w/v;
else
{
ya=(sqrt(d)-v)/2/u;
yb=(-sqrt(d)-v)/2/u;
}
sa=2*(x1-x3)*xa+2*(yy1-y3)*ya+x3*x3+y3*y3-x1*x1-yy1*yy1;
sb=2*c*t3*sqrt((xa-x1)*(xa-x1)+(ya-yy1)*(ya-yy1));
if (-1e-8<xa && xa<1e-8) xa=0;
if (-1e-8<xb && xb<1e-8) xb=0;
if (-1e-8<ya && ya<1e-8) ya=0;
if (-1e-8<yb && yb<1e-8) yb=0;
if (sa==sb)
printf("%.6f %.6f\n",xa,ya);
else
printf("%.6f %.6f\n",xb,yb);
continue;
}
k=((x1-x3)*t2-(x1-x2)*t3)/tt;
b=(B*t2-A*t3)/(2*tt);
if (-1e-8<k && k<1e-8)
{
ya=yb=b;
P=2*(x1-x2);
T=2*(yy1-y2)*ya+A;
T/=2*c*t2;
P/=2*c*t2;
u=P*P-1;
v=2*P*T+2*x1;
w=T*T-x1*x1-(ya-yy1)*(ya-yy1);
d=v*v-4*u*w;
if (-1e-8<d && d<0) d=-d;
if (-1e-8<u && u<1e-8)
xa=xb=-w/v;
else
{
xa=(sqrt(d)-v)/2/u;
xb=(-sqrt(d)-v)/2/u;
}
sa=2*(x1-x3)*xa+2*(yy1-y3)*ya+x3*x3+y3*y3-x1*x1-yy1*yy1;
sb=2*c*t3*sqrt((xa-x1)*(xa-x1)+(ya-yy1)*(ya-yy1));
if (-1e-8<xa && xa<1e-8) xa=0;
if (-1e-8<xb && xb<1e-8) xb=0;
if (-1e-8<ya && ya<1e-8) ya=0;
if (-1e-8<yb && yb<1e-8) yb=0;
if (-1e-8<sa-sb && sa-sb<1e-8)
printf("%.6f %.6f\n",xa,ya);
else
printf("%.6f %.6f\n",xb,yb);
continue;
}
if (-1e-8<b && b<1e-8) b=0;
m=2*(x1-x2)+2*(yy1-y2)*k;
n=2*(yy1-y2)*b+A;
p=(k*k+1)*4*c*c*t2*t2;
q=(x1*x1+b*b-2*b*yy1+yy1*yy1)*4*c*c*t2*t2;
r=(2*k*b-2*x1-2*k*yy1)*4*c*c*t2*t2;
u=m*m-p;
v=2*m*n-r;
w=n*n-q;
d=v*v-4*u*w;
if (-1e-8<d && d<0) d=-d;
if (-1e-8<u && u<1e-8)
xa=xb=-w/v;
else
{
xa=(sqrt(d)-v)/2/u;
xb=(-sqrt(d)-v)/2/u;
}
ya=k*xa+b;
yb=k*xb+b;
sa=2*(x1-x3)*xa+2*(yy1-y3)*ya+B;
sb=2*c*t3*sqrt((xa-x1)*(xa-x1)+(ya-yy1)*(ya-yy1));
if (-1e-8<xa && xa<1e-8) xa=0;
if (-1e-8<xb && xb<1e-8) xb=0;
if (-1e-8<ya && ya<1e-8) ya=0;
if (-1e-8<yb && yb<1e-8) yb=0;
if (-1e-8<sa-sb && sa-sb<1e-8)
printf("%.6f %.6f\n",xa,ya);
else
printf("%.6f %.6f\n",xb,yb);
}
}