/// <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; }