这次呢,主要是解决上次遗留的问题之一:行星运动
行星运动参数方程
为了找这个行星运动方程,我翻遍了各个百科的角落旮旯,终于在果壳的某个回答里找到了答案。
注意其中的 e 不是自然常熟而是偏心率,也就是焦距 / 半长轴。
大道至简啊,不过这个公式依旧不好用,想知道任意 t 时刻的r必须先求出参数 ξ 。不过我们可以用二分法来求这个参数,然后就可以求出 t 时刻的r和v了
时间参数方程
这个函数输入弧度,也就是参数 ξ 就可以求出对应的 t ,注意这两个量都是全域的,但我们稍后需要限制一下。
//以弧度为参数的时间方程
private float Rad2Time(float rad)
{
return w * Mathf.Sqrt(w / GM) * (rad - f / w * Mathf.Sin(rad));
}
二分法求角度
这是一个利用二分递归求弧度的函数,弧度限制在 l 和 r 之间,精度为0.00001。
//用二分法求弧度,输入时间,输出弧度
private float Dichotomy(float l, float r, float time)
{
if (r - l < 0.00001) return l;
float ltime = Rad2Time(l * Mathf.Deg2Rad);
float rtime = Rad2Time(r * Mathf.Deg2Rad);
float mtime = Rad2Time((l + r) / 2 * Mathf.Deg2Rad);
if((ltime - mtime) * (time - mtime) >= 0)
return Dichotomy