Tôi đã tính toán sự bất thường thực sự là hàm của thời gian, đối với chuyển động hành tinh, theo c #, theo cách này:
Tính toán bất thường trung bình (thời gian: thời gian hiện tại, G: newton grav.connstant, M: khối lượng hành tinh hoặc tổng của hai vật thể quay quanh, a: trục bán chính)
//M = nt
double n = Math.Sqrt((G * (M)) / (a * a * a));
double Mt = n * time;
Tính toán dị thường E lệch tâm bằng cách giải phương trình Kepler:
//For orbits with ε > 0.8, an initial value of E0 = π should be used.
if (eccentr>0.8)
E = NumApprox(150, Math.PI,Mt, 10E-15);
else
E = NumApprox(150, Mt, Mt, 10E-15);
dị thường thật (góc)
true_anom = 2.0 * Math.Atan2 (Math.Sqrt (1.0 + eccentr) * Math.Sin (E / 2.0), Math.Sqrt (1.0 - eccentr) * Math.Cos (E / 2.0));
khoảng cách từ hành tinh
d = a * ((1.0 - eccentr * eccentr) / (1.0 + eccentr * Math.Cos (true_anom)));
Cuối cùng xấp xỉ số của bài toán nghịch đảo :
private double NumApprox(int intr, double prev,double Mt, double err)
{
double ret = prev;
double retprev = prev;
for (int i=0 ; i<intr; i++){
retprev = ret;
ret = ret - (ret - eccentr * Math.Sin(ret) - Mt) / (1.0 - eccentr * Math.Cos(ret));
if ( Math.Abs(ret - retprev) < err)
break;
}
return ret;
}
EDIT: tính toán vị trí và vận tốc
Những gì chúng tôi đã làm là một nửa công việc trong việc lấy các yếu tố quỹ đạo Cartesain từ các yếu tố quỹ đạo kepler trong đó:
//some kepler Orbit Elements:
public double d;
public double true_anom;
public double eccentr;
public double a;
public double E;
public double w=0; //small omega ω : Argument of periapsis (in rad)
//Cartesain Orbit Elements:
//Position Vector
private double x;
private double y;
private double z; //2d :not used
//Velocity Vector
private double vx;
private double vy;
private double vz; //2d :not used
là bước cuối cùng, chúng ta có thể tính toán các vectơ vị trí và vận tốc như:
//Position
x = d * Math.Cos(true_anom);
y = d * Math.Sin(true_anom);
//apply ω
double xx = x * Math.Cos(w) - y * Math.Sin(w);
double yy = x * Math.Sin(w) + y * Math.Cos(w);
x = xx;
y = yy;
//Velocity
double v = Math.Sqrt(G * M * a) / d;
vx = -v * Math.Sin(E);
vy = -v * Math.Sqrt(1.0-eccentr*eccentr) * Math.Cos(E);
EDIT: tài liệu tham khảo
Yếu tố quỹ đạo
Phương trình của Kepler
Bất thường thật
Vectơ lệch tâm
Luận cứ về bệnh hoạn
Phương pháp của Newton cho phép tính gần đúng số
Chương trình Vật lý Vật lý của Chương trình Không gian Kerbal (KSP) (pdf)
game-design
vàgame-mechanics
. Là dạng đóng này thực sự cần thiết cho một mô phỏng cấp trò chơi, và nó tương tác với trò chơi như thế nào?