public void Split() { if ( NodeCount != 4 ) { Debugger.Break(); } float Value = 0; float BestValue = 0; PathfinderNode BestNodeA = null; PathfinderNode BestNodeB = null; PathfinderNode BestNodeC = null; PathfinderNode BestNodeD = null; var A = 0; var B = 0; var tmpNodeA = default(PathfinderNode); var tmpNodeB = default(PathfinderNode); var tmpNodeC = default(PathfinderNode); var tmpNodeD = default(PathfinderNode); PathfinderConnection tmpConnectionA = null; PathfinderConnection tmpConnectionB = null; var C = 0; var D = 0; var Children = new PathfinderNode[NodeCount]; for ( A = 0; A <= NodeCount - 1; A++ ) { Children[A] = Nodes[A]; } var ChildCount = NodeCount; var ThisLayer = Layer; Disband(); BestValue = float.MaxValue; for ( A = 0; A <= ChildCount - 1; A++ ) { tmpNodeA = Children[A]; for ( B = A + 1; B <= ChildCount - 1; B++ ) { tmpNodeB = Children[B]; for ( C = 0; C <= ChildCount - 1; C++ ) { if ( Children[C] != tmpNodeA && Children[C] != tmpNodeB ) { break; } } tmpNodeC = Children[C]; for ( D = C + 1; D <= ChildCount - 1; D++ ) { if ( Children[D] != tmpNodeA && Children[D] != tmpNodeB ) { break; } } tmpNodeD = Children[D]; for ( C = 0; C <= tmpNodeA.ConnectionCount - 1; C++ ) { tmpConnectionA = tmpNodeA.Connections[C]; if ( tmpConnectionA.GetOtherNode(tmpNodeA) == tmpNodeB ) { break; } } for ( D = 0; D <= tmpNodeC.ConnectionCount - 1; D++ ) { tmpConnectionB = tmpNodeC.Connections[D]; if ( tmpConnectionB.GetOtherNode(tmpNodeC) == tmpNodeD ) { break; } } if ( C < tmpNodeA.ConnectionCount & D < tmpNodeC.ConnectionCount ) { Value = tmpConnectionA.Value + tmpConnectionB.Value; if ( Value < BestValue ) { BestValue = Value; BestNodeA = tmpNodeA; BestNodeB = tmpNodeB; BestNodeC = tmpNodeC; BestNodeD = tmpNodeD; } } } } if ( BestNodeA != null ) { if ( ParentNode != null ) { tmpNodeA = ParentNode; tmpNodeA.Node_Remove(ParentNode_NodeNum); } else { tmpNodeA = null; } if ( tmpNodeA != null ) { tmpNodeA.CheckIntegrity(); } var NewNodeA = new PathfinderNode(ThisLayer); var NewNodeB = new PathfinderNode(ThisLayer); NewNodeA.Node_Add(BestNodeA); NewNodeA.Node_Add(BestNodeB); NewNodeA.SpanCalc(); BestNodeA.RaiseConnections(); BestNodeB.RaiseConnections(); NewNodeA.Layer.Network.FindParentNode_Add(NewNodeA); NewNodeB.Node_Add(BestNodeC); NewNodeB.Node_Add(BestNodeD); NewNodeB.SpanCalc(); BestNodeC.RaiseConnections(); BestNodeD.RaiseConnections(); NewNodeB.Layer.Network.FindParentNode_Add(NewNodeB); } else { Debugger.Break(); } }
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); } }