地球的半徑為 6440 公里,給予軌道上兩衛星與地球表面的距離及與圓心形成的角度,求兩衛星之間的弧長及弦距。
輸入
一行一筆資料,資料以空格分隔,分別為衛星離地球表面的距離、角度、及單位 (deg 角度
及 min 弧分
)。
Ex:
500 30 deg
465 1800 min
900 175 deg
...
...
輸出
輸出計算出來的弧長及弦距,以空格分隔,需到小數點後六位。
解題
以 1000 205 deg
此資料作為範例,先將半徑加回去,$1000+6440=7440$,接著由於角度大於 180,所以用 360 減去角度才是最小夾角,也就是 $360-205=155$。為了等一下方便計算,可以先把角度轉換成徑度。
\[ deg \times \pi \div 180 = rad \newline 155 \times \pi \div 180 = 2.7052603405… \]
半徑及角度都處理完後就可以開始計算了。
弧長公式為 $r \theta$,$2.7052603405… \times 7440=20127.1369339986…$,取到小數點後六位即為$20127.136934$。
計算弦長則需使用餘弦定理$\sqrt{b^2+c^2-2bc\cos A}$。$\sqrt{7440^2+7440^2-2\cdot 7440\cdot 7440\cos \left(2.70526\dots \right)} = 14527.2845859446…$,取到小數點後六位即為$14527.284586$。
若單位為弧分,如 200 2700 min
,則需先將弧分轉成角度 ($min \div 60 = deg$),再進行上述運算。
程式碼
將上述過程轉為程式。
#include <cmath> // cos(), sqrt(), M_PI
#include <iomanip> //setprecision()
#include <iostream>
#include <string>
using namespace std;
int main(){
double s,a;
string string;
while(cin >> s >> a >> string){
if(string[0] == 'm')
a /= 60;
s += 6440;
if(a > 180)
a = 360 - a;
a = a * M_PI / 180;
cout << fixed << setprecision(6) << s * a << " " << sqrt(s * s + s * s - 2 * s * s * cos(a)) << endl;
}
}