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();
        }
示例#2
0
        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();
        }