1   package org.opentrafficsim.demo.geometry;
2   
3   import java.awt.Color;
4   import java.rmi.RemoteException;
5   
6   import javax.naming.NamingException;
7   
8   import org.djunits.unit.util.UNITS;
9   import org.djunits.value.vdouble.scalar.Direction;
10  import org.djunits.value.vdouble.scalar.Length;
11  import org.djunits.value.vdouble.scalar.Speed;
12  import org.opentrafficsim.core.dsol.AbstractOTSModel;
13  import org.opentrafficsim.core.dsol.OTSSimulatorInterface;
14  import org.opentrafficsim.core.geometry.OTSGeometryException;
15  import org.opentrafficsim.core.geometry.OTSLine3D;
16  import org.opentrafficsim.core.geometry.OTSPoint3D;
17  import org.opentrafficsim.core.network.LinkType;
18  import org.opentrafficsim.core.network.NetworkException;
19  import org.opentrafficsim.draw.road.LaneAnimation;
20  import org.opentrafficsim.draw.road.ShoulderAnimation;
21  import org.opentrafficsim.road.network.OTSRoadNetwork;
22  import org.opentrafficsim.road.network.lane.CrossSectionLink;
23  import org.opentrafficsim.road.network.lane.Lane;
24  import org.opentrafficsim.road.network.lane.NoTrafficLane;
25  import org.opentrafficsim.road.network.lane.OTSRoadNode;
26  import org.opentrafficsim.road.network.lane.Shoulder;
27  import org.opentrafficsim.road.network.lane.changing.LaneKeepingPolicy;
28  
29  import nl.tudelft.simulation.dsol.SimRuntimeException;
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  public class TestModel extends AbstractOTSModel implements UNITS
42  {
43      
44  
45  
46      public TestModel(final OTSSimulatorInterface simulator)
47      {
48          super(simulator);
49      }
50  
51      
52      private static final long serialVersionUID = 1L;
53  
54      
55      private OTSRoadNetwork network = new OTSRoadNetwork("geometry test network", true);
56  
57      
58      @Override
59      public final void constructModel() throws SimRuntimeException
60      {
61          
62  
63          try
64          {
65              OTSRoadNode n0 = new OTSRoadNode(this.network, "N0", new OTSPoint3D(-25.0, 0.0), Direction.ZERO);
66              OTSRoadNode n1 = new OTSRoadNode(this.network, "N1", new OTSPoint3D(0.0, 0.0), Direction.ZERO);
67              CrossSectionLink l01 =
68                      new CrossSectionLink(this.network, "L01", n0, n1, network.getLinkType(LinkType.DEFAULTS.ROAD),
69                              new OTSLine3D(new OTSPoint3D[] {new OTSPoint3D(-25.0, 0.0), new OTSPoint3D(0.0, 0.0)}),
70                              this.simulator, LaneKeepingPolicy.KEEPRIGHT);
71  
72              OTSRoadNode n2 = new OTSRoadNode(this.network, "N2", new OTSPoint3D(25.0, 20.0), Direction.ZERO);
73              CrossSectionLink l12 =
74                      new CrossSectionLink(this.network, "L12", n1, n2, network.getLinkType(LinkType.DEFAULTS.ROAD),
75                              new OTSLine3D(new OTSPoint3D[] {new OTSPoint3D(0.0, 0.0), new OTSPoint3D(25.0, 20.0)}),
76                              this.simulator, LaneKeepingPolicy.KEEPRIGHT);
77  
78              OTSRoadNode n3 = new OTSRoadNode(this.network, "N3", new OTSPoint3D(50.0, 0.0), Direction.ZERO);
79              CrossSectionLink l23 =
80                      new CrossSectionLink(this.network, "L23", n2, n3, network.getLinkType(LinkType.DEFAULTS.ROAD),
81                              new OTSLine3D(new OTSPoint3D[] {new OTSPoint3D(25.0, 20.0), new OTSPoint3D(50.0, 0.0)}),
82                              this.simulator, LaneKeepingPolicy.KEEPRIGHT);
83  
84              OTSRoadNode n4 = new OTSRoadNode(this.network, "N4", new OTSPoint3D(75.0, -20.0), Direction.ZERO);
85              CrossSectionLink l34 =
86                      new CrossSectionLink(this.network, "L34", n3, n4, network.getLinkType(LinkType.DEFAULTS.ROAD),
87                              new OTSLine3D(new OTSPoint3D[] {new OTSPoint3D(50.0, 0.0), new OTSPoint3D(75.0, -20.0)}),
88                              this.simulator, LaneKeepingPolicy.KEEPRIGHT);
89  
90              OTSRoadNode n5 = new OTSRoadNode(this.network, "N5", new OTSPoint3D(100.0, 0.0), Direction.ZERO);
91              CrossSectionLink l45 =
92                      new CrossSectionLink(this.network, "L45", n4, n5, network.getLinkType(LinkType.DEFAULTS.ROAD),
93                              new OTSLine3D(new OTSPoint3D[] {new OTSPoint3D(75.0, -20.0), new OTSPoint3D(100.0, 0.0)}),
94                              this.simulator, LaneKeepingPolicy.KEEPRIGHT);
95  
96              OTSRoadNode n6 = new OTSRoadNode(this.network, "N6", new OTSPoint3D(125.0, 0.0), Direction.ZERO);
97              CrossSectionLink l56 =
98                      new CrossSectionLink(this.network, "L56", n5, n6, network.getLinkType(LinkType.DEFAULTS.ROAD),
99                              new OTSLine3D(new OTSPoint3D[] {new OTSPoint3D(100.0, 0.0), new OTSPoint3D(125.0, 0.0)}),
100                             this.simulator, LaneKeepingPolicy.KEEPRIGHT);
101 
102             OTSRoadNode n7 = new OTSRoadNode(this.network, "N7", new OTSPoint3D(300.0, 0.0), Direction.ZERO);
103             CrossSectionLink l67 =
104                     new CrossSectionLink(this.network, "L67", n6, n7, network.getLinkType(LinkType.DEFAULTS.ROAD),
105                             new OTSLine3D(new OTSPoint3D[] {new OTSPoint3D(125.0, 0.0), new OTSPoint3D(150.0, 0.0),
106                                     new OTSPoint3D(175.0, 20.0), new OTSPoint3D(200.0, 0.0), new OTSPoint3D(225.0, -20.0),
107                                     new OTSPoint3D(250.0, 0.0), new OTSPoint3D(300.0, 0.0)}),
108                             this.simulator, LaneKeepingPolicy.KEEPRIGHT);
109 
110             add2x2Lanes(l01);
111             add2x2Lanes(l12);
112             add2x2Lanes(l23);
113             add2x2Lanes(l34);
114             add2x2Lanes(l45);
115             add2x2Lanes(l56);
116             add2x2Lanes(l67);
117         }
118         catch (NetworkException | OTSGeometryException exception)
119         {
120             exception.printStackTrace();
121         }
122     }
123 
124     
125 
126 
127 
128 
129 
130 
131 
132 
133 
134 
135 
136 
137 
138 
139 
140 
141 
142 
143 
144 
145 
146 
147 
148 
149 
150 
151 
152 
153 
154 
155 
156 
157 
158     private void add2x2Lanes(final CrossSectionLink link) throws NetworkException, OTSGeometryException
159     {
160         
161         
162         Length m05 = new Length(0.5, METER);
163         Length m10 = new Length(1.0, METER);
164         Length m35 = new Length(3.5, METER);
165         Speed speedLimit = new Speed(100, KM_PER_HOUR);
166 
167         Shoulder sL = new Shoulder(link, "sL", new Length(9.0, METER), m10);
168 
169         Lane laneELL = new NoTrafficLane(link, "ELL", new Length(8.25, METER), new Length(8.25, METER), m05, m05);
170         Lane laneL1 = new Lane(link, "L1", new Length(6.25, METER), new Length(6.25, METER), m35, m35, null, speedLimit);
171         Lane laneL2 = new Lane(link, "L2", new Length(2.75, METER), new Length(2.75, METER), m35, m35, null, speedLimit);
172         Lane laneELM = new NoTrafficLane(link, "ELM", new Length(0.75, METER), new Length(0.75, METER), m05, m05);
173 
174         Shoulder sM = new Shoulder(link, "sM", new Length(0.0, METER), m10);
175 
176         Lane laneERM = new NoTrafficLane(link, "ERM", new Length(-0.75, METER), new Length(-0.75, METER), m05, m05);
177         Lane laneR2 = new Lane(link, "R2", new Length(-2.75, METER), new Length(-2.75, METER), m35, m35, null, speedLimit);
178         Lane laneR1 = new Lane(link, "R1", new Length(-6.25, METER), new Length(-6.25, METER), m35, m35, null, speedLimit);
179         Lane laneERR = new NoTrafficLane(link, "ERR", new Length(-8.25, METER), new Length(-8.25, METER), m05, m05);
180 
181         Shoulder sR = new Shoulder(link, "sR", new Length(-9.0, METER), m10);
182 
183         try
184         {
185             new LaneAnimation(laneELL, this.simulator, Color.GRAY);
186             new LaneAnimation(laneL1, this.simulator, Color.GRAY);
187             new LaneAnimation(laneL2, this.simulator, Color.GRAY);
188             new LaneAnimation(laneELM, this.simulator, Color.GRAY);
189             new LaneAnimation(laneERM, this.simulator, Color.GRAY);
190             new LaneAnimation(laneR2, this.simulator, Color.GRAY);
191             new LaneAnimation(laneR1, this.simulator, Color.GRAY);
192             new LaneAnimation(laneERR, this.simulator, Color.GRAY);
193 
194             new ShoulderAnimation(sL, this.simulator, Color.GREEN);
195             new ShoulderAnimation(sM, this.simulator, Color.GREEN);
196             new ShoulderAnimation(sR, this.simulator, Color.GREEN);
197         }
198         catch (NamingException | RemoteException ne)
199         {
200             
201         }
202     }
203 
204     
205     @Override
206     public final OTSRoadNetwork getNetwork()
207     {
208         return this.network;
209     }
210 
211 }