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); } }
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; } }