Пример #1
0
        /// <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();
        }