示例#1
0
        static internal void Run()
        {
            const double containerSize = 25;

            const double deltaTime      = .001;
            const double temperature    = 293.17;
            const double reactionRadius = 2;

            var container = new MyReactingParticleContainer(containerSize, reactionRadius);

            container.AddRxn("Susceptible+Infected->Infected+Infected", 1, 0);
            container.AddRxn("Infected->Recovered", 1, 0);
            container.AddRxn("Infected->Dead", .2, 0);

            const double massPerson = 5e-25;

            Color colorSusceptible = Colors.Red;
            Color colorInfected    = Colors.Orange;
            Color colorRecovered   = Colors.Green;
            Color colorDead        = Colors.Blue;

            container.Dictionary.AddParticle(new ParticleInfo("Susceptible", massPerson, ConvertColor(colorSusceptible)));
            container.Dictionary.AddParticle(new ParticleInfo("Infected", massPerson, ConvertColor(colorInfected)));
            container.Dictionary.AddParticle(new ParticleInfo("Recovered", massPerson, ConvertColor(colorRecovered)));
            container.Dictionary.AddParticle(new ParticleInfo("Dead", massPerson, ConvertColor(colorDead)));

            var SusceptibleGenerator = new BoltzmannGenerator(container, temperature, container.Dictionary.Map["Susceptible"]);
            var InfectedGenerator    = new BoltzmannGenerator(container, temperature, container.Dictionary.Map["Infected"]);

            const int nSusceptible = 500;
            const int nInfected    = 1;

            container.AddRandomParticles(SusceptibleGenerator, nSusceptible, "Susceptible");
            container.AddRandomParticles(InfectedGenerator, nInfected, "Infected");

            var visualization = new ChemicalVisualization(container)
            {
                BoxColor = Colors.IndianRed
            };

            var viz = new MotionVisualizer(visualization)
            {
                TimeIncrement = deltaTime,
                TimeScale     = 1,
                SlowDraw      = true
            };

            Timeline.MaximumPoints = 3000;

            var chemicalGraph = new ChemicalGraph(container, visualization);

            viz.AddGraph(chemicalGraph, chemicalGraph.Functions);

            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();
        }
        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();
        }
示例#4
0
        static public void Run()
        {
            var harePerceptron = TrainHare();
            var lynxPerceptron = TrainLynx();

            //var arena = PrepareArena(perceptron);
            var arena = PrepareArenaFinal();

            var visualization = new PredatorPreyVisualization(arena);
            var visualizer    = new MotionVisualizer(visualization);

            visualizer.Show();
        }
        static internal void RunFiniteElement()
        {
            var engine = new KinematicsEngine();

            engine.AddForce(new ConstantGravitationForce(engine, new Vector(0, 0, -9.8)));
            engine.AddForce(new GroundForce(engine));
            var ps = new YourParticleStructure();

            AddParticleStructure(ps, engine);

            var adapter = new EngineAdapter(engine);

            Sphere3D.NSegments = 40;
            var visualization = new KinematicsVisualization(adapter);

            visualization.Ground = true;

            visualization.ConnectorRadiusScale = .1;
            ProjectileAdapter.VisualSize       = .1;

            AddConnectorsToVisualizer(ps, visualization);

            Timeline.MaximumPoints = 3000;

            var fullViz = new MotionVisualizer(visualization);

            //fullViz.BackgroundFile = "stars.jpg";

            //fullViz.Add3DGraph("Position", () => engine.Time, () => ConvertToVector3D(engine.Projectiles[0].Position), "Time (s)", "Position (m)");
            //fullViz.Add3DGraph("Velocity", () => engine.Time, () => ConvertToVector3D(engine.Projectiles[0].Velocity), "Time (s)", "Velocity (m/s)");
            //fullViz.Add3DGraph("Acceleration", () => engine.Time, () => ConvertToVector3D(engine.Projectiles[0].Acceleration), "Time (s)", "Acceleration (m/s^2)");
            //fullViz.Add3DGraph("Center of Mass", () => engine.Time, () => ConvertToVector3D(ps.CalcCOM()), "Time (s)", "Center of Mass (m)");
            //fullViz.Add3DGraph("Rotation", () => ps.ProjectileList[0].Position.Polar, () => ConvertToVector3D(ps.ProjectileList[0].Position), "Y Position (m)", "Position");

            //fullViz.AddSingleGraph("Rotation Motion", Colors.Teal, () => ps.ProjectileList[0].Position.Y, (() => ps.ProjectileList[0].Position.Z)
            //    , "Y Position", "Z Position");

            fullViz.Show();
        }
        static internal void RunMarbleMadness()
        {
            var engine = new KinematicsEngine();

            engine.AddForce(new ConstantGravitationForce(engine, new Vector(0, 0, -9.8)));
            var ps       = new YourParticleStructure();
            var surfaces = new JayDongMarbleMachine();

            AddParticleStructure(ps, engine);
            AddSurfaces(surfaces, engine);

            var adapter = new EngineAdapter(engine);

            Sphere3D.NSegments = 40;
            var visualization = new KinematicsVisualization(adapter);

            visualization.Box = true;

            visualization.ConnectorRadiusScale = .1;
            ProjectileAdapter.VisualSize       = .01;

            AddConnectorsToVisualizer(ps, visualization);
            AddSurfacesToVisualizer(surfaces, visualization);

            Timeline.MaximumPoints = 3000;

            var fullViz = new MotionVisualizer(visualization);

            //fullViz.BackgroundFile = "stars.jpg";

            fullViz.Add3DGraph("Position", () => engine.Time, () => ConvertToVector3D(engine.Projectiles[0].Position), "Time (s)", "Position (m)");
            fullViz.Add3DGraph("Velocity", () => engine.Time, () => ConvertToVector3D(engine.Projectiles[0].Velocity), "Time (s)", "Velocity (m/s)");
            fullViz.Add3DGraph("Acceleration", () => engine.Time, () => ConvertToVector3D(engine.Projectiles[0].Acceleration), "Time (s)", "Acceleration (m/s^2)");

            //fullViz.AddSingleGraph("Speed", Colors.Teal, () => engine.Time, (() => engine.Projectiles[0].Velocity.Magnitude),
            //     "Time (s)", "Speed (m/s)");

            fullViz.Show();
        }
        static internal void VisualizeFastestDescent(int level, params double[] parameters)
        {
            var engine = SetupEngine(level, parameters);

            var visualization = new DescentVisualization(engine)
            {
                PathThickness   = .5,
                PathColor       = Colors.IndianRed,
                ProjectileSize  = 1,
                ProjectileColor = Colors.NavajoWhite
            };

            var fullViz = new MotionVisualizer(visualization);

            //fullViz.BackgroundFile = "stars.jpg";

            fullViz.Add3DGraph("Position", () => engine.Time, () => ConvertVector(engine.Projectile.Position), "Time (s)", "Position (m)");
            fullViz.AddText("Time", Colors.MidnightBlue, () => (Math.Round(engine.Time, 3)).ToString() + " s");

            fullViz.SlowDraw      = true;
            fullViz.TimeIncrement = .01;

            fullViz.Show();
        }