POJ 3407 Brookebond s'en va en guerre...
問題
地球上の二点が緯度と経度により指定される。
その二点間の、地表での距離を1メートルの精度で求めよ。
ただし地球は半径6370kmの真球と仮定せよ。
制約条件
なし
方針
緯度と経度から点のx,y,z座標がわかる。
そこから、二点間の直線距離がわかる。
すると、二点および地球の中心を通る平面で地球を切ったときの、
断面に円のおける弦の長さがわかるので、二点間の地表での距離もわかる。
ソースコード
void in(double &x,double &y,double &z){ double t,p; int a,b,c,d; char e,f; scanf("%d%d %c%d%d %c",&a,&b,&e,&c,&d,&f); t=(a+b/60.0)*PI/180; p=(c+d/60.0)*PI/180; if(e=='S')t*=-1; if(f=='W')p*=-1; z=R*sin(t); y=R*cos(t)*sin(p); x=R*cos(t)*cos(p); } int main(){ double x1,y1,z1,x2,y2,z2; in(x1,y1,z1); in(x2,y2,z2); double d=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2); d=sqrt(d); double dist=2*R*asin(d/2/R); printf("%.3f\n",dist); return 0; }