public double velocity(CorpoCeleste origem, CorpoCeleste destino, double shipCurH) { double exitAlt = origem.alt + origem.soi; double v2 = Math.Sqrt(destino.parent.mu / exitAlt) * (Math.Sqrt((2 * destino.alt) / (exitAlt + destino.alt)) - 1); double r = origem.radius + shipCurH; double v = Math.Sqrt((r * (origem.soi * v2 * v2 - 2 * origem.mu) + 2 * origem.soi * origem.mu) / (r * origem.soi)); return (Math.Round(v * 100000) / 100); }
public double phaseAngle(CorpoCeleste origem, CorpoCeleste destino) { double th; double phase; //testar "destino.parent.mu ver se está calculando certo. th = Math.PI * Math.Sqrt(Math.Pow(origem.alt + destino.alt, 3) / (8 * destino.parent.mu)); phase = 180 - Math.Sqrt(destino.parent.mu / destino.alt) * (th / destino.alt) * (180 / Math.PI) % 360; return (Math.Round(phase * 100) / 100); }
public double ejectAngle(CorpoCeleste origem, CorpoCeleste destino, double shipCurH) { double exitAlt = origem.alt + origem.soi; double v2 = Math.Sqrt(destino.parent.mu / exitAlt) * (Math.Sqrt((2 * destino.alt) / (exitAlt + destino.alt)) - 1); double r = origem.radius + shipCurH; double v = Math.Sqrt((r * (origem.soi * v2 * v2 - 2 * origem.mu) + 2 * origem.soi * origem.mu) / (r * origem.soi)); double eta = v * v / 2 - origem.mu / r; double h = r * v; double e = Math.Sqrt(1 + ((2 * eta * h * h) / (origem.mu * origem.mu))); double eject = (180 - (Math.Acos(1 / e) * (180 / Math.PI))) % 360; if (e < 1) { // Credito a maltesh pela solucao para a transferencias de orbitas excentricas var a = -origem.mu / (2 * eta); var l = a * (1 - e * e); var nu = Math.Acos((l - origem.soi) / (e * origem.soi)); var phi = Math.Atan2((e * Math.Sin(nu)), (1 + e * Math.Cos(nu))); // credito a Kosmo-nots por arrumar a solucao de maltesh eject = (90 - (phi * 180 / Math.PI) + (nu * 180 / Math.PI)) % 360; } return (Math.Round(eject * 100) / 100); }