Exemple #1
0
        public Form1()
        {

            planet = new Planet(0, 9.81, 67000, new VRageMath.Vector3D(0, 0, 0));

            orbit2 = new Orbit(new VRageMath.Vector3D(100000, 0, 0), new VRageMath.Vector3D(0, planet.GetOrbitalVelocity(100000, (100000 + 100000) / 2), 0), planet);
            orbit = new Orbit(new VRageMath.Vector3D(0, 140000, 0), new VRageMath.Vector3D(-planet.GetOrbitalVelocity(140000, (100000 + 140000) / 2), 0, 0), planet);
            //Console.WriteLine(planet.GetOrbitalVelocity(2000000,1035000));
            epoc = orbit.epoch;
            Console.WriteLine(planet.GetOrbitalVelocity(100000, (100000 + 100000) / 2));
            man = (Maneuver.GetHohmannTransfer (orbit, orbit2, orbit.TrueAnomaly2(0)));

            InitializeComponent();
        }
Exemple #2
0
        private void chart1_Click(object sender, EventArgs e)

        {
           // Console.WriteLine(orbit2.FindInterceptPoint(orbit));
            Chart chart = sender as Chart;
            // = form.getChart();
            chart.Series.Clear(); //ensure that the chart is empty
            chart.Series.Add("Series0");
            chart.Series.Add("Series1");
            chart.Series.Add("Series2");
            chart.Series.Add("Series3");
            chart.Series.Add("Series4");
            chart.Series.Add("Series5");
            chart.Series[0].ChartType = SeriesChartType.Line;
            chart.Series[1].ChartType = SeriesChartType.Line;
            chart.Series[2].ChartType = SeriesChartType.Line;
            chart.Series[3].ChartType = SeriesChartType.Line;
            chart.Series[4].ChartType = SeriesChartType.Line;
            chart.Series[5].ChartType = SeriesChartType.Line;
            chart.Legends.Clear();

            //Trajectory traj = new Trajectory(planet, new VRageMath.Vector3D(0, 70000, 0), new VRageMath.Vector3D(-planet.GetOrbitalVelocity(70000, (70000 + 2000000) / 2), 0, 0));

            Console.WriteLine("Orbit 1: "+orbit.ToString1(poo));
            Console.WriteLine("Orbit 2: " + orbit2.ToString1(poo));

            //Maneuver man2 = Maneuver.GetHohmannTransfer(orbit2, orbit, orbit2.TrueAnomaly2(poo));
            //orbit.KepToCart(out poos, out vol,poo);
            //orbit2.KepToCart(out poos1, out vol1, poo);
           // poos.Normalize();
            //Console.WriteLine(orbit.TrueAnomalyAtPosition(poos)+" "+orbit.TrueAnomaly2(poo));
            //Console.WriteLine("Orbit 1"+poos+" "+vol);
            //Console.WriteLine("Ascending Node: "+orbit.AscendingNodeTrueAnomaly(orbit2));
            DateTime temp = epoc;
            
            orbit.KepToCartAtTrueAnomaly(out poos1, out vol1, man.TrueAnomaly);
            if (first)
            {
                poo = 0;
                poo2 = 0;
                orbit2.KepToCart(out poos, out vol, orbit.TimeOfTrueAnomaly(man.TrueAnomaly));
                orbit2.SetEpoch(temp.AddSeconds(orbit.TimeOfTrueAnomaly(man.TrueAnomaly)));
                first = false;
            }
            else
            {
                orbit2.KepToCart(out poos, out vol, 0);
            }
            int r = 0;
            double er = orbit.a > orbit2.a ? orbit.a*2 : orbit2.a*2;
            chart.Series[2].Points.AddXY(-er, -er);
            chart.Series[2].Points.AddXY(er, er);
            chart.Series[1].Points.AddXY(0, 0);
            chart.Series[2].Points.AddXY(poos.GetDim(0),poos.GetDim(1) );
            chart.Series[2].Points.AddXY(poos1.GetDim(0), poos1.GetDim(1));
            Orbit orbit1 = new Orbit(poos1, vol1 + (man.velocity * man.direction), planet);
            Console.WriteLine("Maneuver Details: " + "Direction: "+man.direction+" DeltaV: "+man.velocity+" True Anomaly: "+man.TrueAnomaly);
            Console.WriteLine("Real True Anomaly: " + orbit.TrueAnomaly2(poo) + " Current Time: " + poo + " Calculated Time: " + orbit.TimeOfTrueAnomaly(orbit.TrueAnomaly2(poo))+" Period: "+orbit.Period);
            
           

            

            
            Console.WriteLine("Closest Approach: " + orbit1.NextClosestApproachDistance(orbit2,poo));

            orbit1.KepToCart(out poos1, out vol1, poo);

            orbit2.KepToCart(out poos, out vol, poo);

           // Console.WriteLine(Planet.GetPlanetCenter(new Vector3D(-120000, 0, 0), new Vector3D(1, 0, 0), new Vector3D(0, 120000, 0), new Vector3D(0, -1, 0)));
            //Console.WriteLine(planet.Mass+" "+Planet.GetPlanetMass(new Vector3D(0,0,0),new Vector3D(67000,0,0),9.81));
 
            for (int x = 0; x < 360; x++)
            {
                double i=x * (Math.PI / (double)180);
                chart.Series[1].Points.AddXY(Math.Sin(i)*60000, Math.Cos(i)*60000);
            }
            for (int x = 0; x < 360; x++)
            {
                double i = x * (Math.PI / (double)180);
                chart.Series[4].Points.AddXY(Math.Sin(i) * 5000 + poos.GetDim(0), Math.Cos(i) * 5000 + poos.GetDim(1));
            }
            for (int x = 0; x < 360; x++)
            {
                double i = x * (Math.PI / (double)180);
                chart.Series[5].Points.AddXY(Math.Sin(i) * 5000 + poos1.GetDim(0), Math.Cos(i) * 5000 + poos1.GetDim(1));
            }
                while (true)
                {
                    //traj.Step();

                   // orbit2.KepToCart(out poos1, out vol1, r * 10);
                    orbit1.KepToCart(out poos, out vol, r * 10);

                   // Console.WriteLine(poos + " " + vol);
                    //Console.WriteLine(poos+" "+orbit.ToString1(r*10));
                    chart.Series[0].Points.AddXY(poos.GetDim(0),poos.GetDim(1));
                    //chart.Series[2].Points.AddXY(poos1.GetDim(0), poos1.GetDim(1));
                   // chart.Series[2].Points.AddXY(traj.pos.GetDim(0), traj.pos.GetDim(1));
                    r++;
                    if (r > 5000)
                    {
                        break;
                    }
                }
                r = 0;
                while (true)
                {
                    //traj.Step();

                    orbit2.KepToCart(out poos1, out vol1, r * 10);
                   // orbit.KepToCart(out poos, out vol, r * 10);
                    // Console.WriteLine(poos);
                    //chart.Series[0].Points.AddXY(poos.GetDim(0), poos.GetDim(1));
                    chart.Series[3].Points.AddXY(poos1.GetDim(0), poos1.GetDim(1));
                    // chart.Series[2].Points.AddXY(traj.pos.GetDim(0), traj.pos.GetDim(1));
                    r++;
                    if (r > 10000)
                    {
                        break;
                    }
                }
                poo += 100;
                poo2 = Math.Floor(poo/orbit1.Period);
        }
