예제 #1
0
        /// <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;
        }
예제 #2
0
        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");
        }
예제 #3
0
        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");
        }
예제 #4
0
 public ChildNodeSortiert(QuadratNode node, QuadratNode letzterWeg, Point target)
 {
     Node                      = node;
     LetzterWeg                = letzterWeg;
     Target                    = target;
     EntfernungTarget          = Utilities.EntfernungBerechnen(Node.MapQuadrat, Target);
     KuerzesteTargetEntfernung = false;
 }
예제 #5
0
        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();
            }
        }
예제 #6
0
 public PathInfo(Point stadtPos, QuadratNode startNode)
 {
     StadtPos      = stadtPos;
     StadtGefunden = false;
     Weg           = new List <QuadratNode> {
         startNode
     };
     StartNode = startNode;
 }
예제 #7
0
        /// <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
    }
예제 #8
0
 public QuaxInfo(Point quaxPos)
 {
     QuaxPos  = quaxPos;
     QuaxNode = null;
 }
예제 #9
0
 /// <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));
 }