話很少說,助您 2 分鐘掌握衛星星座圖,知曉原理,並能繪製javascript
什麼是衛星星座?html
詳細科普不在本文浪費時間了,徹底不懂的同窗瞄一下衛星星座-百度百科就能夠了。html5
簡單解釋一下所需的數據,能獲取的衛星數據參考下圖,摘取百度文庫相關文章片斷:java
其中咱們所需的信息有 3 個:git
下圖先來解釋一下「方位角」與「俯仰角」是什麼樣子的:github
衛星號:就是衛星名稱,即字符串,非必須,不用解釋了。測試
衛星方位角:就是衛星相對於測量點的方向,正北方向爲 0 度,順時針遞增。 字體
衛星俯仰角:就是在地平面上,要擡頭多少度,才能望到衛星,水平方向爲 0 度,頭頂的垂直方向爲 90 度。 優化
因此數據一般長這樣:動畫
const data = [
{ name: 11, elevation: 11, azimuth: 111 },
{ name: 22, elevation: 45, azimuth: 222 },
{ name: 33, elevation: 33, azimuth: 333 },
];
複製代碼
咱們使用 Canvas 來實現便可。
代碼步驟:
繪製背景框圖代碼:
這裏採用簡單地等分俯仰角度線
//畫外部圈圈
ctx.beginPath();
ctx.arc(0, 0, Radius, 0, Math.PI * 2, false);
ctx.stroke();
//畫中間圈圈
ctx.beginPath();
ctx.arc(0, 0, (Radius * 2) / 3, 0, Math.PI * 2, false);
ctx.stroke();
//畫內部圈圈
ctx.beginPath();
ctx.arc(0, 0, Radius / 3, 0, Math.PI * 2, false);
ctx.stroke();
// 畫 8 條方位角等分線
ctx.beginPath();
for (var i = 0; i < 8; i++) {
ctx.rotate((Math.PI / 180) * 45);
ctx.moveTo(0, 0);
ctx.lineTo(0, Radius);
}
ctx.stroke();
複製代碼
繪製衛星代碼(核心代碼!):
下面代碼展現部分,忽略畫筆的顏色,字體設置
for (let i = 0; i < data.length; i++) {
const element = data[i];
ctx.beginPath();
//核心的核心:計算衛星座標。len 是衛星投影點到圓心的距離。
let len = Math.cos((element.elevation * Math.PI) / 180) * Radius;
y = Math.cos((element.azimuth * Math.PI) / 180) * len;
x = Math.sin((element.azimuth * Math.PI) / 180) * len;
//在座標點繪製圓
ctx.arc(x, -y, 14, 0, Math.PI * 2, false);
ctx.fill();
ctx.beginPath();
//在座標點寫文字衛星號
ctx.fillText(element.name, x, -y);
}
複製代碼
核心代碼解釋:
這裏的重點是根據「方位角」與「俯仰角」,以及咱們定義的半徑,來算出該衛星的繪製位置。
先根據俯仰角,算出該衛星投影到地平面上的點(投影點),該點距離測量點(圓心)的距離,咱們在這裏稱其爲「圓心距」。
根據圓心距與方位角,利用三角定理,就能夠獲得該投影點相對於圓心的相對位置。
核心原理說白了就是這麼簡單。
先利用俯仰角,獲得衛星投影點與圓心的距離。
接着經過方位角與圓心距,獲得相對圓心的座標。
最後經過座標就能夠直接繪製了。
根據實際狀況,還能加上衛星類型。例如,咱們除了有 GPS 衛星,還有 GLONASS 衛星、GALILEO 衛星、以及北斗衛星。如最上面的動圖所示,不一樣顏色表明不一樣的類型的衛星。
待實現:
真正到生產環境,咱們還須要對繪製邏輯進行進一步的優化。具體內容,敬請關注。
以及能夠經過 3D 技術,獲取更直觀的效果。請關注下一篇內容。
但願本文對您有所幫助。
若有不對的地方,還請糾正,萬分感激。
參考: