1 package org.opentrafficsim.road.gtu.lane.perception.categories;
2
3 import java.util.function.Supplier;
4
5 import org.djunits.value.vdouble.scalar.Length;
6 import org.djunits.value.vdouble.scalar.LinearDensity;
7 import org.opentrafficsim.core.gtu.GTU;
8 import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable.Intermediate;
9 import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable.PerceptionAccumulator;
10 import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable.PerceptionCollector;
11 import org.opentrafficsim.road.gtu.lane.perception.PerceptionCollectable.PerceptionFinalizer;
12 import org.opentrafficsim.road.gtu.lane.perception.categories.AnticipationDensity.CountAndDistance;
13
14
15
16
17
18
19
20
21
22
23
24
25 public class AnticipationDensity implements PerceptionCollector<LinearDensity, GTU, CountAndDistance>
26 {
27
28
29 @Override
30 public Supplier<CountAndDistance> getIdentity()
31 {
32 return new Supplier<CountAndDistance>()
33 {
34
35 @Override
36 public CountAndDistance get()
37 {
38 return new CountAndDistance();
39 }
40 };
41 }
42
43
44 @Override
45 public PerceptionAccumulator<GTU, CountAndDistance> getAccumulator()
46 {
47 return new PerceptionAccumulator<GTU, CountAndDistance>()
48 {
49
50 @Override
51 public Intermediate<CountAndDistance> accumulate(final Intermediate<CountAndDistance> intermediate,
52 final GTU object, final Length distance)
53 {
54 intermediate.getObject().increaseCount();
55 intermediate.getObject().setDistance(distance);
56 return intermediate;
57 }
58 };
59 }
60
61
62 @Override
63 public PerceptionFinalizer<LinearDensity, CountAndDistance> getFinalizer()
64 {
65 return new PerceptionFinalizer<LinearDensity, CountAndDistance>()
66 {
67
68 @Override
69 public LinearDensity collect(final CountAndDistance intermediate)
70 {
71 return LinearDensity.createSI(intermediate.getDistance().si / intermediate.getCount());
72 }
73 };
74 }
75
76
77
78
79
80
81
82
83
84
85
86
87
88 public static class CountAndDistance
89 {
90
91
92 private int count;
93
94
95 private Length distance;
96
97
98
99
100 public int getCount()
101 {
102 return this.count;
103 }
104
105
106
107
108 public void increaseCount()
109 {
110 this.count++;
111 }
112
113
114
115
116 public Length getDistance()
117 {
118 return this.distance;
119 }
120
121
122
123
124 public void setDistance(final Length distance)
125 {
126 this.distance = distance;
127 }
128 }
129
130 }