def flyby_height_objective(periapsis, *params): aIn, aOut, deltaAngle, body = params eccIn = 1 - periapsis / aIn eccOut = 1 - periapsis / aOut inOrb = Orbit(aIn, eccIn, 0, 0, 0, 0, 0, body) outOrb = Orbit(aOut, eccOut, 0, 0, 0, 0, 0, body) deltaIn = inOrb.get_flight_angle_at_soi() deltaOut = outOrb.get_flight_angle_at_soi() return abs(deltaAngle - deltaIn - deltaOut)
def get_flyby_orbit(a, ecc, body, inOutDir, nDir, isOut=False): periapsis = a * (1 - ecc) tempOrb = Orbit(a, ecc, 0, 0, 0, 0, 0, body) delta = tempOrb.get_flight_angle_at_soi(isOut) rpDir = rodrigues_rotate(inOutDir, nDir, delta) vpDir = cross(nDir, rpDir) rp = rpDir * periapsis vp = vpDir * math.sqrt(body.mu * (2 / periapsis - 1 / a)) return Orbit.from_state_vector(rp, vp, 0, body)