source: proiecte/ptvs/src/vnsim/vehicular/simulator/intersections/IntersectionWithoutTrafficLights.java @ 31

Last change on this file since 31 was 31, checked in by (none), 14 years ago
File size: 5.8 KB
Line 
1/************************************************************************************
2 * Copyright (C) 2008 by Politehnica University of Bucharest and Rutgers University
3 * All rights reserved.
4 * Refer to LICENSE for terms and conditions of use.
5 ***********************************************************************************/
6package vnsim.vehicular.simulator.intersections;
7
8
9import java.util.Collections;
10import java.util.Comparator;
11import java.util.Random;
12import java.util.ArrayList;
13
14import vnsim.map.object.Globals;
15import vnsim.vehicular.simulator.RouteSegment;
16
17
18
19public class IntersectionWithoutTrafficLights extends Intersection {
20       
21        /** <code>serialVersionUID</code> */
22        private static final long serialVersionUID = -5883719321862303634L;
23
24        public ArrayList<Boolean> mustStop; //indices corresponding with "segments" = must stop or not
25
26        public IntersectionWithoutTrafficLights() {
27        }
28
29        public void addCrossingSegment(DirectedRoadSegment drs) {
30                if(segments==null) {
31                        segments=new ArrayList<DirectedRoadSegment> ();
32                        mustStop=new ArrayList<Boolean> ();
33                }
34                if(!segments.contains(drs)) {
35                        segments.add(drs);
36                        mustStop.add(true);
37                }
38        }
39
40        public boolean mustStop(RouteSegment seg1, RouteSegment seg2) {
41                for(int i=0;i<segments.size();i++) {
42                        if(segments.get(i).isSameSegment(seg1))
43                                return mustStop.get(i);
44                }
45                System.out.println("ERROR! mustStop called, but segment not found in that intersection!");
46                System.out.println("Segment called: "+seg1+"; MY SEGS="+segments);
47                return false;
48        }
49
50        public boolean havePriority(RouteSegment seg1, RouteSegment seg2){
51                //have absolute priority? (yield to nobody)
52                //look through "segments"; the first 2 have priority
53                if((segments.get(0).isSameSegment(seg1)) && (segments.get(1).isSameSegment(seg2)))
54                        return true;
55                if((segments.get(0).isSameSegment(seg2)) && (segments.get(1).isSameSegment(seg1)))
56                        return true;
57                return false;
58        }
59
60        public double getMaximumSpeed(RouteSegment seg1, RouteSegment seg2) {
61                //look through "segments"
62                if(havePriority(seg1, seg2))
63                        return 40.0; //speed adjustment
64                if(mustStop(seg1, seg2))
65                        return 0.0;
66                return 20.0;
67        }
68
69        public double getInfluenceDistance(RouteSegment seg1, RouteSegment seg2) {
70                return 0.100;
71        }
72       
73        public double getInfluenceDistanceLaneChange(RouteSegment seg1, RouteSegment seg2) {
74                return 0.200;
75        }
76
77        public ArrayList<DirectedRoadSegment> yieldFor(RouteSegment seg1,
78                        RouteSegment seg2) {
79                //a vehicle coming on "seg1", going on "seg2"
80                //must yield to vehicles coming on which segments?
81
82                int i;
83                for(i=0;i<segments.size();i++) {
84                        if(segments.get(i).isSameSegment(seg1))
85                                break;
86                }
87                int j;
88                for(j=0;j<segments.size();j++) {
89                        if(segments.get(j).isSameSegment(seg2))
90                                break;
91                }
92                if(i==segments.size() || j==segments.size())
93                        System.out.println("*** ERROR! yieldFor - wrong parameters!");
94                //priority
95                if((i==0 && j==1) || (i==1 && j==0))
96                        return new ArrayList<DirectedRoadSegment>(); 
97
98                if(i==0 || i==1) {
99                        //yield to the other priority road, and only if going on "seg2"
100                        //means crossing it (to the left)
101                        if(i==0) {
102                                if(isOrder(0,1,j)) {
103                                        ArrayList<DirectedRoadSegment> ret=new ArrayList<DirectedRoadSegment> ();
104                                        ret.add(segments.get(1));
105                                        return ret;
106                                } else
107                                        return new ArrayList<DirectedRoadSegment> ();
108                        }
109                        if(i==1) {
110                                if(isOrder(1,0,j)) {
111                                        ArrayList<DirectedRoadSegment> ret=new ArrayList<DirectedRoadSegment> ();
112                                        ret.add(segments.get(0));
113                                        return ret;
114                                } else
115                                        return new ArrayList<DirectedRoadSegment> ();
116                        }
117                }
118
119                //I have an "yield" sign
120                ArrayList<DirectedRoadSegment> ret=new ArrayList<DirectedRoadSegment> ();
121
122                //I must yield to all roads which are between "seg1" and "seg2"
123                //(counter-clock-wise);
124                //Furthermore, if one of the priority roads is between "seg1" and "seg2", including "seg2",
125                //then I must also yield to the other priority road!
126                for(int k=0;k<segments.size();k++) {
127                        if(k==1 && ret.contains(segments.get(1)))
128                                continue;
129                        if(k!=j) {
130                                if(isOrder(i,k,j)) {
131                                        ret.add(segments.get(k));
132                                        if(k==0) {
133                                                ret.add(segments.get(1));
134                                        }
135                                        if(k==1) {
136                                                if(!ret.contains(segments.get(0)))
137                                                        ret.add(segments.get(0));
138                                        }
139                                }
140                        }
141                }
142
143                if(j==1) {
144                        //yield to 0
145                        if(!ret.contains(segments.get(0)))
146                                ret.add(segments.get(0));
147                }
148                if(j==0) {
149                        //yield to 1
150                        if(!ret.contains(segments.get(1)))
151                                ret.add(segments.get(1));
152                }
153                return ret;
154        }
155
156        public boolean hasTrafficLights() {
157                return false;
158        }
159
160        public void sort(Random generator){
161                Collections.sort(this.segments,new Comparator<DirectedRoadSegment>(){
162                        public int compare(DirectedRoadSegment s1,DirectedRoadSegment s2){
163                                int r1,r2,p1,p2;
164                                //System.out.println("COMPAR: "+s1+" CU "+s2);
165                                r1=s1.roadIndex;
166                                r2=s2.roadIndex;                               
167                                byte b1[];
168                                byte b2[];
169                               
170                                b1=Globals.map.roads.get(r1).getRoadinfo();
171                                b2=Globals.map.roads.get(r2).getRoadinfo();
172                                if(b1[1]<b2[1]){
173                                        return -1;
174                                }else{
175                                        if(b1[1]>b2[1]){
176                                                return 1;
177                                        }else{
178                                                p1=Globals.map.roads.get(r1).getPoints().size();
179                                                p2=Globals.map.roads.get(r2).getPoints().size();
180                                                if(p1>p2){
181                                                        return -1;
182                                                } else {
183                                                        if(p1<p2){
184                                                                return 1;
185                                                        }else{
186                                                                return 0;
187                                                        }
188                                                }
189                                        }
190                                }
191                        }
192                });
193                //System.out.println("Sort over1");
194
195                this.mustStop=new ArrayList<Boolean>();
196                this.mustStop.add(false);
197                this.mustStop.add(false);
198
199                for(int ll=2;ll<this.segments.size();ll++){
200                        this.mustStop.add(generator.nextBoolean());
201                }
202                //System.out.println("Sort over2");
203        }
204
205        public String toString() {
206                String ret="";
207                ret=ret+"Segs:"+segments+";MustStop="+mustStop;
208                return ret;
209        }
210}
Note: See TracBrowser for help on using the repository browser.