1 package org.opentrafficsim.demo;
2
3 import java.awt.Dimension;
4 import java.rmi.RemoteException;
5 import java.util.ArrayList;
6 import java.util.List;
7
8 import javax.naming.NamingException;
9
10 import org.djunits.value.vdouble.scalar.Duration;
11 import org.djunits.value.vdouble.scalar.Length;
12 import org.djunits.value.vdouble.scalar.Time;
13 import org.opentrafficsim.core.dsol.OTSAnimator;
14 import org.opentrafficsim.core.dsol.OTSSimulatorInterface;
15 import org.opentrafficsim.core.gtu.GTUDirectionality;
16 import org.opentrafficsim.core.network.DirectedLinkPosition;
17 import org.opentrafficsim.core.network.NetworkException;
18 import org.opentrafficsim.core.network.OTSNetwork;
19 import org.opentrafficsim.draw.core.OTSDrawingException;
20 import org.opentrafficsim.draw.graphs.AbstractPlot;
21 import org.opentrafficsim.draw.graphs.ContourDataSource;
22 import org.opentrafficsim.draw.graphs.ContourPlotAcceleration;
23 import org.opentrafficsim.draw.graphs.ContourPlotDensity;
24 import org.opentrafficsim.draw.graphs.ContourPlotFlow;
25 import org.opentrafficsim.draw.graphs.ContourPlotSpeed;
26 import org.opentrafficsim.draw.graphs.FundamentalDiagram;
27 import org.opentrafficsim.draw.graphs.FundamentalDiagram.Quantity;
28 import org.opentrafficsim.draw.graphs.GraphCrossSection;
29 import org.opentrafficsim.draw.graphs.GraphPath;
30 import org.opentrafficsim.draw.graphs.TrajectoryPlot;
31 import org.opentrafficsim.draw.graphs.road.GraphLaneUtil;
32 import org.opentrafficsim.kpi.sampling.KpiLaneDirection;
33 import org.opentrafficsim.road.network.lane.LaneDirection;
34 import org.opentrafficsim.road.network.sampling.RoadSampler;
35 import org.opentrafficsim.swing.gui.OTSAnimationPanel;
36 import org.opentrafficsim.swing.gui.OTSSimulationApplication;
37
38 import nl.tudelft.simulation.dsol.SimRuntimeException;
39 import nl.tudelft.simulation.dsol.swing.gui.TablePanel;
40 import nl.tudelft.simulation.dsol.swing.gui.inputparameters.TabbedParameterDialog;
41
42
43
44
45
46
47
48
49
50
51
52 public class CircularRoadSwing extends OTSSimulationApplication<CircularRoadModel>
53 {
54
55 private static final long serialVersionUID = 1L;
56
57
58
59
60
61
62
63
64 public CircularRoadSwing(final String title, final OTSAnimationPanel panel, final CircularRoadModel model)
65 throws OTSDrawingException
66 {
67 super(model, panel);
68
69
70
71 OTSNetwork network = model.getNetwork();
72 System.out.println(network.getLinkMap());
73 }
74
75
76 @Override
77 protected void addTabs()
78 {
79 addStatisticsTabs(getModel().getSimulator());
80 }
81
82
83
84
85
86 public static void main(final String[] args)
87 {
88 demo(true);
89 }
90
91
92
93
94
95 public static void demo(final boolean exitOnClose)
96 {
97 try
98 {
99 OTSAnimator simulator = new OTSAnimator();
100 final CircularRoadModel otsModel = new CircularRoadModel(simulator);
101 if (TabbedParameterDialog.process(otsModel.getInputParameterMap()))
102 {
103 simulator.initialize(Time.ZERO, Duration.ZERO, Duration.createSI(3600.0), otsModel);
104 OTSAnimationPanel animationPanel = new OTSAnimationPanel(otsModel.getNetwork().getExtent(),
105 new Dimension(800, 600), simulator, otsModel, DEFAULT_COLORER, otsModel.getNetwork());
106 CircularRoadSwing app = new CircularRoadSwing("Circular Road", animationPanel, otsModel);
107 app.setExitOnClose(exitOnClose);
108 }
109 else
110 {
111 if (exitOnClose)
112 {
113 System.exit(0);
114 }
115 }
116 }
117 catch (SimRuntimeException | NamingException | RemoteException | OTSDrawingException exception)
118 {
119 exception.printStackTrace();
120 }
121 }
122
123
124
125
126
127 protected final void addStatisticsTabs(final OTSSimulatorInterface simulator)
128 {
129 GraphPath<KpiLaneDirection> path01;
130 GraphPath<KpiLaneDirection> path0;
131 GraphPath<KpiLaneDirection> path1;
132 try
133 {
134 List<String> names = new ArrayList<>();
135 names.add("Left lane");
136 names.add("Right lane");
137 List<LaneDirection> start = new ArrayList<>();
138 start.add(new LaneDirection(getModel().getPath(0).get(0), GTUDirectionality.DIR_PLUS));
139 start.add(new LaneDirection(getModel().getPath(1).get(0), GTUDirectionality.DIR_PLUS));
140 path01 = GraphLaneUtil.createPath(names, start);
141 path0 = GraphLaneUtil.createPath(names.get(0), start.get(0));
142 path1 = GraphLaneUtil.createPath(names.get(1), start.get(1));
143 }
144 catch (NetworkException exception)
145 {
146 throw new RuntimeException("Could not create a path as a lane has no set speed limit.", exception);
147 }
148 RoadSampler sampler = new RoadSampler(simulator);
149 ContourDataSource<?> dataPool0 = new ContourDataSource<>(sampler, path0);
150 ContourDataSource<?> dataPool1 = new ContourDataSource<>(sampler, path1);
151 Duration updateInterval = Duration.createSI(10.0);
152
153 AbstractPlot plot = null;
154 GraphPath<KpiLaneDirection> path = null;
155 ContourDataSource<?> dataPool = null;
156
157 TablePanel trajectoryChart = new TablePanel(2, 2);
158 plot = new TrajectoryPlot("Trajectory all lanes", updateInterval, simulator, sampler, path01);
159 trajectoryChart.setCell(plot.getContentPane(), 0, 0);
160
161 List<KpiLaneDirection> lanes = new ArrayList<>();
162 List<Length> positions = new ArrayList<>();
163 lanes.add(path01.get(0).getSource(0));
164 lanes.add(path1.get(0).getSource(0));
165 positions.add(Length.ZERO);
166 positions.add(Length.ZERO);
167 List<String> names = new ArrayList<>();
168 names.add("Left lane");
169 names.add("Right lane");
170 DirectedLinkPosition linkPosition =
171 new DirectedLinkPosition(getModel().getPath(0).get(0).getParentLink(), 0.0, GTUDirectionality.DIR_PLUS);
172 GraphCrossSection<KpiLaneDirection> crossSection;
173 try
174 {
175 crossSection = GraphLaneUtil.createCrossSection(names, linkPosition);
176 }
177 catch (NetworkException exception)
178 {
179 throw new RuntimeException(exception);
180 }
181
182 plot = new FundamentalDiagram("Fundamental diagram Density-Flow", Quantity.DENSITY, Quantity.FLOW, simulator, sampler,
183 crossSection, true, Duration.createSI(60.0), false);
184 trajectoryChart.setCell(plot.getContentPane(), 1, 0);
185
186 plot = new FundamentalDiagram("Fundamental diagram Flow-Speed", Quantity.FLOW, Quantity.SPEED, simulator, sampler,
187 crossSection, false, Duration.createSI(60.0), false);
188 trajectoryChart.setCell(plot.getContentPane(), 1, 1);
189
190 getAnimationPanel().getTabbedPane().addTab(getAnimationPanel().getTabbedPane().getTabCount(), "Trajectories",
191 trajectoryChart);
192
193 for (int lane : new int[] { 0, 1 })
194 {
195 TablePanel charts = new TablePanel(3, 2);
196 path = lane == 0 ? path0 : path1;
197 dataPool = lane == 0 ? dataPool0 : dataPool1;
198
199 plot = new TrajectoryPlot("Trajectory lane " + lane, updateInterval, simulator, sampler, path);
200 charts.setCell(plot.getContentPane(), 0, 0);
201
202 plot = new ContourPlotDensity("Density lane " + lane, simulator, dataPool);
203 charts.setCell(plot.getContentPane(), 1, 0);
204
205 plot = new ContourPlotSpeed("Speed lane " + lane, simulator, dataPool);
206 charts.setCell(plot.getContentPane(), 1, 1);
207
208 plot = new ContourPlotFlow("Flow lane " + lane, simulator, dataPool);
209 charts.setCell(plot.getContentPane(), 2, 0);
210
211 plot = new ContourPlotAcceleration("Accceleration lane " + lane, simulator, dataPool);
212 charts.setCell(plot.getContentPane(), 2, 1);
213
214 getAnimationPanel().getTabbedPane().addTab(getAnimationPanel().getTabbedPane().getTabCount(), "stats lane " + lane,
215 charts);
216 }
217 }
218
219 }