using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace OM_PDU1 { public class Souradnice { public double x { get; set; } public double y { get; set; } public double z { get; set; } public Souradnice(double x, double y, double z) { this.x = x; this.y = y; this.z = z; } public void VypisSouradnice() { Console.Write(this.x); Console.Write(" "); Console.Write(this.y); Console.Write(" "); Console.WriteLine(this.z); } } class Program { static TextReader input = Console.In; static FileStream output; static StreamWriter sw; static bool vystupDoFilu = false; static double cos45 = Math.Cos(Math.PI / 4); static double sin45 = Math.Cos(Math.PI / 4); static double cosm45 = Math.Cos(- Math.PI / 4); static double sinm45 = Math.Cos(- Math.PI / 4); static double SpoctiVzdalenost(Souradnice prvni, Souradnice druhy) { double distance = Math.Abs(prvni.x - druhy.x) + Math.Abs(prvni.y - druhy.y) + Math.Abs(prvni.z - druhy.z); return distance; } static void Main(string[] args) { if (args.Any()) { var path = args[0]; if (File.Exists(path)) { input = File.OpenText(path); } if (args.Length > 1) { path = args[1]; output = new FileStream(path, FileMode.Create); sw = new StreamWriter(output); Console.SetOut(sw); vystupDoFilu = true; } } // using "input" for all input operations int pocetKancelari = int.Parse(input.ReadLine()); var Kancelare = new List(); for (string line; (line = input.ReadLine()) != null;) { //in "line" whole input line is stored int xFromFile = int.Parse(line.Split(' ')[0]); int yFromFile = int.Parse(line.Split(' ')[1]); int zFromFile = int.Parse(line.Split(' ')[2]); Souradnice Kancelar = new Souradnice(xFromFile, yFromFile, zFromFile); //all coordinates data are stored in Kancelare list as Souradnice Kancelare.Add(Kancelar); } if (Kancelare.Count != pocetKancelari) { Console.WriteLine("Pocet kancelari neni stejny jako udany pocet!"); Environment.Exit(1); } // test output write of input coordinates /*foreach (Souradnice Kancelar in Kancelare) { Console.Write(Kancelar.x); Console.Write(" "); Console.Write(Kancelar.y); Console.Write(" "); Console.WriteLine(Kancelar.z); }*/ /* Coordinates system: X: left = minus, right = plus Y: down = minus, up = plus Z: closer = minus , farther = plus Note: when [0,0,0] is in the corner in the bottom left close corner then [max,max,max] is top right which is far away */ /*Souradnice Max_x, Max_y, Max_z, Min_x, Min_y, Min_z; Max_x = Max_y = Max_z = new Souradnice(int.MinValue, int.MinValue, int.MinValue); Min_x = Min_y = Min_z = new Souradnice(int.MaxValue, int.MaxValue, int.MaxValue);*/ /*foreach (Souradnice Kancl in Kancelare) { /*double nove_x = Kancl.x * cos45 + Kancl.y * sin45 * cos45 + Kancl.z * sin45 * sin45; double nove_y = -Kancl.x * sin45 + Kancl.y * cos45 * cos45 + Kancl.z * sin45 * sin45; double nove_z = -Kancl.y * sin45 + Kancl.z * cos45;*/ /*Kancl.x = nove_x; Kancl.y = nove_y; Kancl.z = nove_z; if (Kancl.x > Max_x.x) { Max_x = Kancl; } if (Kancl.y > Max_y.y) { Max_y = Kancl; } if (Kancl.z > Max_z.z) { Max_z = Kancl; } if (Kancl.x < Min_x.x) { Min_x = Kancl; } if (Kancl.y < Min_y.y) { Min_y = Kancl; } if (Kancl.z< Min_z.z) { Min_z = Kancl; } }*/ /*double stred_x = (Max_x.x + Min_x.x) / 2; double stred_y = (Max_y.y + Min_y.y) / 2; double stred_z = (Max_z.y + Min_z.y) / 2; double nove_stred_x = stred_x * cosm45 + stred_y * sinm45; double nove_stred_y = -stred_x * cosm45 * sinm45 + stred_y * cosm45 * cosm45 + stred_z * sinm45; double nove_stred_z = stred_x * sinm45 * sinm45 - stred_y * sinm45 * cosm45 + stred_z * cosm45;*/ /*Souradnice Center = new Souradnice(nove_stred_x, nove_stred_y, nove_stred_z); Souradnice Nejvzdalenejsi = Center; foreach (Souradnice D in Kancelare) { double nove_x = D.x * cosm45 + D.y * sinm45; double nove_y = -D.x * cosm45 * sinm45 + D.y * cosm45 * cosm45 + D.z * sinm45; double nove_z = D.x * sinm45 * sinm45 - D.y * sinm45 * cosm45 + D.z * cosm45; D.x = nove_x; D.y = nove_y; D.z = nove_z; if (SpoctiVzdalenost(Center, D) > SpoctiVzdalenost(Center, Nejvzdalenejsi)) { Console.WriteLine(SpoctiVzdalenost(Center, D)); Nejvzdalenejsi = D; } }*/ /*Console.WriteLine(SpoctiVzdalenost(Center, Nejvzdalenejsi)); Center.VypisSouradnice();*/ //Vsechno, co je nahore zakomentovane, tak by sice fungovat melo, ale nefunguje :'( Console.WriteLine("#NOPT048 Optimalizacni metody LS 2016/17"); Console.WriteLine("#1. prakticky domaci ukol"); Console.WriteLine("#Pavel Obdrzalek"); Console.WriteLine(); Console.Write("set SOURADNICE := 1.."); Console.Write(pocetKancelari); Console.WriteLine(";"); Console.WriteLine(); Console.WriteLine("param x{ SOURADNICE };"); Console.WriteLine("param y{ SOURADNICE };"); Console.WriteLine("param z{ SOURADNICE };"); Console.WriteLine(); Console.WriteLine("var xova{ i in SOURADNICE } >= 0;"); Console.WriteLine("var zova{ i in SOURADNICE } >= 0; "); Console.WriteLine("var yova{ i in SOURADNICE } >= 0; "); Console.WriteLine(); Console.WriteLine("var CenterX;"); Console.WriteLine("var CenterY;"); Console.WriteLine("var CenterZ;"); Console.WriteLine(); Console.WriteLine("var max;"); Console.WriteLine(); Console.WriteLine("s.t.dx1{ i in SOURADNICE }: xova[i] >= x[i] - CenterX;"); Console.WriteLine("s.t.dx2{ i in SOURADNICE }: xova[i] >= CenterX - x[i];"); Console.WriteLine(); Console.WriteLine("s.t.dy1{ i in SOURADNICE }: yova[i] >= y[i] - CenterY;"); Console.WriteLine("s.t.dy2{ i in SOURADNICE }: yova[i] >= CenterY - y[i];"); Console.WriteLine(); Console.WriteLine("s.t.dz1{ i in SOURADNICE }: zova[i] >= z[i] - CenterZ;"); Console.WriteLine("s.t.dz2{ i in SOURADNICE }: zova[i] >= CenterZ - z[i];"); Console.WriteLine(); Console.WriteLine("s.t.maximum{ i in SOURADNICE }: max >= xova[i] + yova[i] + zova[i];"); Console.WriteLine(); Console.WriteLine("minimize D: max;"); Console.WriteLine(); Console.WriteLine("solve;"); Console.WriteLine("printf \"#OUTPUT:\\n\";"); Console.WriteLine("printf \"%.1f\\n\", D;"); Console.WriteLine("printf \"%.1f %.1f %.1f\\n\", CenterX, CenterY, CenterZ;"); Console.WriteLine("printf \"#OUTPUT END\\n\";"); Console.WriteLine(); Console.WriteLine("data;"); Console.WriteLine(); Console.WriteLine("#vsechny souradnice po jednotlivych slozkach"); Console.WriteLine("param x:="); int i = 1; foreach (Souradnice Kancelar in Kancelare) { Console.Write(i); Console.Write("\t"); Console.Write(Kancelar.x); if (i == pocetKancelari) { Console.WriteLine(";"); } Console.WriteLine(); i++; } Console.WriteLine("param y:="); int j = 1; foreach (Souradnice Kancelar in Kancelare) { Console.Write(j); Console.Write("\t"); Console.Write(Kancelar.y); if (j == pocetKancelari) { Console.WriteLine(";"); } Console.WriteLine(); j++; } Console.WriteLine("param z:="); int k = 1; foreach (Souradnice Kancelar in Kancelare) { Console.Write(k); Console.Write("\t"); Console.Write(Kancelar.z); if (k == pocetKancelari) { Console.WriteLine(";"); } Console.WriteLine(); k++; } Console.WriteLine("end;"); if (vystupDoFilu) { sw.Close(); } } } }