Exemple #3
0
        public static Maneuver GetPhasingManeuver(Orbit orbit1,Orbit orbit2)
        {
            double h1 = Math.Sqrt(orbit1.planet.u*orbit1.a*(1-Math.Pow(orbit1.e,2)));

            Vector3D pos1;
            Vector3D vel1;
            Vector3D pos2;
            Vector3D vel2;
            DateTime now = DateTime.Now;//orbit1.FindInterceptPoint(orbit2);
            orbit1.KepToCart(out pos1, out vel1, now.Second);
            orbit2.KepToCart(out pos2, out vel2, now.Second);
            pos1.Normalize();
            pos2.Normalize();

            double ang = Math.Acos(Vector3D.Dot(pos1, pos2));
            double E = 2*Math.Atan(Math.Sqrt((1-orbit1.e)/(1+orbit1.e))*Math.Tan(ang/2));
            double t = (orbit1.Period/(Math.PI*2))*(E-orbit1.e*Math.Sin(E));
            double T = orbit1.Period - t;
            double a = Math.Pow((Math.Sqrt(orbit1.planet.u)*T)/(2*Math.PI),(2.0/3.0));
            orbit1.KepToCart(out pos1, out vel1, now.Second);
            orbit2.KepToCart(out pos2, out vel2, now.Second);
            double rp = pos1.Length();
            double ra = 2*a-rp;
            double h2 = Math.Sqrt(2 * orbit1.planet.u) * Math.Sqrt(Math.Abs(ra-rp)/(ra+rp));
            MatrixD directions = GetDirections(pos1, vel1);
            Vector3D dir = new Vector3D(0, 0, 1);
            dir = Vector3D.Transform(dir, directions);

            double deltaV = h1 / pos1.Length() - h2 / pos1.Length();

            return new Maneuver(now,dir,deltaV);
        }
