Beispiel #1
0
    public void OmegaUNoInclination()
    {
        const float  mass         = 1000f;
        GameObject   star         = TestSetupUtils.CreateNBody(mass, new Vector3(0, 0, 0));
        const float  orbitRadius  = 10f;
        GameObject   planet       = TestSetupUtils.CreatePlanetInOrbit(star, 1f, orbitRadius);
        OrbitEllipse orbitEllipse = planet.GetComponent <OrbitEllipse>();

        orbitEllipse.InitNBody(1f, 1f);

        orbitEllipse.ecc = 0.1f;

        // Try some values of om
        float[] omegaValues = { 0f, 30f, 45f, 60f, 90f, 135f, 180f, 210f, 320f };
        foreach (float omega in omegaValues)
        {
            orbitEllipse.omega_uc = omega;
            orbitEllipse.Init();
            orbitEllipse.ApplyScale(1f);
            orbitEllipse.InitNBody(1f, 1f);
            OrbitData od = new OrbitData();
            od.SetOrbitForVelocity(planet.GetComponent <NBody>(), star.GetComponent <NBody>());
            Debug.Log("omega = " + omega + " od.omega_lc=" + od.omega_lc);
            Assert.IsTrue(FloatEqual(omega, od.omega_lc, 0.4));
        }
    }
Beispiel #2
0
    // Check eccentricity and inclination
    public void CheckTestRV()
    {
        const float  mass         = 1000f;
        GameObject   star         = TestSetupUtils.CreateNBody(mass, new Vector3(0, 0, 0));
        const float  orbitRadius  = 10f;
        GameObject   planet       = TestSetupUtils.CreatePlanetInOrbit(star, 1f, orbitRadius);
        OrbitEllipse orbitEllipse = planet.GetComponent <OrbitEllipse>();

        orbitEllipse.ecc         = .25f;
        orbitEllipse.inclination = 25f;
        orbitEllipse.omega_uc    = 10f;
        orbitEllipse.omega_lc    = 20f;
        orbitEllipse.phase       = 190f;
        orbitEllipse.Init();
        orbitEllipse.ApplyScale(1f);
        orbitEllipse.InitNBody(1f, 1f);
        OrbitData od = new OrbitData();

        od.a           = orbitRadius;
        od.ecc         = 0.25f;
        od.inclination = 25f;
        od.omega_uc    = 10f;
        od.omega_lc    = 20f;
        od.phase       = 190f;
        TestRV(od, planet, star, orbitRadius);
    }
Beispiel #3
0
    public void OmegasEllipseInclination()
    {
        const float  mass         = 1000f;
        GameObject   star         = TestSetupUtils.CreateNBody(mass, new Vector3(0, 0, 0));
        const float  orbitRadius  = 10f;
        GameObject   planet       = TestSetupUtils.CreatePlanetInOrbit(star, 1f, orbitRadius);
        OrbitEllipse orbitEllipse = planet.GetComponent <OrbitEllipse>();

        orbitEllipse.InitNBody(1f, 1f);

        orbitEllipse.inclination = 35f;
        orbitEllipse.ecc         = 0.25f;
        orbitEllipse.Init();
        orbitEllipse.ApplyScale(1f);
        orbitEllipse.InitNBody(1f, 1f);

        // Try some values of om
        float[] omegaValues = { 0f, 30f, 45f, 60f, 90f, 135f, 180f };
        foreach (float omega in omegaValues)
        {
            orbitEllipse.omega_uc = omega;
            orbitEllipse.Init();
            orbitEllipse.InitNBody(1f, 1f);
            OrbitData od = new OrbitData();
            od.SetOrbitForVelocity(planet.GetComponent <NBody>(), star.GetComponent <NBody>());
            TestRV(od, planet, star, orbitRadius);
        }
    }
