public static ImageDisplay CreateAndRunInBackground(Size imageSize) { ImageDisplay imageDisplay = null; var initializedEvent = new ManualResetEvent(false); var thread = new Thread(() => { imageDisplay = new ImageDisplay(imageSize); imageDisplay.Shown += (s, e) => initializedEvent.Set(); Application.Run(imageDisplay); }); thread.SetApartmentState(ApartmentState.STA); thread.IsBackground = false; thread.Start(); initializedEvent.WaitOne(); return(imageDisplay); }
public static void Main(string[] args) { var points = new HashSet <Vector2> { new Vector2(100, 100), new Vector2(200, 100), new Vector2(120, 150), new Vector2(180, 150) }; // var scale = 1f; // var points = new HashSet<Vector2> // { // new Vector2(100 * scale, 100 * scale), // new Vector2(250 * scale, 100 * scale), // new Vector2(160 * scale, 150 * scale), // new Vector2(180 * scale, 160 * scale) // }; var random = new Random(1); points = new HashSet <Vector2>( Enumerable.Range(0, 300) .Select(i => { var y = (TNumber)random.NextDouble() * 1200; var x = (TNumber)random.NextDouble() * 500 + y / 2; return(new TVector2(x, y)); }) ); // points = new HashSet<TVector2>( // from i in Enumerable.Range(0, 4) // from j in Enumerable.Range(0, 4) // let shift = i % 2 == 0 ? 25 : 0 // let spacing = 50 // select new TVector2(j * spacing + shift, i * spacing) // ); var renderer = FortunesAlgorithmRenderer.Create(points); var display = ImageDisplay.CreateAndRunInBackground(renderer.ImageSize); var state = FortunesAlgorithmState.CreateAndInitialize(points); var fortunesAlgorithmExecutor = new FortunesAlgorithmExecutor(); // // show end result // fortunesAlgorithmExecutor.ExecuteToCompletion(state); // display.AddFrame(renderer.Render(state)); // animate var frames = new ObservableCollection <Bitmap>(); frames.CollectionChanged += (s, e) => display.AddFrame((Bitmap)e.NewItems[0]); TNumber sweepY = -renderer.Padding.Top; ISweepEvent sweepEvent; var frame = 0; while (state.EventQueue.TryPeek(out sweepEvent)) { // while (sweepY < sweepEvent.Y) // { // TNumber stepSize = 1; // var bottomY = renderer.BoardSize.Height + renderer.Padding.Bottom; // if (sweepY > bottomY) // { // var speed = (TNumber)Math.Pow(sweepY - bottomY, 1.01); // stepSize = Math.Max(speed, stepSize); // } // frames.Add(renderer.Render(state, sweepY)); // sweepY += stepSize; // } fortunesAlgorithmExecutor.ExecuteNextEvent(state); frame++; if (frame % 10 == 0) { frames.Add(renderer.Render(state, sweepEvent.Y + 0.1f)); } if (frames.Count == 115) { var old = renderer.ImageSize; var padding = renderer.Padding = new Padding(3200, 3200, 3200, 3200); renderer.ImageSize = new Size(renderer.BoardSize.Width + padding.Horizontal, renderer.BoardSize.Height + padding.Vertical); renderer.Render(state, sweepEvent.Y + 0.1f).Save(@"V:\my-repositories\miyu\voronoi\image.png", ImageFormat.Png); Environment.Exit(0); } if (state.EventQueue.Count <= 5) { fortunesAlgorithmExecutor.ExecuteToCompletion(state); } } // while (sweepY < renderer.BoardSize.Height + renderer.Padding.Bottom) // frames.Add(renderer.Render(state, sweepY++)); fortunesAlgorithmExecutor.ProcessCleanup(state); frames.Add(renderer.Render(state)); if (!Directory.Exists("output")) { Directory.CreateDirectory("output"); } // int frame = 0; // for (int i = 0; i < 10; i++) // frames.Last().Save($"output/{frame++}.gif", ImageFormat.Gif); // for (int i = frames.Count - 1; i >= 0; i -= 14) // frames[i].Save($"output/{frame++}.gif", ImageFormat.Gif); // for (int i = 0; i < frames.Count; i += 3) // frames[i].Save($"output/{frame++}.gif", ImageFormat.Gif); // using (var outputGifStream = File.OpenWrite("output.gif")) // using (var gifEncoder = new GifEncoder( // outputGifStream, renderer.ImageSize.Width, renderer.ImageSize.Height)) // { // gifEncoder.AddFrame(frames.Last(), TimeSpan.FromMilliseconds(1000)); // for (int i = frames.Count - 1; i >= 0; i -= 14) // gifEncoder.AddFrame(frames[i], TimeSpan.FromMilliseconds(10)); // for (int i = 0; i < frames.Count; i += 3) // gifEncoder.AddFrame(frames[i], TimeSpan.FromMilliseconds(10)); // } // using (MagickImageCollection collection = new MagickImageCollection()) // { // collection.Add(new MagickImage(frames.Last())); // collection[collection.Count - 1].AnimationDelay = 1000; // // for (int i = frames.Count - 1; i >= 0; i -= 10) // { // collection.Add(new MagickImage(frames[i])); // collection[collection.Count - 1].AnimationDelay = 10; // } // for (int i = 0; i < frames.Count; i++) // { // // collection.Add(new MagickImage(frames[i])); // collection[collection.Count - 1].AnimationDelay = 10; // } // } }