/*********************************************************************
ミ サ イ ル の 運 動
入力:半射程角、長径、離心率
出力: 飛翔距離、平均速度、飛翔時間
1999.08.09
By T.Kubota
*********************************************************************/
#include <stdio.h>
#include <math.h>
#define PI 3.14159265358979
#define R 6378136 /* 地球赤道面平均半径(m) */
#define U (3.98602e+14) /* 地心引力係数 */
#define N 100 /* 降弧の分割数 */
int main(void) {
double a; /* 楕円軌道長径 */
double e; /* 楕円軌道の離心率 */
double r; /* 動径 */
double v; /* ミサイル速度(m/s) */
double vm; /* ミサイル平均速度(m/s) */
double vs; /* ミサイル速度の加算値 */
double w; /* 半射程角(rad) */
double dw; /* 分割半射程角 w/N */
double rad; /* 度→ラジアン変換係数 */
double ds,dx,dy; /* 弾道経路の微少分 */
double s; /* 弾道距離(m) */
double tf; /* 飛翔時間(s) */
int hh,mm; /* 時 分 */
double ss; /* 秒 */
double tmp1,tmp2; /* 作業用変数 */
int i;
rad=PI/180.0;
printf("半射程角(°)、長径(km) 、離心率を入力して下さい。--->");
scanf("%lf %lf %lf",&w,&a,&e);
printf("半射程角 = %4.1lf(°)\n",w);
printf("長 径 = %6.1lf(Km)\n",a);
printf("離 心 率 = %6.4lf\n\n",e);
w=w*rad;
dw=w/N;
a=a*1000;
vs=0.0;
ds=0.0;
printf(" 角度 動径(km) 速度(m/s)\n");
for (i=0;i<=N;i++){
r=a*(1.0-e*e)/(1.0-e*cos(dw*i));
v=sqrt(U*((2.0/r)-(1.0/a)));
vs+=v;
if(i==0){
tmp1=r;
}
else{
tmp2=r;
}
if(i>1){
dx=tmp2*sin(dw);
dy=tmp1-tmp2*cos(dw);
ds+=sqrt(dx*dx+dy*dy);
tmp1=tmp2;
}
if(i%10==0){ /* 100 分割中の 10 データを抽出表示する */
printf(" %8.5lf %6.1lf %6.1lf\n",dw*i/rad,r/1000,v);
}
}
s=ds*2.0; /* 飛翔距離(昇弧+降弧) */
vm=vs/(N+1); /* 平均速度 */
tf=s/vm; /* 飛翔時間(秒) */
hh=(int)(tf/3600); /* 秒→時:分:秒 変換 */
mm=(int)((tf-hh*3600)/60.0);
ss=tf-hh*3600-mm*60;
printf("\n 平均速度= %6.1lf (m/s)\n",vm);
printf("\n 飛翔距離= %6.1lf (km)\n",s/1000);
printf("\n 飛翔時間= %6.1lf (s) <%2d:%2d:%4.1lf>\n",tf,hh,mm,ss);
getchar();getchar();
return 0;
}