private static void AdjustVelocity(Moon moonOne, Moon moonTwo) { if (moonOne.XPosition > moonTwo.XPosition) { moonOne.XVelocity -= 1; moonTwo.XVelocity += 1; } else if (moonOne.XPosition < moonTwo.XPosition) { moonOne.XVelocity += 1; moonTwo.XVelocity -= 1; } if (moonOne.YPosition > moonTwo.YPosition) { moonOne.YVelocity -= 1; moonTwo.YVelocity += 1; } else if (moonOne.YPosition < moonTwo.YPosition) { moonOne.YVelocity += 1; moonTwo.YVelocity -= 1; } if (moonOne.ZPosition > moonTwo.ZPosition) { moonOne.ZVelocity -= 1; moonTwo.ZVelocity += 1; } else if (moonOne.ZPosition < moonTwo.ZPosition) { moonOne.ZVelocity += 1; moonTwo.ZVelocity -= 1; } }
private static void ApplyGravity(Moon a, Moon b) { var(ax, bx) = GetGravityChanges(a.Position.X, b.Position.X); var(ay, by) = GetGravityChanges(a.Position.Y, b.Position.Y); var(az, bz) = GetGravityChanges(a.Position.Z, b.Position.Z); a.ChangeVelocity(ax, ay, az); b.ChangeVelocity(bx, by, bz); }
public void CalcVelocities(Moon moon) { var x = velocity.X; var y = velocity.Y; var z = velocity.Z; List <int> deltas = new List <int>(); deltas.Add(this.location.X.CompareTo(moon.location.X)); deltas.Add(this.location.Y.CompareTo(moon.location.Y)); deltas.Add(this.location.Z.CompareTo(moon.location.Z)); if (deltas[0] < 0) { x++; } else if (deltas[0] > 0) { x--; } if (deltas[1] < 0) { y++; } else if (deltas[1] > 0) { y--; } if (deltas[2] < 0) { z++; } else if (deltas[2] > 0) { z--; } SetVelocity(new Vector3D(x, y, z)); }
public void AddMoon(Moon moon) { moons.Add(moon); }
private static void AoC12(string path) { const int steps = 1000; int count = 1; int xConsonance = 0; int yConsonance = 0; int zConsonance = 0; Moon Io; Moon Europa; Moon Ganymede; Moon Callisto; Queue <Point3D> points = new Queue <Point3D>(); using (StreamReader file = new StreamReader(path)) { string line = string.Empty; while (!file.EndOfStream) { line = file.ReadLine(); var split = line.Split('=', ',', '<', '>'); points.Enqueue(new Point3D(Double.Parse(split[2]), Double.Parse(split[4]), Double.Parse(split[6]))); } } //init moons Io = new Moon(points.Dequeue()); Europa = new Moon(points.Dequeue()); Ganymede = new Moon(points.Dequeue()); Callisto = new Moon(points.Dequeue()); //part 2 while (xConsonance == 0 || yConsonance == 0 || zConsonance == 0) { //apply gravity Io.CalcVelocities(Europa); Io.CalcVelocities(Ganymede); Io.CalcVelocities(Callisto); Europa.CalcVelocities(Io); Europa.CalcVelocities(Ganymede); Europa.CalcVelocities(Callisto); Ganymede.CalcVelocities(Europa); Ganymede.CalcVelocities(Io); Ganymede.CalcVelocities(Callisto); Callisto.CalcVelocities(Europa); Callisto.CalcVelocities(Ganymede); Callisto.CalcVelocities(Io); //time step Io.TimeStep(); Europa.TimeStep(); Ganymede.TimeStep(); Callisto.TimeStep(); if (xConsonance == 0) { if (Io.GetVelocityByAxis("X") == 0 && Europa.GetVelocityByAxis("X") == 0 && Ganymede.GetVelocityByAxis("X") == 0 && Callisto.GetVelocityByAxis("X") == 0) { xConsonance = count; } } if (yConsonance == 0) { if (Io.GetVelocityByAxis("Y") == 0 && Europa.GetVelocityByAxis("Y") == 0 && Ganymede.GetVelocityByAxis("Y") == 0 && Callisto.GetVelocityByAxis("Y") == 0) { yConsonance = count; } } if (zConsonance == 0) { if (Io.GetVelocityByAxis("Z") == 0 && Europa.GetVelocityByAxis("Z") == 0 && Ganymede.GetVelocityByAxis("Z") == 0 && Callisto.GetVelocityByAxis("Z") == 0) { zConsonance = count; } } count++; } long lcm = Functions.LCM(xConsonance, Functions.LCM(yConsonance, zConsonance)) * 2; Console.WriteLine(lcm); //part 1 for (int i = 0; i < steps; i++) { //apply gravity Io.CalcVelocities(Europa); Io.CalcVelocities(Ganymede); Io.CalcVelocities(Callisto); Europa.CalcVelocities(Io); Europa.CalcVelocities(Ganymede); Europa.CalcVelocities(Callisto); Ganymede.CalcVelocities(Europa); Ganymede.CalcVelocities(Io); Ganymede.CalcVelocities(Callisto); Callisto.CalcVelocities(Europa); Callisto.CalcVelocities(Ganymede); Callisto.CalcVelocities(Io); //time step Io.TimeStep(); Europa.TimeStep(); Ganymede.TimeStep(); Callisto.TimeStep(); } var IoTotal = Io.CalcPotentialEnergy() * Io.CalcKineticEnergy(); var EurTotal = Europa.CalcPotentialEnergy() * Europa.CalcKineticEnergy(); var GanyTotal = Ganymede.CalcPotentialEnergy() * Ganymede.CalcKineticEnergy(); var CallTotal = Callisto.CalcPotentialEnergy() * Callisto.CalcKineticEnergy(); var TotalEnergy = IoTotal + EurTotal + GanyTotal + CallTotal; Console.WriteLine(TotalEnergy); Console.ReadKey(); }