static internal void Run() { const double containerSize = 50; const double minSpeed = 1; const double maxSpeed = 100; const double mass = 4.65e-23; Color color = Colors.Lavender; const int nParticles = 1000; const double deltaTime = .01; const string name = "Molecule"; double temperature = 293.15; var cont = new ParticleContainer(containerSize, containerSize, containerSize); var info = new ParticleInfo(name, mass, ConvertColor(color)); //var generator = new FlatGenerator(cont, minSpeed, maxSpeed); var generator = new BoltzmannDistribution(cont, minSpeed, maxSpeed, temperature); cont.Dictionary.AddParticle(info); cont.AddRandomParticles(generator, name, nParticles); cont.Pressure = cont.Particles.Count * DongUtility.Constants.BoltzmannConstant * cont.GetTemperature() / (50 * 50 * 50); var visualization = new ThermodynamicsVisualization(cont) { BoxColor = Colors.IndianRed }; var viz = new MotionVisualizer(visualization) { TimeIncrement = deltaTime, TimeScale = 1 }; const int histogramBins = 50; viz.AddSingleGraph("Pressure", Colors.CornflowerBlue, () => visualization.Time, () => cont.Pressure, "Time (s)", "Pressure (N/m^2)"); //viz.AddText("Pressure", Colors.CadetBlue, () => cont.GetTemperature() * nParticles * DongUtility.Constants.BoltzmannConstant / (Math.Pow(containerSize,3)) ); //viz.AddSingleGraph("Pressure vs. Temperature", Colors.CornflowerBlue, () => cont.GetTemperature(), () => cont.Pressure, "Temperature (K)", "Pressure (N/m^2)"); viz.AddSingleGraph("Temperature vs. Time", Colors.CornflowerBlue, () => visualization.Time, () => cont.GetTemperature(), "Time (s)", "Temperature (K)"); //viz.AddHist(histogramBins, Colors.BlueViolet, () => cont.GetParticlePropertyList((Particle part) => part.Velocity.Magnitude), "Speed (m/s)"); //Volume vs. Temperature when n and P are constant viz.AddSingleGraph("Volume vs. Temperature", Colors.CornflowerBlue, () => cont.GetTemperature(), () => nParticles * DongUtility.Constants.BoltzmannConstant * cont.GetTemperature() / cont.Pressure, "Temperature (K)", "Volume (m^3)"); //viz.AddText("Volume", Colors.CadetBlue, () => cont.GetTemperature() * nParticles * DongUtility.Constants.BoltzmannConstant / (cont.Pressure) ); viz.AutoCamera = true; viz.AutoCamera = false; viz.Show(); }
static internal void RunKinematics() { // Level 1 //var engine = new World(0.01, 0, -9.8); //Projectile projectile1 = new Projectile(new Utility.Vector(0, 0, 0), new Utility.Vector(4, 0, Math.PI / 4, false), new Utility.Vector(0, 0, -9.8), 5); //engine.AddProjectile(projectile1); // Level 2 //var engine = new World(0.01, 0.4, -9.8); //Projectile projectile1 = new Projectile(new Utility.Vector(0, 0, 0), new Utility.Vector(4, 0, Math.PI / 4, false), new Utility.Vector(0, 0, -9.8), 5); //engine.AddProjectile(projectile1); // Level 3 //var engine = new World(0.01, 0.4, -9.8); //Projectile projectile1 = new Projectile(new Utility.Vector(1, 1, 1), new Utility.Vector(-2, 1, 3), new Utility.Vector(0, 0, -9.8), 5); //Spring spring1 = new Spring(2, 5, new Utility.Vector(), projectile1.Position); //engine.AddProjectile(projectile1); //engine.AddSpring(spring1); // Challenge // This should connect to your World or Engine class from your kinematics project var engine = new World(0.01, 0.4, -9.8); Projectile projectile1 = new Projectile(new Utility.Vector(1, 1, 1), new Utility.Vector(-2, 1, 3), new Utility.Vector(0, 0, -9.8), 5); Projectile projectile2 = new Projectile(new Utility.Vector(2, 2, 2), new Utility.Vector(1, -3, 4), new Utility.Vector(0, 0, -9.8), 3); Spring spring1 = new Spring(2, 5, new Utility.Vector(), projectile1.Position); Spring spring2 = new Spring(2, 5, projectile1.Position, projectile2.Position); engine.AddProjectile(projectile1); engine.AddProjectile(projectile2); engine.AddSpring(spring1); engine.AddSpring(spring2); // This will work once you define an EngineAdapter that inherits from IEngine var adapter = new EngineAdapter(engine); Sphere3D.NSegments = 40; var visualization = new KinematicsVisualization(adapter); Timeline.MaximumPoints = 3000; var fullViz = new MotionVisualizer(visualization); // For Levels 1-3 //fullViz.Add3DGraph("Position", () => engine.Time, () => ConvertToVector3D(engine.ProjectileList[0].Position), "Time (s)", "Position (m)"); //fullViz.Add3DGraph("Velocity", () => engine.Time, () => ConvertToVector3D(engine.ProjectileList[0].Velocity), "Time (s)", "Velocity (m/s)"); //fullViz.Add3DGraph("Acceleration", () => engine.Time, () => ConvertToVector3D(engine.ProjectileList[0].Acceleration), "Time (s)", "Acceleration (m/s^2)"); // For the challenge fullViz.AddSingleGraph("Distance Between Projectiles", Colors.Teal, () => engine.Time, (() => (engine.ProjectileList[1].Position - engine.ProjectileList[0].Position).Magnitude) , "Time (s)", "Distance (m)"); fullViz.Add3DGraph("CM Position", () => engine.Time, () => ConvertToVector3D(engine.CalcCOM(projectile1, projectile2)), "Time (s)", "CM Position (m)"); fullViz.Add3DGraph("CM Velocity", () => engine.Time, () => ConvertToVector3D((engine.ProjectileList[0].Velocity * engine.ProjectileList[0].Mass + engine.ProjectileList[1].Velocity * engine.ProjectileList[1].Mass) / (engine.ProjectileList[0].Mass + engine.ProjectileList[1].Mass)), "Time (s)", "CM Velocity (m/s)"); fullViz.Add3DGraph("CM Accleration", () => engine.Time, () => ConvertToVector3D((engine.ProjectileList[0].Acceleration * engine.ProjectileList[0].Mass + engine.ProjectileList[1].Acceleration * engine.ProjectileList[1].Mass) / (engine.ProjectileList[0].Mass + engine.ProjectileList[1].Mass)), "Time (s)", "CM Acceleration (m/s^2)"); fullViz.Show(); }