private void SetBaseLevelRamp(clsSetBaseLevelRampArgs Args, PathfinderNode Node) { if ( Node.GetChildNodeCount == 0 ) { clsNodeTag NodeTag = (clsNodeTag)Node.Tag; sXY_int XY_int = MathUtil.PointGetClosestPosOnLine(Args.Connection.PassageNodeA.Pos, Args.Connection.PassageNodeB.Pos, NodeTag.Pos); float ConnectionLength = Convert.ToSingle((Args.Connection.PassageNodeA.Pos - Args.Connection.PassageNodeB.Pos).ToDoubles().GetMagnitude()); float Extra = ConnectionLength - Args.RampLength; float ConnectionPos = Convert.ToSingle((XY_int - Args.Connection.PassageNodeA.Pos).ToDoubles().GetMagnitude()); float RampPos = MathUtil.Clamp_sng((float)((ConnectionPos - Extra / 2.0F) / Args.RampLength), 0.0F, 1.0F); int Layer_NodeNum = Node.GetLayer_NodeNum; RampPos = (float)(1.0D - (Math.Cos(RampPos * Math.PI) + 1.0D) / 2.0D); if ( RampPos > 0.0F & RampPos < 1.0F ) { float Dist2 = Convert.ToSingle((NodeTag.Pos - XY_int).ToDoubles().GetMagnitude()); if ( Dist2 < Args.RampRadius ) { float Dist2Factor = 1.0F; //Math.Min(3.0F - 3.0F * Dist2 / 384.0F, 1.0F) 'distance fading if ( Args.BaseLevel.NodeLevels[Layer_NodeNum] == Conversion.Int(Args.BaseLevel.NodeLevels[Layer_NodeNum]) ) { Args.BaseLevel.NodeLevels[Layer_NodeNum] = Args.BaseLevel.NodeLevels[Layer_NodeNum] * (1.0F - Dist2Factor) + (Args.Connection.PassageNodeA.Level * (1.0F - RampPos) + Args.Connection.PassageNodeB.Level * RampPos) * Dist2Factor; } else { Args.BaseLevel.NodeLevels[Layer_NodeNum] = (Args.BaseLevel.NodeLevels[Layer_NodeNum] * (2.0F - Dist2Factor) + (Args.Connection.PassageNodeA.Level * (1.0F - RampPos) + Args.Connection.PassageNodeB.Level * RampPos) * Dist2Factor) / 2.0F; } } } } else { int A = 0; for ( A = 0; A <= Node.GetChildNodeCount - 1; A++ ) { SetBaseLevelRamp(Args, Node.get_GetChildNode(A)); } } }
public PathfinderNode GetRandomChildNode(PathfinderNode InputNode, int MinClearance) { if ( InputNode.GetClearance < MinClearance ) { return null; } if ( InputNode.GetChildNodeCount == 0 ) { return InputNode; } else { int A = 0; do { A = Convert.ToInt32(Conversion.Int(VBMath.Rnd() * InputNode.GetChildNodeCount)); } while ( InputNode.get_GetChildNode(A).GetClearance < MinClearance ); PathfinderNode ReturnResult = GetRandomChildNode(InputNode.get_GetChildNode(A), MinClearance); return ReturnResult; } }
private void SetBaseLevel(PathfinderNode Node, int NewLevel, clsBaseNodeLevels BaseLevel) { if ( Node.GetChildNodeCount == 0 ) { int A = 0; float Height = 0; float Lowest = NewLevel; for ( A = 0; A <= Node.GetConnectionCount - 1; A++ ) { Height = BaseLevel.NodeLevels[Node.get_GetConnection(A).GetOtherNode(Node).GetLayer_NodeNum]; if ( Height < Lowest ) { Lowest = Height; } } if ( NewLevel - Lowest > 1.0F ) { BaseLevel.NodeLevels[Node.GetLayer_NodeNum] = Lowest + 1.0F; } else { BaseLevel.NodeLevels[Node.GetLayer_NodeNum] = NewLevel; } } else { int A = 0; for ( A = 0; A <= Node.GetChildNodeCount - 1; A++ ) { SetBaseLevel(Node.get_GetChildNode(A), NewLevel, BaseLevel); } } }
public void CalcNodePos(PathfinderNode Node, ref Position.XY_dbl Pos, ref int SampleCount) { if ( Node.GetLayer.GetNetwork_LayerNum == 0 ) { clsNodeTag NodeTag = default(clsNodeTag); NodeTag = (clsNodeTag)Node.Tag; Pos.X += NodeTag.Pos.X; Pos.Y += NodeTag.Pos.Y; } else { int A = 0; for ( A = 0; A <= Node.GetChildNodeCount - 1; A++ ) { CalcNodePos(Node.get_GetChildNode(A), ref Pos, ref SampleCount); } SampleCount += Node.GetChildNodeCount; } }