public Boom(Boom obj) //voor deepcopy { this.xCoordinaat = obj.xCoordinaat; this.yCoordinaat = obj.yCoordinaat; this.id = obj.id; this.apenInBoom = obj.apenInBoom; }
public Log(Aap aap, Boom boom, TimeSpan elapsedTime, int seqNr) { Aap = aap; Boom = boom; ElapsedTime = elapsedTime; SeqNr = seqNr; }
private List <Boom> MaakBomen(Bitmap bitmap, int aantalBomen) { int id = 1; Random r = new Random(); List <Boom> bomen = new List <Boom>(); Graphics g = Graphics.FromImage(bitmap); Pen pen = new Pen(Color.Green, 1); for (int i = 0; i < aantalBomen; i++) { Boom boom = new Boom(id, r.Next(0, bitmap.Width), r.Next(0, bitmap.Height)); if (!bomen.Contains(boom)) { bomen.Add(boom); g.DrawCircle(pen, boom.X, boom.Y, 3); id++; } else { i--; } } return(bomen); }
private void Draw(Bitmap bm) { Graphics g = Graphics.FromImage(bm); //bomen Pen pen = new Pen(Color.GreenYellow, 1); foreach (Boom boom in bos.bomen) { g.DrawEllipse(pen, boom.xCoordinaat * 20, boom.yCoordinaat * 20, 17, 17); } //path Random r = new Random(); Color kleurke; foreach (Aap aap in bos.log.ontsnapteApen) { kleurke = Color.FromArgb(r.Next(1, 256), r.Next(1, 256), r.Next(1, 256)); for (int i = 0; i < aap.bezochteBomen.Count - 1; i++) { pen.Color = kleurke; Boom currentBoom = aap.bezochteBomen[i]; Boom nextBoom = aap.bezochteBomen[i + 1]; g.DrawLine(pen, currentBoom.xCoordinaat * 20 + 10, currentBoom.yCoordinaat * 20 + 10, nextBoom.xCoordinaat * 20 + 10, nextBoom.yCoordinaat * 20 + 10); } Boom eersteBoom = aap.bezochteBomen[0]; g.FillEllipse(new SolidBrush(kleurke), eersteBoom.xCoordinaat * 20, eersteBoom.yCoordinaat * 20, 17, 17); } }
private double LengteTussenBomen(Boom boom1, Boom boom2) { int verschilXWaarden = boom1.xCoordinaat - boom2.xCoordinaat; int verschilYWaarden = boom1.yCoordinaat - boom2.yCoordinaat; double lengte = Math.Sqrt(Math.Pow(verschilXWaarden, 2) + Math.Pow(verschilYWaarden, 2)); return(Math.Abs(lengte)); }
public Aap(Boom startBoom, int id, string naam) { bezochteBomen = new List <Boom> { startBoom }; this.id = id; this.naam = naam; }
private double DistanceToBorder(Boom boom, Bitmap bitmap) { return((new SortedSet <double>() { bitmap.Width - boom.Y, bitmap.Height - boom.X, boom.Y - 0, boom.X - 0 }).Min); }
private double LengteTussenAapEnRand(Aap aap) { Boom currentboom = aap.bezochteBomen.Last(); double lengte = (new List <double>() { yMaxWaarde - currentboom.yCoordinaat, xMaxWaarde - currentboom.xCoordinaat, currentboom.yCoordinaat - yMinWaarde, currentboom.xCoordinaat - xMinWaarde }).Min(); return(lengte); }
public async Task Escape(Bos bos, Stopwatch stopwatch) { Console.WriteLine($"start escape wood {bos.Id}"); DatabaseManager dbm = new DatabaseManager(@"Data Source=LAPTOP-1U6AQSEQ\SQLEXPRESS;Initial Catalog=EscapeFromTheWoods;Integrated Security=True"); List <Task> tasks = new List <Task>(); tasks.Add(Task.Run(() => dbm.AddWoodRecords(bos))); Random rnd = new Random(); for (int i = 0; i < bos.Apen.Count; i++) { Console.WriteLine($"{bos.Apen[i].Naam} starts escape"); Aap aap = bos.Apen[i]; stopwatch.Start(); Boom beginboom = bos.Bomen[rnd.Next(1, bos.Bomen.Count - 1)]; bos.Graphics.FillCircle(new SolidBrush(aap.Color), beginboom.X, beginboom.Y, 3); aap.TouchedBomen.Add(beginboom); int seqNr = 1; while (beginboom != null) { Log log = new Log(aap, beginboom, stopwatch.Elapsed, seqNr); aap.Logs.Add(log); Boom nieuweBoom = bos.Bomen.OrderBy(boom => BerekenAfstand(boom, beginboom)).Except(aap.TouchedBomen).First(); if (DistanceToBorder(beginboom, bos.Bitmap) > BerekenAfstand(beginboom, nieuweBoom)) { bos.Graphics.DrawLine(aap.Pen, beginboom.X, beginboom.Y, nieuweBoom.X, nieuweBoom.Y); aap.TouchedBomen.Add(nieuweBoom); beginboom = nieuweBoom; } else { beginboom = null; } Console.WriteLine(log.ToString()); tasks.Add(Task.Run(() => dbm.AddLogs(bos.Id, log))); tasks.Add(Task.Run(() => dbm.AddMonkeyRecords(bos.Id, log))); seqNr++; } Console.WriteLine($"{bos.Apen[i].Naam} has escaped"); } Writer writer = new Writer(); tasks.Add(Task.Run(() => writer.WriteLogs(bos))); Task.WaitAll(tasks.ToArray()); bos.Bitmap.Save(Path.Combine(@"C:\Users\davy\Documents\data\EscapeFromTheWoods", $"{bos.Id}_Escapethewoods.Jpeg"), ImageFormat.Jpeg); Console.WriteLine($"Stop escape wood {bos.Id}"); }
public string getSprongenLog() { StringBuilder sprongenLog = new StringBuilder(); int meestesprongen = ontsnapteApen.Max(a => a.bezochteBomen.Count); for (int i = 0; i < meestesprongen; i++) { foreach (Aap aap in ontsnapteApen) { if (i < aap.bezochteBomen.Count) { Boom currentBoom = aap.bezochteBomen[i]; sprongenLog.Append($"{aap.naam} is in tree {currentBoom.id} at ({currentBoom.xCoordinaat},{currentBoom.yCoordinaat})\n"); } } } return(sprongenLog.ToString()); }
public void SpringAap(Aap aap) { Tuple <double, Boom> result = null; double lengteRand = 0; Task zoekBoom = Task.Run(() => { result = ZoekDichtsteBoom(aap); }); Task lengte = Task.Run(() => { lengteRand = LengteTussenAapEnRand(aap); }); Task.WaitAll(zoekBoom, lengte); double dichtsteLengte = result.Item1; Boom dichtsteBoom = result.Item2; if (dichtsteLengte < lengteRand) { aap.Spring(dichtsteBoom); SpringAap(aap); } else { VerwijderAap(aap); } }
/// <summary> /// Initialiseerd bos zonder apen /// indien begrenzin maar 2 waardes heeft : xmax,ymax /// </summary> /// <param name="begrenzing">xmin,xmax,ymin,ymax</param> /// <param name="aantalBomen">generate aantal bomen</param> public Bos(List <int> begrenzing, int id, int aantalBomen) { log = new Log(); this.id = id; bomen = new List <Boom>(); apen = new List <Aap>(); if (begrenzing.Count > 2) { this.xMinWaarde = begrenzing[0]; this.xMaxWaarde = begrenzing[1]; this.yMinWaarde = begrenzing[2]; this.yMaxWaarde = begrenzing[3]; } else { this.xMaxWaarde = begrenzing[0]; this.yMaxWaarde = begrenzing[1]; } //Initialiseer random bomen Random r = new Random(); for (int i = 0; i < aantalBomen; i++) { int xCoordinaat = r.Next(xMinWaarde, xMaxWaarde); int yCoordinaat = r.Next(yMinWaarde, yMaxWaarde); Boom randomBoom = new Boom(xCoordinaat, yCoordinaat, i); if (!bomen.Contains(randomBoom)) { bomen.Add(randomBoom); } else { i--; } } }
private Tuple <double, Boom> ZoekDichtsteBoom(Aap aap) { Console.WriteLine($"start calculating escape route for wood: {id}, monkey: {aap.naam}"); Boom huidigeBoom = aap.bezochteBomen.Last(); double dichtste = double.MaxValue; Boom dichtsteBoom = null; foreach (Boom boom in bomen) { if (!aap.bezochteBomen.Contains(boom)) { double lengte = LengteTussenBomen(boom, huidigeBoom); if (lengte != 0) { if (lengte < dichtste) { dichtste = lengte; dichtsteBoom = boom; } } } } return(new Tuple <double, Boom>(dichtste, dichtsteBoom)); }
private double BerekenAfstand(Boom b1, Boom b2) { double afstand = Math.Sqrt(Math.Pow(b1.X - b2.X, 2) + Math.Pow(b1.Y - b2.Y, 2)); return(afstand); }
private static DataSet GetDataTables(Bos bos) { Console.WriteLine("getting info"); //WoodRecords DataTable woodRecords = new DataTable("WoodRecords"); woodRecords.Columns.Add("recordId", typeof(int)); woodRecords.Columns.Add("woodID", typeof(int)); woodRecords.Columns.Add("treeID", typeof(int)); woodRecords.Columns.Add("x", typeof(int)); woodRecords.Columns.Add("y", typeof(int)); woodRecords.PrimaryKey = new DataColumn[] { woodRecords.Columns["recordId"] }; //MonkeyRecords DataTable monkeyRecords = new DataTable("MonkeyRecords"); monkeyRecords.Columns.Add("recordID", typeof(int)); monkeyRecords.Columns.Add("monkeyID", typeof(int)); monkeyRecords.Columns.Add("monkeyName", typeof(string)); monkeyRecords.Columns.Add("woodID", typeof(int)); monkeyRecords.Columns.Add("seqnr", typeof(int)); monkeyRecords.Columns.Add("treeID", typeof(int)); monkeyRecords.Columns.Add("x", typeof(int)); monkeyRecords.Columns.Add("y", typeof(int)); monkeyRecords.PrimaryKey = new DataColumn[] { monkeyRecords.Columns["recordID"] }; //Logs DataTable logs = new DataTable("Logs"); logs.Columns.Add("Id", typeof(int)); logs.Columns.Add("woodID", typeof(int)); logs.Columns.Add("monkeyID", typeof(int)); logs.Columns.Add("message", typeof(string)); logs.PrimaryKey = new DataColumn[] { logs.Columns["Id"] }; #region datatables aanvullen //WoodRecords int bosId = bos.id; for (int i = 0; i < bos.bomen.Count; i++) { Boom currentBoom = bos.bomen[i]; woodRecords.Rows.Add(woodRecordID, bosId, currentBoom.id, currentBoom.xCoordinaat, currentBoom.yCoordinaat); woodRecordID++; } //MonkeyRecords for (int i = 0; i < bos.log.ontsnapteApen.Count; i++) { Aap currentAap = bos.log.ontsnapteApen[i]; for (int seqnr = 0; seqnr < currentAap.bezochteBomen.Count; seqnr++) { Boom currentBoom = currentAap.bezochteBomen[seqnr]; monkeyRecords.Rows.Add(monkeyRecordID, currentAap.id, currentAap.naam, bosId, seqnr, currentBoom.id, currentBoom.xCoordinaat, currentBoom.yCoordinaat); monkeyRecordID++; //Logs logs.Rows.Add(logID, bosId, currentAap.id, $"{currentAap.naam} is now in tree {currentBoom.id} at location ({currentBoom.xCoordinaat},{currentBoom.yCoordinaat})"); logID++; } } #endregion //create DataSet => kan gebruikt worden om xml mee te maken DataSet set = new DataSet("EscapeFromTheWoods"); set.Tables.Add(woodRecords); set.Tables.Add(monkeyRecords); set.Tables.Add(logs); return(set); }
public void Spring(Boom dichtsteBoom) { Console.WriteLine($"aap : {naam} is van {bezochteBomen.Last().xCoordinaat} , {bezochteBomen.Last().yCoordinaat} naar {dichtsteBoom.xCoordinaat}, {dichtsteBoom.yCoordinaat} Gesprongen"); bezochteBomen.Add(dichtsteBoom); dichtsteBoom.apenInBoom.Remove(this); }