Beispiel #1
0
        public void NodeLayer_Add(PathfinderLayer NewNodeLayer)
        {
            if (NodeLayerCount > 0)
            {
                NodeLayers[NodeLayerCount - 1].ParentLayer = NewNodeLayer;
            }

            Array.Resize(ref NodeLayers, NodeLayerCount + 1);
            NodeLayers[NodeLayerCount] = NewNodeLayer;
            NodeLayers[NodeLayerCount].Network_LayerNum = NodeLayerCount;
            NodeLayerCount++;
        }
Beispiel #2
0
        public void ForceDeallocate()
        {
            var A = 0;

            for (A = 0; A <= ConnectionCount - 1; A++)
            {
                Connections[A].ForceDeallocate();
            }
            Connections = null;
            Nodes       = null;
            ParentNode  = null;
            Layer       = null;
        }
        public void ForceDeallocate()
        {
            var A = 0;

            for (A = 0; A <= NodeCount - 1; A++)
            {
                Nodes[A].ForceDeallocate();
            }

            Nodes       = null;
            Connections = null;
            Network     = null;
            ParentLayer = null;
        }
Beispiel #4
0
        public PathfinderNode(PathfinderNetwork ParentNetwork)
        {
            var tmpLayer = default(PathfinderLayer);

            if (ParentNetwork.NodeLayerCount == 0)
            {
                tmpLayer = new PathfinderLayer(ParentNetwork);
            }
            else
            {
                tmpLayer = ParentNetwork.NodeLayers[0];
            }

            Layer = tmpLayer;
            tmpLayer.Node_Add(this);
        }
Beispiel #5
0
 public PathfinderNode(PathfinderLayer NewParentLayer)
 {
     Layer = NewParentLayer;
     Layer.Node_Add(this);
 }
Beispiel #6
0
        public void FindParent()
        {
            var            tmpNodeA      = default(PathfinderNode);
            float          BestScore     = 0;
            PathfinderNode BestNode      = null;
            float          Score         = 0;
            var            A             = 0;
            var            MakeNew       = default(bool);
            var            B             = 0;
            var            Count         = 0;
            var            C             = 0;
            var            Allow         = default(bool);
            var            tmpConnection = default(PathfinderConnection);
            var            DestNode      = default(PathfinderNode);

            if (NodeCount == 0 & Layer.Network_LayerNum > 0)
            {
                Debugger.Break();
                return;
            }

            if (ParentNode != null)
            {
                Debugger.Break();
                return;
            }

            BestScore = float.MaxValue;
            for (A = 0; A <= ConnectionCount - 1; A++)
            {
                tmpConnection = Connections[A];
                DestNode      = tmpConnection.GetOtherNode(this);
                tmpNodeA      = DestNode.ParentNode;
                if (tmpNodeA == null)
                {
                    tmpNodeA = tmpConnection.GetOtherNode(this);
                    Score    = tmpConnection.Value * (0.98F + App.Random.Next() * 0.04F);
                    if (Score < BestScore)
                    {
                        BestScore = Score;
                        BestNode  = tmpNodeA;
                        MakeNew   = true;
                    }
                }
                else
                {
                    //dont allow this to join to another when the other has 3 nodes and they only have one connection
                    if (tmpNodeA.NodeCount == 3)
                    {
                        Count = 0;
                        Allow = false;
                        for (B = 0; B <= tmpNodeA.NodeCount - 1; B++)
                        {
                            for (C = 0; C <= tmpNodeA.Nodes[B].ConnectionCount - 1; C++)
                            {
                                if (tmpNodeA.Nodes[B].Connections[C].GetOtherNode(tmpNodeA.Nodes[B]) == this)
                                {
                                    Count++;
                                    if (Count >= 2)
                                    {
                                        Allow = true;
                                        goto CountFinished;
                                    }
                                    break;
                                }
                            }
                        }
CountFinished:
                        1.GetHashCode(); //TODO: cleanup this loop
                    }
                    else
                    {
                        Allow = true;
                    }
                    if (Allow)
                    {
                        Score = (DestNode.SiblingSpan + tmpConnection.Value) * (0.98F + App.Random.Next() * 0.04F);
                        if (Score < BestScore)
                        {
                            BestScore = Score;
                            BestNode  = tmpNodeA;
                            MakeNew   = false;
                        }
                    }
                }
            }
            if (BestNode != null)
            {
                if (MakeNew)
                {
                    var tmpLayer = default(PathfinderLayer);
                    if (Layer.ParentLayer == null)
                    {
                        tmpLayer = new PathfinderLayer(Layer.Network);
                    }
                    else
                    {
                        tmpLayer = Layer.ParentLayer;
                    }
                    var NewNode = new PathfinderNode(tmpLayer);
                    NewNode.Node_Add(this);
                    NewNode.Node_Add(BestNode);
                    NewNode.SpanCalc();
                    RaiseConnections();
                    BestNode.RaiseConnections();
                    NewNode.Layer.Network.FindParentNode_Add(NewNode);
                }
                else
                {
                    if (BestNode != null)
                    {
                        BestNode.Node_Add(this);
                        if (BestNode.NodeCount >= 4)
                        {
                            BestNode.Split();
                        }
                        else
                        {
                            BestNode.SpanCalc();
                            RaiseConnections();
                            if (BestNode.ParentNode == null)
                            {
                                BestNode.Layer.Network.FindParentNode_Add(BestNode);
                            }
                        }
                    }
                }
            }
            else if (ConnectionCount > 0)
            {
                //it is part of a network but there is no suitable parent to join, so make a new isolated parent
                var tmpLayer = default(PathfinderLayer);
                if (Layer.ParentLayer == null)
                {
                    tmpLayer = new PathfinderLayer(Layer.Network);
                }
                else
                {
                    tmpLayer = Layer.ParentLayer;
                }
                var NewNode = new PathfinderNode(tmpLayer);
                NewNode.Node_Add(this);
                NewNode.SpanCalc();
                RaiseConnections();
                NewNode.Layer.Network.FindParentNode_Add(NewNode);
            }
        }