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); }
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; }
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); }
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; }
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); }
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; }
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; }
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; }