using System; using System.Collections.Generic; using System.Text; namespace OpenTraffic.Model.Simulator.Queue { class Shockwave { private const float defaultSpeed = 0.04f; private float startTime; private float speed; private float startPos; // private int stopIndex; private bool active; public bool Active { get { return active; } } public Shockwave() { Clear(); } public void Clear() { active = false; } public bool HasPassed(float time, float pos) { if (!active) return true; float shockWavePos = (time - startTime) * speed + startPos; return (shockWavePos > pos); } public void start(float startTime1, float startPos1, Link jam, Link exit) { active = true; this.startTime = startTime1; this.startPos = startPos1; this.speed = calculateSpeed(jam, exit); } private static float calculateSpeed(Link lj, Link le) { if (lj == null || le == null || lj.ModelLink.SpeedFlowActive == null) { return defaultSpeed; } float kj = lj.QueueDensity; float ke = le.Density; float vj = lj.ModelLink.SpeedFlowActive.GetSpeedByDensity(kj); float qj = vj * kj; float ve = le.ModelLink.Speed; if (le.ModelLink.SpeedFlowActive != null) { ve = le.ModelLink.SpeedFlowActive.GetSpeedByDensity(ke); } float qe = ve * ke; float speed = Math.Abs((qe - qj) / (ke - kj)); Console.WriteLine("shockwave speed calc: {0:#.##} = ({1:#.##} - {2:#.##}) / ({3:#.##} - {4:#.##})", speed, qe, qj, ke, kj); Console.WriteLine("\t speeds f({1:#.##}, {2:#.##}) - {0:#.##}", speed, vj, ve); return speed; } public override string ToString() { return ("shockwave at " + startTime + " started at pos " + (startPos) + " traveling with speed " + speed); } #if CHECK_METHOD public bool check(float startTime, float startPos, float speed) { if (this.startTime == startTime && this.startPos == startPos && this.speed == speed) { return true; } Console.WriteLine("!!!!!!!!!!!!! ooops "); Console.WriteLine(this); Console.WriteLine("shockwave at " + startTime + " started at pos " + (startPos) + " travelingwith speed " + speed); return false; } #endif } }