예제 #1
0
 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));
         }
     }
 }
예제 #2
0
        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;
            }
        }
예제 #3
0
 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);
         }
     }
 }
예제 #4
0
 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;
     }
 }