public void Run(List <FortuneSite> sites, PoolLinkedList <VEdge> edges, double minX, double minY, double maxX, double maxY) { eventQueue.Initialize(5 * sites.Count); beachLine.Clear(); deleted.Clear(); foreach (var s in sites) { var fEvent = ObjectPool <FortuneSiteEvent> .Get(); fEvent.Initialize(s); eventQueue.Insert(fEvent); } //init edge list while (eventQueue.Count != 0) { var fEvent = eventQueue.Pop(); if (fEvent is FortuneSiteEvent) { beachLine.AddBeachSection((FortuneSiteEvent)fEvent, eventQueue, deleted, edges); ObjectPool <FortuneSiteEvent> .Recycle((FortuneSiteEvent)fEvent); } else { if (deleted.Contains((FortuneCircleEvent)fEvent)) { deleted.Remove((FortuneCircleEvent)fEvent); } else { beachLine.RemoveBeachSection((FortuneCircleEvent)fEvent, eventQueue, deleted, edges); } ObjectPool <FortuneCircleEvent> .Recycle((FortuneCircleEvent)fEvent); } } //clip edges var edgeNode = edges.First; while (edgeNode != null) { var edge = edgeNode.Value; var next = edgeNode.Next; var valid = ClipEdge(edge, minX, minY, maxX, maxY); if (!valid) { edges.Remove(edgeNode); if (edgeNode.Value.Neighbor != null) { ObjectPool <VEdge> .Recycle(edgeNode.Value.Neighbor); } ObjectPool <VEdge> .Recycle(edgeNode.Value); } //advance edgeNode = next; } }
public static void Main(string[] args) { var r = new Random(); var watch = new Stopwatch(); var times = new long[MAX_N, SAMPLES]; var fortune = new FortunesAlgorithm(); var output = new PoolLinkedList <VEdge>(); for (var point = 1; point *INC <= MAX_N; point++) { var numPoints = point * INC; Console.WriteLine($"Running for n = {numPoints}"); for (var sample = 1; sample <= SAMPLES; sample++) { Console.WriteLine($"\tRunning sample {sample}"); watch.Reset(); var points = GenPoints(numPoints, r); watch.Start(); fortune.Run(points, output, 0, 0, WIDTH, HEIGHT); watch.Stop(); output.Clear((edge) => { if (edge.Neighbor != null) { ObjectPool <VEdge> .Recycle(edge.Neighbor); } ObjectPool <VEdge> .Recycle(edge); }); times[point - 1, sample - 1] = watch.ElapsedMilliseconds; } } var outFile = File.CreateText("timings.csv"); var excelFile = File.CreateText("excelTimings.csv"); outFile.Write("N, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10" + Environment.NewLine); excelFile.Write("N, T (ms)" + Environment.NewLine); for (var i = 1; i *INC <= MAX_N; i++) { var s = i * INC + ", "; for (var j = 0; j < SAMPLES - 1; j++) { s += times[i - 1, j] + ", "; } s += times[i - 1, SAMPLES - 1] + Environment.NewLine; outFile.Write(s); for (var j = 1; j <= SAMPLES; j++) { excelFile.Write(i * INC + ", " + times[i - 1, j - 1] + Environment.NewLine); } } outFile.Dispose(); excelFile.Dispose(); }
protected override void Initialize() { //set full screen graphics.PreferredBackBufferHeight = graphics.GraphicsDevice.DisplayMode.Height; graphics.PreferredBackBufferWidth = graphics.GraphicsDevice.DisplayMode.Width; graphics.ToggleFullScreen(); IsMouseVisible = true; points = new List <FortuneSite>(); edges = new PoolLinkedList <VEdge>(); delaunay = new List <Tuple <Vector2, Vector2> >(); keyboard = Keyboard.GetState(); mouse = Mouse.GetState(); fortune = new FortunesAlgorithm(); r = new Random(100); help = new Rectangle(0, 0, 285, 180); helpColor = new Color(Color.Black, (float).5); base.Initialize(); }