Пример #1
0
        /// <summary>
        /// Creates the surface for the Acceleration based on speed and distance (A(V,d))
        /// </summary>
        /// <returns></returns>
        public AccelerationSpeedDistanceSurface createAccelerationSpeedDistanceSurface(double expectedEndX, double expectedEndY)
        {
            AccelerationSpeedDistanceSurface retVal = new AccelerationSpeedDistanceSurface();

            foreach (Segment segment in Segments)
            {
                Graph graph = segment.Graph;
                FlatAccelerationSpeedCurve acc = graph.FlatAccelerationSpeedCurve(expectedEndY);
                for (int i = 0; i < acc.SegmentCount; i++)
                {
                    double start = segment.Start;
                    double end   = segment.End;
                    if (end == double.MaxValue)
                    {
                        end = expectedEndX;
                    }

                    ConstantCurveSegment <SiSpeed, SiAcceleration> seg = acc[i];
                    SurfaceTile tile = new SurfaceTile(
                        new SiDistance(start, SiDistance_SubUnits.Meter),
                        new SiDistance(end, SiDistance_SubUnits.Meter),
                        seg.X.X0,
                        seg.X.X1,
                        seg.Y
                        );
                    retVal.Tiles.Add(tile);
                }
            }

            return(retVal);
        }
 public SurfaceTile(SiDistance d0, SiDistance d1, SiSpeed v0, SiSpeed v1, SiAcceleration a)
 {
     myD = new ConstantCurveSegment<SiDistance, SiAcceleration>(d0, d1, a);
     myV = new ConstantCurveSegment<SiSpeed, SiAcceleration>(v0, v1, a);
 }
        /******************************************************************************************************/
        protected void Emit_Constant_Segment(StreamWriter swd, ConstantCurveSegment<SiDistance, SiSpeed> aSegment, SiSpeed v_offset, SiDistance d_offset)
        {
            SiDistance d0 = aSegment.X.X0;
            SiDistance d1 = aSegment.X.X1;

            Emit_d_V(swd, d0 + d_offset, aSegment.Get(d0) + v_offset);

            /*if (d1 - d0 > SiDistance.One)
            {
                SiDistance delta = SiDistance.One;
                SiDistance d = d0 + delta;
                do
                {
                    Emit_d_V(swd, d + d_offset, aSegment.Get(d) + v_offset);

                    d += delta;
                } while (d < d1);
            }*/

            Emit_d_V(swd, d1 + d_offset, aSegment.Get(d1) + v_offset);
        }
 /// <summary>
 ///     Finds the distance at which the curve intersects the MRSP speed
 /// </summary>
 /// <param name="next_position"></param>
 /// <param name="speed_limit_here"></param>
 /// <param name="dir"></param>
 /// <returns></returns>
 private static SiDistance IntersectMRSPSpeed(SiDistance next_position,
     ConstantCurveSegment<SiDistance, SiSpeed> speed_limit_here)
 {
     if (speed_limit_here.X.X0 >= next_position)
     {
         if (debug)
             Log.DebugFormat("  --> case_3  next_position {0,7:F2} -> {1,7:F2}", next_position.ToUnits(),
                 speed_limit_here.X.X0.ToUnits());
         next_position = speed_limit_here.X.X0;
     }
     return next_position;
 }