/// <summary>
        /// Provides the flat acceleration / speed curve for this graph
        /// </summary>
        /// <param name="expectedEnd">The expected end for the curve</param>
        /// <returns></returns>
        public FlatAccelerationSpeedCurve FlatAccelerationSpeedCurve(double expectedEnd)
        {
            FlatAccelerationSpeedCurve curve = new FlatAccelerationSpeedCurve();

            double totalSegmentSize = 0;
            int    segmentCount     = 0;

            foreach (Segment segment in Segments)
            {
                double start = segment.Start;
                if (start <= expectedEnd)
                {
                    double end = Math.Min(segment.End, expectedEnd);

                    totalSegmentSize = totalSegmentSize + (end - start);
                    segmentCount     = segmentCount + 1;

                    curve.Add(
                        new SiSpeed(segment.Start, SiSpeed_SubUnits.KiloMeter_per_Hour),
                        new SiSpeed(end, SiSpeed_SubUnits.KiloMeter_per_Hour),
                        new SiAcceleration(-segment.Expression.v0, SiAcceleration_SubUnits.Meter_per_SecondSquare));  // decelerations are negative
                }
            }

            return(curve);
        }
        /// <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 InputData()
 {
     AD_EB = new FlatAccelerationSpeedCurve();
     AD_SB = new FlatAccelerationSpeedCurve();
 }