Beispiel #4
0
    public void CirclePhaseOmegaInclined()
    {
        const float  mass         = 1000f;
        GameObject   star         = TestSetupUtils.CreateNBody(mass, new Vector3(0, 0, 0));
        const float  orbitRadius  = 10f;
        GameObject   planet       = TestSetupUtils.CreatePlanetInOrbit(star, 1f, orbitRadius);
        OrbitEllipse orbitEllipse = planet.GetComponent <OrbitEllipse>();

        orbitEllipse.inclination = 20f;

        // Try some values of phase
        float[] phaseValues  = { 0f, 30f, 45f, 60f, 90f, 135f, 180f, 210f, 320f };
        float[] omegaUValues = { 0f, 30f, 45f, 60f, 90f, 135f, 180f, 210f, 320f };
        foreach (float phase in phaseValues)
        {
            foreach (float omegau in omegaUValues)
            {
                orbitEllipse.phase    = phase;
                orbitEllipse.omega_uc = omegau;
                orbitEllipse.Init();
                orbitEllipse.ApplyScale(1f);
                orbitEllipse.InitNBody(1f, 1f);
                orbitEllipse.Log("Initial circle:");
                OrbitData od = new OrbitData();
                od.SetOrbitForVelocity(planet.GetComponent <NBody>(), star.GetComponent <NBody>());
                Debug.Log("TEST: phase = " + phase + " od.phase=" + od.phase +
                          " omegaU = " + omegau + " od.omegau=" + od.omega_uc);
                TestRV(od, planet, star, orbitRadius);
            }
        }
    }
Beispiel #5
0
    public void PhaseRetrogradeEllipse()
    {
        const float  mass         = 1000f;
        GameObject   star         = TestSetupUtils.CreateNBody(mass, new Vector3(0, 0, 0));
        const float  orbitRadius  = 10f;
        GameObject   planet       = TestSetupUtils.CreatePlanetInOrbit(star, 1f, orbitRadius);
        OrbitEllipse orbitEllipse = planet.GetComponent <OrbitEllipse>();

        orbitEllipse.ecc         = 0.4f;
        orbitEllipse.inclination = 180f;

        // Try some values of om
        float[] phaseValues = { 30f, 45f, 60f, 90f, 135f, 180f, 0f };
        foreach (float phase in phaseValues)
        {
            orbitEllipse.phase = phase;
            orbitEllipse.Init();
            orbitEllipse.ApplyScale(1f);
            orbitEllipse.InitNBody(1f, 1f);
            OrbitData od = new OrbitData();
            od.SetOrbitForVelocity(planet.GetComponent <NBody>(), star.GetComponent <NBody>());
            Debug.Log("phase = " + phase + " od.phase=" + od.phase);
            // Need a bit of leeway at 0 with error
            Assert.IsTrue(FloatEqual(phase, od.phase, 0.02));
            TestRV(od, planet, star, orbitRadius);
        }
    }
    public void OmegaULEllipseInclined()
    {
        const float  mass         = 1000f;
        GameObject   star         = TestSetupUtils.CreateNBody(mass, new Vector3(0, 0, 0));
        const float  orbitRadius  = 10f;
        GameObject   planet       = TestSetupUtils.CreatePlanetInOrbit(star, 1f, orbitRadius);
        OrbitEllipse orbitEllipse = planet.GetComponent <OrbitEllipse>();

        orbitEllipse.InitNBody(1f, 1f);

        orbitEllipse.inclination = 30f;
        orbitEllipse.ecc         = 0.2f;
        orbitEllipse.Init();
        orbitEllipse.ApplyScale(1f);
        orbitEllipse.InitNBody(1f, 1f);

        // Try some values of om
        float[] omegaUValues = { 0f, 30f, 45f, 60f, 90f, 135f, 180f, 210f, 310f };
        float[] omegaLValues = { 0f, 30f, 45f, 60f, 90f, 135f, 180f, 210f, 310f };
        foreach (float omegaU in omegaUValues)
        {
            foreach (float omegaL in omegaLValues)
            {
                orbitEllipse.omega_uc = omegaU;
                orbitEllipse.omega_lc = omegaL;
                TestSetupUtils.SetupGravityEngine(star, planet);

                orbitEllipse.Log("OmegaUL inclined:");
                OrbitData od = new OrbitData();
                od.SetOrbitForVelocity(planet.GetComponent <NBody>(), star.GetComponent <NBody>());
                Debug.Log("omegaU = " + omegaU + "omegaL = " + omegaL + " OD:=" + od.LogString());
                TestRV(od, planet, star, orbitRadius);
            }
        }
    }