Exemple #4
0
 public static Maneuver GetPlaneMatch(Orbit orbit1, Orbit orbit2,double t)
 {
     Vector3D pos1;
     Vector3D vel1;
     orbit1.KepToCartAtTrueAnomaly(out pos1, out vel1, t);
     double dI=orbit1.I-orbit2.I;
     double deltaV=(2*Math.Sin(dI/2)*Math.Sqrt(1-Math.Pow(orbit1.e,2))*Math.Cos(orbit1.w+t)*orbit1.n*orbit1.a)/(1+orbit1.e*Math.Cos(t));
     double V= orbit1.AscendingNodeTrueAnomaly(orbit2);
     MatrixD directions = GetDirections(pos1, vel1);
     Vector3D dir = new Vector3D(0, 1, 0);
     dir = Vector3D.Transform(dir, directions);
     return new Maneuver(V,dir,deltaV);
 }
Exemple #5
0
        public static Maneuver GetHohmannTransfer(Orbit orbit1,Orbit orbit2,double t) {
            Vector3D pos1;
            Vector3D vel1;
            Vector3D pos2;
            Vector3D vel2;
            double now = 0;
            double deltaV=0;
            double TransferTime = Math.PI * Math.Sqrt(Math.Pow((orbit1.a + orbit2.a), 3) / (8 * orbit1.planet.u));
            double h2 = Math.Sqrt(orbit1.planet.u/Math.Pow(orbit2.a,3));
            double angle = Orbit.RadtoDeg(Math.PI - h2 * TransferTime);
            bool test = true;
            Vector3D dir = new Vector3D(0,0,-1);
            //for (int k = 0; k < 6; k++) {
                if (test == false)
                {
                    //break;
                }
                for (int i = (int)t; i < t + 36000; i++)
                {

                    orbit1.KepToCartAtTrueAnomaly(out pos1, out vel1, Orbit.DegtoRad(i));
                    orbit2.KepToCartAtTrueAnomaly(out pos2, out vel2, Orbit.DegtoRad(i));
                    pos1.Normalize();
                    pos2.Normalize();
                    double ang = Orbit.RadtoDeg(orbit1.GetPhaseAngleTrueAnomaly(orbit2, Orbit.DegtoRad(i)));


                    if (ang <= angle + 1 && ang >= angle - 1)
                    {
                        now = i;
                       // if (k >= 4)
                        //{
                            MatrixD directions = GetDirections(pos1, vel1);
                            dir = Vector3D.Transform(dir, directions);
                       // }
                        orbit1.KepToCartAtTrueAnomaly(out pos1, out vel1, Orbit.DegtoRad(i));
                        orbit2.KepToCart(out pos2, out vel2, orbit1.TimeOfTrueAnomaly(Orbit.DegtoRad(i)) + TransferTime);
                        double r1 = pos1.Length();
                        double r2 = pos2.Length();
                        deltaV = orbit1.planet.GetOrbitalVelocity(r1, (r1 + r2) / 2) - (vel1.Length()); //Math.Sqrt(orbit1.planet.u / r1) * (Math.Sqrt((2 * r2) / (r2 + r1)) - 1);
                        TransferTime = Math.PI * Math.Sqrt(Math.Pow((r1 + r2), 3) / (8 * orbit1.planet.u));
                        angle = Orbit.RadtoDeg(Math.PI - h2 * TransferTime);
                        test = false;
                        break;
                    }

                }
               // }

            //Console.WriteLine(angle + " Found ang");
            Maneuver man = new Maneuver(Orbit.DegtoRad(now), dir, deltaV);
            return man;
            
        }
Exemple #6
0
 public static Maneuver CircularizeAtApoapsis(Orbit a,double t)
 {
     double aoapsisHeight = Math.Sqrt(((1-a.e)*a.planet.u)/((1+a.e)*a.a));
     Vector3D pos;
     Vector3D vel;
     a.KepToCartAtTrueAnomaly(out pos,out vel, a.lastTa);
     pos=-pos;
     Vector3D dir = new Vector3D(0,0,-1);
     double apoapsisTa=a.TrueAnomalyAtPosition(pos);
     double deltaV = a.planet.GetOrbitalVelocity(aoapsisHeight,aoapsisHeight );
     MatrixD directions = GetDirections(pos, vel);
     dir = Vector3D.Transform(dir, directions);
     return new Maneuver(apoapsisTa,dir,deltaV);
 }
