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;
}