這裡將以萬有引力和勢能動能守恆定律為基礎,實現行星運動軌跡.然後再假設有兩個固定的恆星,讓行星在這兩個恆星的力場中運動(這是三體問題的一種噢).前面我寫過關於混沌曲線的文章:混沌數學及其軟體模擬.這類混沌曲線的本質是乙個導數方程,即我不知道這條曲線是什麼樣子,也不知道這條曲線最終通往何處去,我只知道,曲線上的任意一點的切線方向,從而得到它下一點的位置.從而得到整條曲線上的頂點位置.學過物理的人都知道,太陽系中行星的運動軌跡大致是乙個橢圓,我們可以知道每個行星的橢圓方程.記得我剛學圖形學時,就看過乙個程式是太陽行星運動.但它不是以萬有引力為基礎的,只是讓球體繞著固定的橢圓軌跡旋轉.
本來我只打算使用萬有引力定律,沒有考慮勢能動能守恆定律.但程式執行後發現,由於沒有使用微積分,即使取樣間隔時間再小,誤差也很大.其實目前的演算法誤差也不小,呵呵,模擬一下吧,不要太計較.
先帖下基類**,這**與混沌數學及其軟體模擬中的很相似,即是乙個導數方程,用於由當前點計算下一點.
class行星方程:differentiationfunction
virtual
float getstarty() const
virtual
float getstartz() const
};
//行星的導數曲線
class planet : public
differentiationfunction
void differentiate(float x, float y, float z, float
t,
float& outx, float& outy, float&outz)
float v = sqrt(2*m_ek/m_planet_weight);
float w = sqrt(m_planet_speed_x*m_planet_speed_x + m_planet_speed_y*m_planet_speed_y + m_planet_speed_z*m_planet_speed_z);
m_planet_speed_x *= v/w;
m_planet_speed_y *= v/w;
m_planet_speed_z *= v/w;
}float getextendt() const
float getstartx() const
float getstarty() const
float getstartz() const
public
:
float
m_star_weight;
float
m_planet_x;
float
m_planet_y;
float
m_planet_z;
float
m_planet_weight;
float
m_planet_speed_x;
float
m_planet_speed_y;
float
m_planet_speed_z;
float m_g; //
萬有引力係數
float
m_e;
float m_ek; //
動能float m_ep; //
引力勢能
行星在這兩個恆星的力場中運動(三體問題)
//三體問題的導數曲線
class threebody : public
differentiationfunction
void differentiate(float x, float y, float z, float
t,
float& outx, float& outy, float&outz)
float v = sqrt(2*m_ek/m_planet_weight);
float w = sqrt(m_planet_speed_x*m_planet_speed_x + m_planet_speed_y*m_planet_speed_y + m_planet_speed_z*m_planet_speed_z);
m_planet_speed_x *= v/w;
m_planet_speed_y *= v/w;
m_planet_speed_z *= v/w;}}
float getextendt() const
float getstartx() const
float getstarty() const
float getstartz() const
public
:
float
m_star1_x;
float
m_star1_y;
float
m_star1_z;
float
m_star1_weight;
float
m_star2_x;
float
m_star2_y;
float
m_star2_z;
float
m_star2_weight;
float
m_planet_x;
float
m_planet_y;
float
m_planet_z;
float
m_planet_weight;
float
m_planet_speed_x;
float
m_planet_speed_y;
float
m_planet_speed_z;
float m_g; //
萬有引力係數
float
m_e;
float m_ek; //
動能float m_ep1; //
引力勢能
float m_ep2; //
引力勢能
這是我寫的測試程式,寫它是為下一步的三體模擬軟體做準備.下篇文章更精彩:三體運動的程式模擬
行星運動理論由來
人們自古就注意到了金星 木星 水星 火星 土星五大行星在天上的運動。古代巴比倫人已經相當準確地知道行星的公轉週期,並把觀測到的運動用經驗公式表示出來。中國也很早就測定了行星的公轉週期和會合週期,在馬王堆出土的帛書中就有這方面的記載。稍後,希臘人用幾何方法來解釋行星的運動,公元二世紀時出現的托勒密地心...
CSS 繪製太陽系行星執行軌跡
doctype html en utf 8 css3 動畫 title div.ex1 keyframes myfirst to webkit keyframes myfirst to div.ex2 keyframes myfirst2 25 50 100 webkit keyframes myf...
克卜勒行星運動第二定律在電子與原子核運動中的應用
克卜勒行星運動第二定律,也稱等面積定律,指的是太陽系中太陽和運動中的行星的連線 矢徑 在相等的時間內掃過相等的面積。其實你們會發現,電子繞著原子核轉,也是二次反比關係.也就是說,指的是電子核周圍,電子核和運動中的電子的連線 矢徑 在相等的時間內掃過相等的面積。同樣的,電子相對於電子核也具有 近地點 ...