using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; namespace TMI_practicum { internal static class Program { public static void Main(string[] args) { CheckAlgo(); //GetChartData(); if (args.Length < 1) { Console.WriteLine("Please enter a file."); Environment.Exit(1); } if (!File.Exists(args[0])) { Console.WriteLine("File {0} not found.", args[0]); Environment.Exit(1); } var (algorithm, _, circles) = ParseFile(args[0]); Stopwatch stopwatch = new Stopwatch(); IEnumerable solved; stopwatch.Start(); switch (algorithm) { case 1: solved = SimpleAlgorithm.Solve(circles); break; case 2: solved = SweepLineAlgorithm.Solve(circles); break; case 3: solved = SweepLineEffAlgorithm.Solve(circles); break; default: throw new ArgumentException("Algorithm with id: " + algorithm + " is not defined!"); } stopwatch.Stop(); WriteOutput(solved, stopwatch.ElapsedMilliseconds); } private static void CheckAlgo() { bool failed = false; int i = 0; while (!failed) { Console.WriteLine("start check {0}", i++); var circles = CreateRandomCircles(5); var correctSol = SweepLineAlgorithm.Solve(circles); var solved = SweepLineEffAlgorithm.Solve(circles); foreach (var intersection in correctSol) { if (solved.Contains(intersection)) continue; if (solved.Contains(new Intersection(intersection.X + 10e-15, intersection.Y)) || solved.Contains(new Intersection(intersection.X - 10e-15, intersection.Y)) || solved.Contains(new Intersection(intersection.X + 10e-15, intersection.Y + 10e-15)) || solved.Contains(new Intersection(intersection.X + 10e-15, intersection.Y - 10e-15)) || solved.Contains(new Intersection(intersection.X - 10e-15, intersection.Y - 10e-15)) || solved.Contains(new Intersection(intersection.X - 10e-15, intersection.Y - 10e-15)) || solved.Contains(new Intersection(intersection.X, intersection.Y + 10e-15)) || solved.Contains(new Intersection(intersection.X, intersection.Y - 10e-15)) ) continue; Console.WriteLine(InCircles(circles)); failed = true; Console.WriteLine("Not found: {0}\t{1}", intersection.X, intersection.Y); Console.WriteLine("correct"); foreach (var intersection1 in correctSol) { Console.WriteLine("{0}\t{1}", intersection1.X, intersection1.Y); } Console.WriteLine("wrong"); foreach (var intersection1 in solved) { Console.WriteLine("{0}\t{1}", intersection1.X, intersection1.Y); } Console.WriteLine("Cirkels"); foreach (var circle in circles) { Console.WriteLine("(x-{0})^2 + (y-{1})^2 = {2}^2", circle.X, circle.Y, circle.R); } foreach (var circle in circles) { Console.WriteLine("{0} {1} {2}", circle.X, circle.Y, circle.R); } break; } } } private static List CreateRandomCircles(double amount) { var circles = new List(); Random rnd = new Random(); for (int i = 0; i < amount; i++) { circles.Add(new Circle(Math.Round(rnd.NextDouble() * 1.0, 15), Math.Round(rnd.NextDouble() * 1.0, 15), Math.Round(rnd.NextDouble() * 0.90 + 0.05, 15))); } return circles; } private static void GetChartData() { var stopwatch = new Stopwatch(); //warmup var circles = CreateRandomCircles(20); IEnumerable solved = SweepLineEffAlgorithm.Solve(circles); var times = new List(); Console.WriteLine("size, time"); for (int s = 10; s < 100000; s *= 2) { for (int i = 0; i < 100; i++) { circles = CreateRandomCircles(s); stopwatch.Restart(); solved = SweepLineEffAlgorithm.Solve(circles); stopwatch.Stop(); times.Add(stopwatch.ElapsedMilliseconds); } Console.WriteLine("{0}, {1}", s, times.Average()); times.Clear(); } stopwatch.Stop(); } private static (byte Algorithm, int NbCircles, IList Circles) ParseFile(string path) { byte algorithm = 0; int nbCircles = 0; Circle[] circles = null; using (StreamReader file = new StreamReader(path)) { try { algorithm = byte.Parse(file.ReadLine()); nbCircles = int.Parse(file.ReadLine()); circles = new Circle[nbCircles]; string line; int i = 0; while ((line = file.ReadLine()) != null) { double[] parts = line.Split(' ').Select(double.Parse).ToArray(); circles[i++] = new Circle(parts[0], parts[1], parts[2]); } } catch (Exception) { Console.WriteLine("An error occured parsing the input file.\r\n" + "Make sure the file has all required values and consists only of numbers."); Environment.Exit(1); } } return (algorithm, nbCircles, circles); } private const string OutputFile = "output.txt"; private static void WriteOutput(IEnumerable intersections, double time) { if (File.Exists(OutputFile)) { File.Delete(OutputFile); } using (StreamWriter sw = File.CreateText(OutputFile)) { foreach (var intersection in intersections) { sw.WriteLine("{0:0.000000000000000}\t{1:0.000000000000000}", intersection.X, intersection.Y); } sw.WriteLine("\r\n{0}", time); } } private static int InCircles(IList circles) { int count = 0; foreach (var toCheck in circles) { foreach (var circle in circles) { if (circle == toCheck) continue; if (circle.R > toCheck.R && circle.Distance(toCheck) < circle.R && circle.FindIntersections(toCheck) == null) { count++; } } } return count; } } }