Exemple #7
0
        public double NextClosestApproachTime(Orbit b, double UT)
        {
            Vector3D pos1;
            Vector3D vel1;
            Vector3D pos2;
            Vector3D vel2;
            KepToCart(out pos1, out vel1, UT);
            b.KepToCart(out pos2, out vel2, UT);
            double closestApproachTime = UT;
            double closestApproachDistance = Double.MaxValue;
            double minTime = UT;
            double interval = Period;
            if (e > 1)
            {
               // interval = 100 / ((2*Math.PI)/Period); //this should be an interval of time that covers a large chunk of the hyperbolic arc
            }
            double maxTime =UT+ interval;
            const int numDivisions = 20;

            for (int iter = 0; iter < 10; iter++)
            {
                double dt = (maxTime - minTime) / numDivisions;
                for (int i = 0; i < numDivisions; i++)
                {
                    double t = minTime + i * dt;
                    KepToCart(out pos1, out vel1, t);
                    b.KepToCart(out pos2, out vel2, t);
                    double distance = Vector3D.Distance(pos1,pos2);
                    if (distance < closestApproachDistance)
                    {
                        closestApproachDistance = distance;
                        closestApproachTime = t;
                    }

                }
                minTime = MathHelper.Clamp(closestApproachTime - dt, UT, UT + interval);
                maxTime = MathHelper.Clamp(closestApproachTime + dt, UT, UT + interval);
                
            }

            return closestApproachTime;
        }
Exemple #8
0
        public double DescendingNodeTrueAnomaly(Orbit b)
        {
            Vector3D an = Vector3D.Cross(NormalVector(), b.NormalVector());

            return (TrueAnomalyAtPosition(-an));
        }
Exemple #9
0
 public double NextClosestApproachDistance( Orbit b, double UT)
 {
     Vector3D pos1;
     Vector3D vel1;
     Vector3D pos2;
     Vector3D vel2;
     KepToCart(out pos1, out vel1, NextClosestApproachTime(b, UT));
     b.KepToCart(out pos2, out vel2, b.NextClosestApproachTime(this,UT));
     return Vector3D.Distance(pos1,pos2);
 }
Exemple #10
0
 public double GetPhaseAngleTrueAnomaly(Orbit a, double t)
 {
     Vector3D n = NormalVector();
     Vector3D pos1;
     Vector3D vel1;
     Vector3D pos2;
     Vector3D vel2;
     KepToCartAtTrueAnomaly(out pos1, out vel1, t);
     a.KepToCart(out pos2, out vel2, TimeOfTrueAnomaly(t));
     pos2 = pos2 - (n * Vector3D.Dot(pos2, n));
     double r1 = pos1.Length();
     double r2 = pos2.Length();
     double phaseAngle = Math.Acos(Vector3D.Dot(pos1, pos2) / (r1 * r2));
     if (Vector3D.Dot(Vector3D.Cross(pos1, pos2), n) < 0)
     {
         phaseAngle = 2 * Math.PI - phaseAngle;
     }
     if (a.a < this.a)
     {
         phaseAngle = phaseAngle - 2 * Math.PI;
     }
     return phaseAngle;
 }
Exemple #11
0
 public double FindInterceptPoint(Orbit orbit)
 {
     DateTime now = DateTime.Now;
     Vector3D orbitP;
     Vector3D orbitV;
     Vector3D myP;
     Vector3D myV;
     double lastDist=1000000000000000;
     for (int i = 0; i <= Period; i++)
     {
         KepToCart(out orbitP, out orbitV,i);
         orbit.KepToCart(out myP,out myV,i);
         double d = Vector3D.Distance(myP,orbitP);
         if (d > lastDist)
         {
             return (lastDist);
         }
         else
         {
             lastDist = d;
         }
     }
     return double.PositiveInfinity;
 }
Exemple #12
0
        public double GetPhaseAngle2TrueAnomaly(Orbit b, double t)
        {
            Vector3D velA;
            Vector3D velB;
            Vector3D posB;
            Vector3D normalA = NormalVector();
            Vector3D posA;
            KepToCartAtTrueAnomaly(out posA, out velA, t);
            b.KepToCart(out posB, out velB, TimeOfTrueAnomaly(t));

            Vector3D projectedB = Vector3D.Reject(posB, normalA);
            posA.Normalize();

            double angle = Math.Acos(Vector3D.Dot(posA, projectedB));
            if (Vector3D.Dot(Vector3D.Cross(normalA, posA), projectedB) < 0)
            {
                angle = Math.PI * 2 - angle;
            }
            return angle;
        }
Exemple #13
0
 public double TimeOfAscendingNode( Orbit b)
 {
     return TimeOfTrueAnomaly(AscendingNodeTrueAnomaly(b));
 }