/// <summary> /// Записать развитие модели на видео /// </summary> /// <param name="model">Модель развития</param> /// <param name="param">Параметры отображения</param> /// <param name="fps">Количество кадров в секунду</param> /// <param name="spf">Количество этапов развития за кадр</param> /// <param name="frameCount">Количество кадров</param> /// <param name="speedK">Ускорение развития системы за одну секунду</param> public static void Record(this IAnimation model, DrawParams param, int fps, int spf, int frameCount, float speedK) { var writer = new VideoFileWriter(); writer.Open( $"out{Directory.GetFiles(Environment.CurrentDirectory).Count(x => x.Contains("out"))}.mp4", (int)param.Rect.Width, (int)param.Rect.Height, fps, VideoCodec.MPEG4, (int)(10 * param.Rect.Width * param.Rect.Height)); ProgressWindow pr = new ProgressWindow(frameCount); float deltaShift = -0.3F; double zoomK = speedK; float zoomKPerFrame = (float)Math.Pow(zoomK, zoomK / fps); param.ZoomK = zoomKPerFrame; using (var bmp = new Bitmap(writer.Width, writer.Height)) { using (var g = Graphics.FromImage(bmp)) { g.SmoothingMode = SmoothingMode.AntiAlias; g.TextRenderingHint = TextRenderingHint.AntiAlias; for (int i = 0; i < frameCount; i++) { g.Clear(Color.Black); model.Draw(g, param); for (int j = 0; j < spf; j++) { model.NextStage(); } //param.Shift(deltaShift, 0); //deltaShift *= speedK; param.ZoomOut(0, param.Rect.Height * 4 / 5); writer.WriteVideoFrame(bmp); pr.Next(); } } } pr.Dispose(); writer.Close(); }