Exemple #1
0
        private void SimulateWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            while (Position.Y > 0)
            {
                // Сопротивление воздуха, направленно против движения тела
                var force = (V * V * K) * -new Vec2(Math.Sign(V.X), Math.Sign(V.Y));

                force -= G * Mass;

                if (Position.Y <= F_H)  //Если вошли в зону теплого воздуха, добавляет силу потока
                {
                    force += F;
                }

                // Если я еще помню физику...
                // TimeScale это шаг симуляции
                A         = force / Mass;
                V        += A * TimeScale;
                Position += V * TimeScale;

                // Сообщаем что нужно обновить графики
                SimulateWorker.ReportProgress(0);
                //Приостанавливает симуляцию. Если убрать то симуляция произойдет почти мнгновенно и анимация пользователь не увидит анимации
                Thread.Sleep(FPS);
            }
        }
Exemple #2
0
        private void StartStopBtn_Click(object sender, EventArgs e)
        {
            if (StartStopBtn.Text == "Старт")
            {
                Position  = new Vec2(0, double.Parse(start_h.Text));
                V         = new Vec2(double.Parse(start_v_x.Text), double.Parse(start_v_y.Text));
                F         = new Vec2(double.Parse(const_f_x.Text), double.Parse(const_f_y.Text));
                A         = new Vec2(0, 0);
                G         = new Vec2(0, double.Parse(const_g.Text));
                K         = double.Parse(const_k.Text);
                F_H       = double.Parse(const_f_h.Text);
                Mass      = double.Parse(const_m.Text);
                TimeScale = double.Parse(const_ts.Text);

                diagramPos = 20;
                gDiagram.Clear(BackColor);

                int offest = diagram.Height / 2;
                gDiagram.DrawLine(Pens.Black, diagramPos, offest, diagram.Width, offest);
                gDiagram.DrawString("0", Font, Brushes.Black, 0, offest - 5);
                gDiagram.DrawString("+V", Font, Brushes.Black, 0, offest - 35);
                gDiagram.DrawString("-V", Font, Brushes.Black, 0, offest + 25);

                StartStopBtn.Text = "Стоп";

                SimulateWorker.RunWorkerAsync();
            }
            else
            {
                SimulateWorker.CancelAsync();
                StartStopBtn.Text = "Старт";
                Position.Y        = 0;
            }
        }