コード例 #1
0
        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 + "";
        }
コード例 #2
0
        // 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;
        }
コード例 #3
0
        /*//沒紅燈
        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;
        }
コード例 #4
0
ファイル: Road.cs プロジェクト: pinchen/SmartTrafficSimulator
 public void VehicleExitRoad(Vehicle vehicle)
 {
     passedVehicles += vehicle.vehicle_weight;
     onRoadVehicleList.Remove(vehicle);
 }
コード例 #5
0
ファイル: Road.cs プロジェクト: pinchen/SmartTrafficSimulator
 public void VehicleEnterRoad(Vehicle vehicle)
 {
     arrivedVehicles += vehicle.vehicle_weight;
     onRoadVehicleList.Add(vehicle);
 }
コード例 #6
0
        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;
            //}
        }
コード例 #7
0
 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);
     }
 }
コード例 #8
0
 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);
     }
 }