static void Main(string[] args) { ParticleGrid grid = new ParticleGrid((1, 1, 1), (10, 10, 10), 0.5, 2); List <Particle> particles = grid.GenerateParticles(0.0001, InteractionFunctions.GravitationalInteraction); TrajectoryIntegrator integrator = new TrajectoryIntegrator(grid, 0.005); float[] positions = new float[particles.Count * 3]; float[] nextPositions = new float[particles.Count * 3]; for (int i = 0; i < particles.Count; i++) { positions[3 * i] = (float)particles[i].Position.X; positions[3 * i + 1] = (float)particles[i].Position.Y; positions[3 * i + 2] = (float)particles[i].Position.Z; } Object syncObject = new Object(); using (ParticleVisualizer particleVisualizer = new ParticleVisualizer(positions, 0.05, 10, syncObject)) { Task.Run(() => { while (true) { integrator.NextStep(); for (int i = 0; i < particles.Count; i++) { nextPositions[3 * i] = (float)particles[i].Position.X; nextPositions[3 * i + 1] = (float)particles[i].Position.Y; nextPositions[3 * i + 2] = (float)particles[i].Position.Z; } lock (syncObject) { var temp = positions; positions = nextPositions; nextPositions = temp; } } }); particleVisualizer.Run(30); } }
/// <summary> /// Измеряет время моделирования движения частиц. /// </summary> /// <param name="steps">Количество шагов интегрирования.</param> /// <returns></returns> private static long TimeTest(int steps) { Stopwatch sw = new Stopwatch(); ParticleGrid grid = new ParticleGrid(spaceSize: (1, 1, 1), cellCount: (5, 5, 5), interactionRadius: 0.7, threads: 1); grid.GenerateParticles(mass: 1, interactionFunction: InteractionFunctions.PseudoGravitationInteraction); TrajectoryIntegrator integrator = new TrajectoryIntegrator(grid, step: 0.05); sw.Start(); for (int i = 0; i < steps; i++) { integrator.NextStep(); } sw.Stop(); return(sw.ElapsedMilliseconds); }