/// <summary> /// Sortiert die child nodes nach Prioritaet /// </summary> /// <param name="letzterWeg">Die zuletzt gesetzte Weg Node</param> /// <param name="target">Das aktuelle Such Target</param> public void SortierChildNodes(QuadratNode letzterWeg, Point target) { if (ChildNodesSortiert == null) { ChildNodesSortiert = new ChildNodeSortiert[Nodes.Length]; for (var i = 0; i < Nodes.Length; i++) { ChildNodesSortiert[i] = new ChildNodeSortiert(Nodes[i], letzterWeg, target); } } else { for (var i = 0; i < ChildNodesSortiert.Length; i++) { ChildNodesSortiert[i].LetzterWeg = letzterWeg; ChildNodesSortiert[i].Target = target; } } Array.Sort(ChildNodesSortiert); var kuerzesteEntfernungIndex = 0; for (var i = 0; i < ChildNodesSortiert.Length; i++) { if (ChildNodesSortiert[i].EntfernungTarget < ChildNodesSortiert[kuerzesteEntfernungIndex].EntfernungTarget) { kuerzesteEntfernungIndex = i; } } ChildNodesSortiert[kuerzesteEntfernungIndex].KuerzesteTargetEntfernung = true; }
public override PathInfo SearchPath(PathInfo curStatus) { // Suche Start QuadratNode QuadratNode startQuadrat = null; for (var i = 0; i < StartQuadrate.Count; i++) { if (StartQuadrate[i].BeruehrtQuadratNode(curStatus.LetzterWeg)) { startQuadrat = StartQuadrate[i]; } } var status = curStatus; var aktuellesQuadrat = startQuadrat; if (startQuadrat != null) { while (!status.StadtGefunden) { Debug.Write("START QUADRAT: "); status = aktuellesQuadrat.SearchPath(status); if (status.StadtGefunden) // FERTIG { return(status); } // Sonst naechstes Start Quadrat var tempQuadrate01 = new List <QuadratNode>(); // Quadrate die den letzten Weg beruehren for (var i = 0; i < StartQuadrate.Count; i++) { if (StartQuadrate[i].BeruehrtQuadratNode(status.LetzterWeg)) { tempQuadrate01.Add(StartQuadrate[i]); } } var neuesQuadratGefunden = false; for (var i = 0; i < tempQuadrate01.Count; i++) { if (Utilities.EntfernungBerechnen(tempQuadrate01[i].MapQuadrat, status.StadtPos) < Utilities.EntfernungBerechnen(aktuellesQuadrat.MapQuadrat, status.StadtPos)) { aktuellesQuadrat = tempQuadrate01[i]; neuesQuadratGefunden = true; } } if (!neuesQuadratGefunden) { return(status); } } } throw new Exception("Start Node ist in keinem der Start Quadrate"); }
public override QuaxInfo SearchQuax(QuaxInfo curStatus) { QuadratNode quaxStartNode = null; for (var i = 0; i < StartQuadrate.Count; i++) { if (StartQuadrate[i].BeruehrtPoint(curStatus.QuaxPos)) { quaxStartNode = StartQuadrate[i]; } } if (quaxStartNode != null) { Debug.Write("START QUADRAT: "); var info = quaxStartNode.SearchQuax(curStatus); if (info.QuaxNode == null) { info.QuaxNode = quaxStartNode; } return(info); } throw new Exception("Quax ist in keinem der Start Quadrate"); }
public ChildNodeSortiert(QuadratNode node, QuadratNode letzterWeg, Point target) { Node = node; LetzterWeg = letzterWeg; Target = target; EntfernungTarget = Utilities.EntfernungBerechnen(Node.MapQuadrat, Target); KuerzesteTargetEntfernung = false; }
public override QuaxInfo SearchQuax(QuaxInfo curStatus) { if (MapQuadrat.MapTyp == MapQuadrat.MapTypen.Unbekannt) { if (NodeID == 0) { NodeID = MapQuadrat.GetMapTyp(); } else { MapQuadrat.GetMapTyp(); } } Console.Write( $"[{NodeID}] Node: ({MapQuadrat.LO_Eckpunkt.X}|{MapQuadrat.LO_Eckpunkt.Y}) -> ({MapQuadrat.RU_Eckpunkt.X}|{MapQuadrat.RU_Eckpunkt.Y}) - "); switch (MapQuadrat.MapTyp) { case MapQuadrat.MapTypen.Wasser: Console.WriteLine("Wasser"); throw new Exception("Quax ist in Wasser Node"); case MapQuadrat.MapTypen.Passierbar: Console.WriteLine("Passierbar"); Console.WriteLine( $"Quax gefunden: ({MapQuadrat.LO_Eckpunkt.X} | {MapQuadrat.LO_Eckpunkt.Y}) {MapQuadrat.Breite}"); curStatus.QuaxNode = this; return(curStatus); case MapQuadrat.MapTypen.Gemischt: Console.WriteLine("Gemischt"); QuadratNode nodeMitQuax = null; for (var i = 0; i < ChildNodes.Nodes.Length; i++) { if (ChildNodes.Nodes[i].BeruehrtPoint(curStatus.QuaxPos)) { nodeMitQuax = ChildNodes.Nodes[i]; } } if (nodeMitQuax == null) { throw new Exception("Quax ist in keinem inneren Quadrat"); } return(nodeMitQuax.SearchQuax(curStatus)); case MapQuadrat.MapTypen.Unbekannt: throw new Exception("Unbekannter Map Typ"); default: throw new ArgumentOutOfRangeException(); } }
public PathInfo(Point stadtPos, QuadratNode startNode) { StadtPos = stadtPos; StadtGefunden = false; Weg = new List <QuadratNode> { startNode }; StartNode = startNode; }
/// <summary> /// Berechnet die child nodes dieser Node /// </summary> private void CalculateChildNodes() { var neueBreite = (int)Math.Ceiling(MapQuadrat.Breite / 2d); QuadratNode[] nodes; if (neueBreite > 2) { nodes = new QuadratNode[] { new Node( new Point(MapQuadrat.RU_Eckpunkt.X - neueBreite, MapQuadrat.LO_Eckpunkt.Y), neueBreite), new Node(new Point(MapQuadrat.RU_Eckpunkt.X - neueBreite, MapQuadrat.RU_Eckpunkt.Y - neueBreite), neueBreite), new Node(new Point(MapQuadrat.LO_Eckpunkt.X, MapQuadrat.RU_Eckpunkt.Y - neueBreite), neueBreite), new Node(new Point(MapQuadrat.LO_Eckpunkt.X, MapQuadrat.LO_Eckpunkt.Y), neueBreite) } } ; else { nodes = new QuadratNode[] { new AbschlussNode( new Point(MapQuadrat.RU_Eckpunkt.X - neueBreite, MapQuadrat.LO_Eckpunkt.Y), neueBreite), new AbschlussNode( new Point(MapQuadrat.RU_Eckpunkt.X - neueBreite, MapQuadrat.RU_Eckpunkt.Y - neueBreite), neueBreite), new AbschlussNode(new Point(MapQuadrat.LO_Eckpunkt.X, MapQuadrat.RU_Eckpunkt.Y - neueBreite), neueBreite), new AbschlussNode(new Point(MapQuadrat.LO_Eckpunkt.X, MapQuadrat.LO_Eckpunkt.Y), neueBreite) } }; ChildNodes = new ChildNodes(nodes); } #endregion }
public QuaxInfo(Point quaxPos) { QuaxPos = quaxPos; QuaxNode = null; }
/// <summary> /// Ueberprueft, ob eine <see cref="QuadratNode" /> eine andere <see cref="QuadratNode" /> beruehrt /// </summary> /// <param name="other">Die andere Node</param> /// <returns>True wenn sich beide Nodes beruehren</returns> public bool BeruehrtQuadratNode(QuadratNode other) { return(MapQuadrat.BeruehrtQuadrat(other.MapQuadrat)); }