public void KeplerVsTimeOfFlight() { // Need to make sure TOF < 1 period const float mass = 100f; GameObject star = TestSetupUtils.CreateNBody(mass, new Vector3(0, 0, 0)); NBody starNbody = star.GetComponent <NBody>(); const float orbitRadius = 10f; GameObject planet = TestSetupUtils.CreatePlanetInOrbitUniversal(starNbody, 1f, orbitRadius); OrbitUniversal orbitU = planet.GetComponent <OrbitUniversal>(); // Parabola (ecc=1.0 fails, need to investigate) float[] ecc_values = { 0.0f, 0.1f, 0.5f, 0.9f, 1.2f, 1.5f }; foreach (float ecc in ecc_values) { Debug.LogFormat("======= ecc={0} =======", ecc); orbitU.eccentricity = ecc; orbitU.p = 10f; orbitU.evolveMode = OrbitUniversal.EvolveMode.KEPLERS_EQN; // Evolve to position r1 double time = 5.0; TestSetupUtils.SetupGravityEngine(star, planet); double[] r1 = new double[] { 0, 0, 0 }; // orbitU.PreEvolve(pscale, mscale); // Ugh. Need to do this before call evolve, since it caches the value. Vector3d r0_vec = GravityEngine.Instance().GetPositionDoubleV3(planet.GetComponent <NBody>()); orbitU.Evolve(time, ref r1); Vector3d r1_vec = new Vector3d(ref r1); // check time to r1 double time_test = orbitU.TimeOfFlight(r0_vec, r1_vec); Debug.LogFormat("check r0={0} to r1={1} p ={2} after t={3} TOF => {4}", r0_vec, r1_vec, orbitU.p, time, time_test); Assert.IsTrue(GEUnit.DoubleEqual(time, time_test, 1E-4)); } }
private void DoTestForPhase(double fromPhase, double toPhase) { const float mass = 1000f; const bool reverse = false; GameObject star = TestSetupUtils.CreateNBody(mass, new Vector3(0, 0, 0)); NBody starNbody = star.GetComponent <NBody>(); float orbitRadius = 20f; GameObject planet = TestSetupUtils.CreatePlanetInOrbitUniversal(starNbody, 0f, orbitRadius); OrbitUniversal orbitU = planet.GetComponent <OrbitUniversal>(); orbitU.phase = fromPhase; orbitU.SetMajorAxisInspector(orbitRadius); orbitRadius = 30.0f; GameObject planet2 = TestSetupUtils.CreatePlanetInOrbitUniversal(starNbody, 0f, orbitRadius); OrbitUniversal orbitU2 = planet2.GetComponent <OrbitUniversal>(); orbitU2.phase = toPhase; orbitU2.SetMajorAxisInspector(orbitRadius); GravityEngine.Instance().UnitTestAwake(); GravityEngine.Instance().AddBody(star); GravityEngine.Instance().AddBody(planet); GravityEngine.Instance().AddBody(planet2); GravityEngine.Instance().Setup(); Debug.Log("Find transfers"); OrbitData fromOrbit = new OrbitData(orbitU); OrbitData toOrbit = new OrbitData(orbitU2); LambertUniversal lambertU = new LambertUniversal(fromOrbit, toOrbit, true); Assert.AreNotEqual(lambertU, null); double time = 0.8f * lambertU.GetTMin(); lambertU.ComputeXfer(reverse, false, 0, time); LambertBattin lambertB = new LambertBattin(fromOrbit, toOrbit); int error = lambertB.ComputeXfer(reverse, false, 0, time); Assert.AreEqual(error, 0); Assert.AreNotEqual(lambertB, null); Assert.AreNotEqual(lambertB.GetTransferVelocity(), null); Debug.LogFormat("initial velocity {0} vs {1}", lambertU.GetTransferVelocity(), lambertB.GetTransferVelocity()); Debug.LogFormat("initial velocity mag {0} vs {1}", lambertU.GetTransferVelocity().magnitude, lambertB.GetTransferVelocity().magnitude); Debug.LogFormat("final velocity {0} vs {1}", lambertU.GetFinalVelocity(), lambertB.GetFinalVelocity()); Debug.LogFormat("final velocity mag {0} vs {1}", lambertU.GetFinalVelocity().magnitude, lambertB.GetFinalVelocity().magnitude); // best can do for 180 degree case is E-2 accuracy on the magnitude. Not sure why...seems too big Assert.IsTrue(GEUnit.DoubleEqual(lambertU.GetTransferVelocity().magnitude, lambertB.GetTransferVelocity().magnitude, 1E-2)); }