public VehicleInformation(Vehicle vehicle) { InitializeComponent(); this.Text = "車輛ID : " + vehicle.vehicle_ID; this.label_locatedRoad.Text = vehicle.locatedRoad.roadID+""; this.label_Speed.Text = vehicle.vehicle_speed_KMH + ""; this.label_weight.Text = vehicle.vehicle_weight + ""; if (vehicle.vehicle_state == 0) this.label_state.Text = "Stop"; else if (vehicle.vehicle_state == 1) { this.label_state.Text = "Running"; this.label_delayTime.Text = vehicle.travelTime_waiting + ""; } else if (vehicle.vehicle_state == 2) this.label_state.Text = "Cross Intersection"; else if (vehicle.vehicle_state == 3) { this.label_state.Text = "Waitting"; this.label_delayTime.Text = vehicle.travelTime_waiting + (Simulator.getCurrentTime() - vehicle.stoppedTime) + ""; } this.label_travelTime.Text = Simulator.getCurrentTime() - vehicle.createdTime +""; this.label_travelDistance.Text = vehicle.travelDistace_pixel + vehicle.location + ""; double avgSpeed = (vehicle.travelDistace_pixel * Simulator.mapScale) / (Simulator.getCurrentTime() - vehicle.createdTime); avgSpeed = Math.Round(avgSpeed * 3.6, 2, MidpointRounding.AwayFromZero); this.label_avgSpeed.Text = avgSpeed + ""; }
// Ref : Treiber, Martin; Hennecke, Ansgar; Helbing, Dirk (2000), "Congested traffic states in empirical observations and microscopic simulations", Physical Review E 62 (2): 1805–1824 public static double SpeedCalculation(Vehicle self, Vehicle front) { double deltaV = 0, netD = 0, sFunction = 0, velocity = 0; //No vehicle in front if (front == null) { //Located road signal is green if (self.locatedRoad.signalState == 0) { velocity = Simulator.VehicleManager.vehicleAccelerationFactor_KMH * (1 - Math.Pow(self.vehicle_speed_KMH / self.locatedRoad.speedLimit, 4)); } //Located road signal is yellow or red else { deltaV = self.vehicle_speed_KMH; netD = (self.locatedRoad.GetRoadLength() - 1) - self.location - self.vehicle_length; /*if (netD < self.safeDistance) netD = self.safeDistance;*/ sFunction = Simulator.VehicleManager.vehicleLength / 2 + self.vehicle_speed_KMH * Simulator.VehicleManager.vehicleSafeTime + (self.vehicle_speed_KMH * deltaV / (2 * Math.Sqrt(Simulator.VehicleManager.vehicleAccelerationFactor_KMH * Simulator.VehicleManager.vehicleBrakeFactor_KMH))); velocity = Simulator.VehicleManager.vehicleAccelerationFactor_KMH * (1 - Math.Pow(self.vehicle_speed_KMH / self.locatedRoad.speedLimit, 4) - Math.Pow(sFunction / netD, 2)); } } //Vehicle in front else { deltaV = self.vehicle_speed_KMH - front.vehicle_speed_KMH; double avgVehicleLength = (self.vehicle_length + front.vehicle_length) / 2; netD = front.location - self.location - avgVehicleLength; /*if (netD < self.safeDistance) netD = self.safeDistance;*/ sFunction = Simulator.VehicleManager.vehicleLength / 2 + self.vehicle_speed_KMH * Simulator.VehicleManager.vehicleSafeTime + (self.vehicle_speed_KMH * deltaV / (2 * Math.Sqrt(Simulator.VehicleManager.vehicleAccelerationFactor_KMH * Simulator.VehicleManager.vehicleBrakeFactor_KMH))); velocity = Simulator.VehicleManager.vehicleAccelerationFactor_KMH * (1 - Math.Pow(self.vehicle_speed_KMH / self.locatedRoad.speedLimit, 4) - Math.Pow(sFunction / netD, 2)); } velocity = Math.Round(velocity, 1, MidpointRounding.AwayFromZero); if (velocity < 0 && (velocity * -1) > Simulator.VehicleManager.vehicleBrakeFactor_KMH) velocity = Simulator.VehicleManager.vehicleBrakeFactor_KMH * -1; double nextSpeed = self.vehicle_speed_KMH + velocity; if (nextSpeed < 0) nextSpeed = 0; return nextSpeed; }
/*//沒紅燈 public static double[,] UpdateNormal(double[,] positionVelocity, Vehicles[] vehicleArray, double h) { int numberOfVehicles = Form1.numberOfCar + Form1.numberOfTruck; double[,] positionVelocityNew = new double[positionVelocity.Length, 2]; //[i][0] : 第i車的位子, [i][1] : 第i車的速度 double k1, w1; double[] temp; //從第一台車計算到i-1台(由左往右算) for (int i = 0; i < numberOfVehicles - 1; i++) { temp = VDot(positionVelocity[i, 0], positionVelocity[i, 1], positionVelocity[i + 1, 0], positionVelocity[i + 1, 1], vehicleArray[i]); k1 = h * temp[0]; w1 = h * temp[1]; positionVelocityNew[i, 0] = positionVelocity[i, 0] + k1; positionVelocityNew[i, 1] = positionVelocity[i, 1] + w1; //車子超出panel, 就放回路段起點, 變成ring road if (positionVelocityNew[i, 0] > (Form1.panel_Road.Width + vehicleArray[i].GetLength())) { positionVelocityNew[i, 0] = positionVelocityNew[i, 0] - Form1.panel_Road.Width; } //車子車速 < 0, 因為沒有倒車狀況, 所以變0 if (positionVelocityNew[i, 1] < 0) { positionVelocityNew[i, 1] = 0; } } temp = VDot(positionVelocity[numberOfVehicles - 1, 0], positionVelocity[numberOfVehicles - 1, 1], positionVelocity[0, 0], positionVelocity[0, 1], vehicleArray[numberOfVehicles - 1]); k1 = h * temp[0]; w1 = h * temp[1]; positionVelocityNew[numberOfVehicles - 1, 0] = positionVelocity[numberOfVehicles - 1, 0] + k1; positionVelocityNew[numberOfVehicles - 1, 1] = positionVelocity[numberOfVehicles - 1, 1] + w1; //車子超出panel, 就放回路段起點, 變成ring road if (positionVelocityNew[numberOfVehicles - 1, 0] > (Form1.panel_Road.Width + vehicleArray[numberOfVehicles - 1].GetLength())) { positionVelocityNew[numberOfVehicles - 1, 0] = positionVelocityNew[numberOfVehicles - 1, 0] - Form1.panel_Road.Width; } //車子車速 < 0, 因為沒有倒車狀況, 所以變0 if (positionVelocityNew[numberOfVehicles - 1, 1] < 0) { positionVelocityNew[numberOfVehicles - 1, 1] = 0; } return positionVelocityNew; } static int carBehindTrafficLight = 0; static double[] distanceToTrafficLight = new double[Form1.numberOfCar + Form1.numberOfTruck]; static double locatedOfTrafficLight = 670; //有紅燈 public static double[,] UpdateRedLight(double[,] positionVelocity, Vehicles[] vehicleArray, double h) { int numberOfVehicles = Form1.numberOfCar + Form1.numberOfTruck; double[,] positionVelocityNew = new double[positionVelocity.Length, 2]; //[i][0] : 第i車的位子, [i][1] : 第i車的速度 double k1, w1; double[] temp; double closest = -locatedOfTrafficLight; for (int i = 0; i < numberOfVehicles; i++) { distanceToTrafficLight[i] = positionVelocity[i, 0] - locatedOfTrafficLight; if (distanceToTrafficLight[i] >= closest) { if (distanceToTrafficLight[i] <= 0) { closest = distanceToTrafficLight[i]; carBehindTrafficLight = i; } } } //從第i台車計算到1台(由右往左算) for (int i = 0; i < numberOfVehicles; i++) { if (i == carBehindTrafficLight) { temp = VDot(positionVelocity[i, 0], positionVelocity[i, 1], locatedOfTrafficLight, 0, vehicleArray[i]); k1 = h * temp[0]; w1 = h * temp[1]; positionVelocityNew[i, 0] = positionVelocity[i, 0] + k1; positionVelocityNew[i, 1] = positionVelocity[i, 1] + w1; } else if (i == numberOfVehicles - 1) { temp = VDot(positionVelocity[i, 0], positionVelocity[i, 1], positionVelocity[0, 0], positionVelocity[0, 1], vehicleArray[i]); k1 = h * temp[0]; w1 = h * temp[1]; positionVelocityNew[i, 0] = positionVelocity[i, 0] + k1; positionVelocityNew[i, 1] = positionVelocity[i, 1] + w1; } else { temp = VDot(positionVelocity[i, 0], positionVelocity[i, 1], positionVelocity[i + 1, 0], positionVelocity[i + 1, 1], vehicleArray[i]); k1 = h * temp[0]; w1 = h * temp[1]; positionVelocityNew[i, 0] = positionVelocity[i, 0] + k1; positionVelocityNew[i, 1] = positionVelocity[i, 1] + w1; } //車子超出panel, 就放回路段起點, 變成ring road if (positionVelocityNew[i, 0] > (Form1.panel_Road.Width + vehicleArray[i].GetLength())) { positionVelocityNew[i, 0] = positionVelocityNew[i, 0] - Form1.panel_Road.Width; } //車子車速 < 0, 因為沒有倒車狀況, 所以變0 if (positionVelocityNew[i, 1] < 0) { positionVelocityNew[i, 1] = 0; } } return positionVelocityNew; }*/ public static double IDM(Vehicle self, Vehicle front) { double d, length, deltaV, netD, sFunction, result; d = Simulator.VehicleManager.vehicleLength / 2; length = Simulator.VehicleManager.vehicleLength; //現在是拿自己車的長度,因為每台車都假設是一樣長 if (front == null) { result = a * (1 - Math.Pow(self.vehicle_speed / u, 4)); } else { deltaV = self.vehicle_speed - front.vehicle_speed; netD = front.roadPointsIndex - length - self.roadPointsIndex; sFunction = d + self.vehicle_speed * t + (self.vehicle_speed * deltaV / (2 * Math.Sqrt(a * b))); result = a * (1 - Math.Pow(self.vehicle_speed / u, 4) - Math.Pow(sFunction / netD, 2)); } return result; }
public void VehicleExitRoad(Vehicle vehicle) { passedVehicles += vehicle.vehicle_weight; onRoadVehicleList.Remove(vehicle); }
public void VehicleEnterRoad(Vehicle vehicle) { arrivedVehicles += vehicle.vehicle_weight; onRoadVehicleList.Add(vehicle); }
public Vehicle CreateVehicle(Road startRoad,int Weight) { //if (startRoad.getRoadLength() - ((startRoad.WaittingVehicles()-1) * SimulatorConfiguration.vehicleLength) > SimulatorConfiguration.vehicleLength) //不超出道路 // { Vehicle newVehicle = new Vehicle(vehicleGenerateSerialID, Weight, startRoad); vehicleGenerateSerialID++; Simulator.UI.AddVehicle(newVehicle); vehicleList.Add(newVehicle.vehicle_ID,newVehicle); return newVehicle; //} }
public void RemoveVehicle(Vehicle vehicle) { if (this.InvokeRequired) { RemoveVehicleCallBack myRemoveVehicle = new RemoveVehicleCallBack(RemoveVehicle); this.Invoke(myRemoveVehicle, vehicle); } else { this.splitContainer_main.Panel2.Controls.Remove(vehicle); } }
public void AddVehicle(Vehicle vehicle) { if (this.InvokeRequired) { AddVehicleCallBack myAddVehicle = new AddVehicleCallBack(AddVehicle); this.Invoke(myAddVehicle, vehicle); } else { if(Simulator.vehicleGraphicFPS > 0) this.splitContainer_main.Panel2.Controls.Add(vehicle); } }