Beispiel #7
0
    public override void OnInspectorGUI()
    {
        GUI.changed = false;
        OrbitEllipse orbit = (OrbitEllipse)target;

        OrbitEllipse.evolveType evolveMode = orbit.evolveMode;

        evolveMode = (OrbitEllipse.evolveType)EditorGUILayout.EnumPopup(new GUIContent("Evolve Mode", modeTip), orbit.evolveMode);

        if (GUI.changed)
        {
            Undo.RecordObject(orbit, "OrbitEllipse Change");
            orbit.evolveMode = evolveMode;
            EditorUtility.SetDirty(orbit);
        }
        base.OnInspectorGUI();

        // Display the Hill Radius as a guide for where to place moons...
        float r_hill = 0;

        if (orbit.GetCenterObject() != null)
        {
            r_hill = OrbitUtils.HillRadius(orbit.GetCenterObject(), orbit.transform.gameObject);
        }
        EditorGUILayout.LabelField(new GUIContent(string.Format("Hill Radius:  {0}", r_hill), hillTip));
        // EditorGUILayout.LabelField(new GUIContent(string.Format("Orbit Period: {0}", orbit.GetPeriod()), periodTip));

        if (axisUpdated)
        {
            orbit.ApplyScale(GravityEngine.Instance().GetLengthScale());
        }
    }
Beispiel #8
0
    // Create a planet in orbit around center object with semi-major axis a
    public static GameObject CreatePlanetInOrbit(GameObject center, float mass, float a)
    {
        // position will be trumped by orbit
        GameObject planet = CreateNBody(mass, new Vector3(1, 0, 0));

        OrbitEllipse orbitEllipse = planet.AddComponent <OrbitEllipse>();

        orbitEllipse.a = a;
        orbitEllipse.SetCenterBody(center);
        orbitEllipse.ApplyScale(1f);
        orbitEllipse.InitNBody(1f, 1f);
        return(planet);
    }
Beispiel #9
0
    private void TestRV(OrbitData od, GameObject planet, GameObject star, float orbitRadius)
    {
        Vector3 r_initial = planet.transform.position;
        Vector3 v_initial = planet.GetComponent <NBody>().vel;

        GameObject   testPlanet  = TestSetupUtils.CreatePlanetInOrbit(star, 1f, orbitRadius);
        OrbitEllipse testEllipse = testPlanet.GetComponent <OrbitEllipse>();

        testEllipse.InitFromOrbitData(od);
        testEllipse.ApplyScale(1f);
        testEllipse.Init();
        testEllipse.InitNBody(1f, 1f);
        Vector3 r = testPlanet.transform.position;
        Vector3 v = testPlanet.GetComponent <NBody>().vel;

        Debug.Log(" r_i=" + r_initial + " r=" + r + " delta=" + Vector3.Distance(r_initial, r));
        Debug.Log(" v_i=" + v_initial + " v=" + v + " delta=" + Vector3.Distance(v_initial, v));
        Assert.IsTrue(FloatEqual(Vector3.Distance(r_initial, r), 0f, 1E-2));
        Assert.IsTrue(FloatEqual(Vector3.Distance(v_initial, v), 0f, 1E-2));
    }
Beispiel #10
0
    // Check eccetricity and inclination
    public void EllipseInclination()
    {
        const float  mass         = 1000f;
        GameObject   star         = TestSetupUtils.CreateNBody(mass, new Vector3(0, 0, 0));
        const float  orbitRadius  = 10f;
        GameObject   planet       = TestSetupUtils.CreatePlanetInOrbit(star, 1f, orbitRadius);
        OrbitEllipse orbitEllipse = planet.GetComponent <OrbitEllipse>();

        orbitEllipse.InitNBody(1f, 1f);

        float eccentricity = 0.3f;

        orbitEllipse.ecc = eccentricity;
        orbitEllipse.Init();
        orbitEllipse.ApplyScale(1f);
        orbitEllipse.InitNBody(1f, 1f);
        // take the velocity and check
        OrbitData orbitData = new OrbitData();

        orbitData.SetOrbitForVelocity(planet.GetComponent <NBody>(), star.GetComponent <NBody>());
        Assert.IsTrue(FloatEqual(orbitRadius, orbitData.a));
        Assert.IsTrue(FloatEqual(eccentricity, orbitData.ecc));

        // Try some values of inclination
        float[] inclinationValues = { 0f, 30f, 45f, 60f, 90f, 135f, 180f };
        foreach (float inc in inclinationValues)
        {
            orbitEllipse.inclination = inc;
            orbitEllipse.Init();
            orbitEllipse.InitNBody(1f, 1f);
            OrbitData od = new OrbitData();
            od.SetOrbitForVelocity(planet.GetComponent <NBody>(), star.GetComponent <NBody>());
            Debug.Log("TEST: incl = " + inc + " od.inclination=" + od.inclination);
            Assert.IsTrue(FloatEqual(inc, od.inclination));
            TestRV(od, planet, star, orbitRadius);
        }
    }