1 package org.opentrafficsim.draw.graphs;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.djunits.value.vdouble.scalar.Duration;
7 import org.djunits.value.vdouble.scalar.Length;
8 import org.djunits.value.vdouble.scalar.Time;
9 import org.opentrafficsim.core.dsol.OTSSimulatorInterface;
10 import org.opentrafficsim.draw.graphs.GraphPath.Section;
11 import org.opentrafficsim.kpi.sampling.KpiLaneDirection;
12 import org.opentrafficsim.kpi.sampling.Sampler;
13 import org.opentrafficsim.kpi.sampling.SpaceTimeRegion;
14 import org.opentrafficsim.kpi.sampling.TrajectoryGroup;
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 public abstract class AbstractSamplerPlot extends AbstractSpaceTimePlot
31 {
32
33
34 private static final long serialVersionUID = 20181004L;
35
36
37 private final Sampler<?> sampler;
38
39
40 private final GraphPath<KpiLaneDirection> path;
41
42
43 private List<Time> lastUpdateTime = new ArrayList<>();
44
45
46 private List<List<TrajectoryGroup<?>>> trajectoriesCache = new ArrayList<>();
47
48
49
50
51
52
53
54
55
56
57 public AbstractSamplerPlot(final String caption, final Duration updateInterval, final OTSSimulatorInterface simulator,
58 final Sampler<?> sampler, final GraphPath<KpiLaneDirection> path, final Duration delay)
59 {
60 super(caption, updateInterval, simulator, delay, DEFAULT_INITIAL_UPPER_TIME_BOUND);
61 this.sampler = sampler;
62 this.path = path;
63 for (Section<KpiLaneDirection> section : path.getSections())
64 {
65 for (KpiLaneDirection kpiLaneDirection : section)
66 {
67 sampler.registerSpaceTimeRegion(new SpaceTimeRegion(kpiLaneDirection, Length.ZERO,
68 kpiLaneDirection.getLaneData().getLength(), Time.ZERO, Time.createSI(Double.MAX_VALUE)));
69 }
70 }
71 for (int i = 0; i < path.getNumberOfSeries(); i++)
72 {
73 this.trajectoriesCache.add(new ArrayList<>());
74 this.lastUpdateTime.add(null);
75 }
76 }
77
78
79
80
81
82
83 protected List<TrajectoryGroup<?>> getTrajectories(final int series)
84 {
85 if (this.lastUpdateTime.get(series) == null || this.lastUpdateTime.get(series).lt(getUpdateTime()))
86 {
87 List<TrajectoryGroup<?>> cache = new ArrayList<>();
88 for (Section<KpiLaneDirection> section : getPath().getSections())
89 {
90 cache.add(this.sampler.getTrajectoryGroup(section.getSource(series)));
91 }
92 this.trajectoriesCache.set(series, cache);
93 this.lastUpdateTime.set(series, getUpdateTime());
94 }
95 return this.trajectoriesCache.get(series);
96 }
97
98
99
100
101
102 protected final GraphPath<KpiLaneDirection> getPath()
103 {
104 return this.path;
105 }
106
107
108 @Override
109 protected final Length getEndLocation()
110 {
111 return getPath().getTotalLength();
112 }
113
114
115
116
117
118 protected final Sampler<?> getSampler()
119 {
120 return this.sampler;
121 }
122
123 }