def findTerminalThrust(): # above the top of the atmosphere, there is no limit! if alt >= TOA: return 1e30 v_term = planet.terminalVelocity(alt, dragCoefficient) a = timestep * timestep v_noTX = v_nothrust[0] * cos(phi) + v_nothrust[1] * sin(phi) b = 2 * timestep * v_noTX c = v_noTX - v_term * v_term soln = physics.quadratic(a,b,c) return max(soln)
def determineOrbit(self, h, velocity): """ Given distance from the planet's core, and current velocity vector, return the apsides in meters from the planet's core. If one of them is negative, the orbit is hyperbolic. h is in meters relative to the core velocity is in polar coordinates (m/s, radians) where the angle is relative to the tangent to the surface. """ # http://forum.kerbalspaceprogram.com/showthread.php/36178-How-to-predict-my-apoapsis-given-altitude-and-velocity # Plugging in Horn Brain's derivation (which is the same as Jason # Patterson's, but seems a bit easier to follow): # We use two equations, twice each: # vis viva: v^2 = mu (2/r - 1/a) where a is the semimajor axis # momentum: p = r v cos(theta) where theta is the angle of v to # the surface tangent. # Momentum is preserved, so p is the same value at all points of # the orbit. # # Steps: # 1. vis viva with r=h, v=v, solve for 1/a. # 2. momentum from the parameters: p = rv cos theta # 3. momentum at the apses to relate r_apsis and v_apsis # 4. vis viva with r being the apses. # Substitue 1/a from before, and substitute v_apsis from # momentum. # 5. Solve quadratic equation: # 0 = (1/a) r_apsis^2 - 2 r_apsis + p^2 / mu # # We get two solutions, which are the apoapsis and periapsis # (measured from the center of the planet), in that order. # (v, theta) = velocity ainv = (2 / h) - (v*v / self.mu) p = h * v * cos(theta) return quadratic(ainv, -2, p*p / self.mu)