1 package org.opentrafficsim.animation.road;
2
3 import java.awt.BasicStroke;
4 import java.awt.Color;
5 import java.awt.Graphics2D;
6 import java.awt.geom.Path2D;
7 import java.awt.image.ImageObserver;
8 import java.rmi.RemoteException;
9 import java.util.Set;
10 import java.util.function.Supplier;
11
12 import javax.naming.NamingException;
13
14 import org.djutils.base.Identifiable;
15 import org.djutils.draw.point.DirectedPoint2d;
16 import org.opentrafficsim.animation.DrawLevel;
17 import org.opentrafficsim.animation.OtsRenderable;
18 import org.opentrafficsim.animation.PaintPolygons;
19 import org.opentrafficsim.animation.RenderableTextSource;
20 import org.opentrafficsim.animation.TextAlignment;
21 import org.opentrafficsim.animation.road.TrafficLightDetectorAnimation.TrafficLightDetectorData;
22
23 import nl.tudelft.simulation.naming.context.Contextualized;
24
25
26
27
28
29
30
31
32
33
34
35 public class TrafficLightDetectorAnimation extends OtsRenderable<TrafficLightDetectorData>
36 {
37
38 private final TrafficLightDetectorData detector;
39
40
41 private final Set<Path2D.Float> paths;
42
43
44 private final Text text;
45
46
47
48
49
50
51
52
53 public TrafficLightDetectorAnimation(final TrafficLightDetectorData detector, final Contextualized contextualized)
54 throws NamingException, RemoteException
55 {
56 super(detector, contextualized);
57 this.detector = detector;
58 this.paths = PaintPolygons.getPaths(this.detector.getAbsoluteContour().getPointList());
59 this.text = new Text(detector, detector::getId, 0.0f, 0.5f + 0.2f, TextAlignment.CENTER, Color.BLACK, contextualized);
60 }
61
62 @Override
63 public final void paint(final Graphics2D graphics, final ImageObserver observer)
64 {
65 graphics.setStroke(new BasicStroke(0.2f));
66 setRendering(graphics);
67 PaintPolygons.paintPaths(graphics, this.detector.getOccupancy() ? Color.BLUE : Color.BLACK, this.paths, false);
68 resetRendering(graphics);
69 }
70
71 @Override
72 public void destroy(final Contextualized contextProvider)
73 {
74 super.destroy(contextProvider);
75 this.text.destroy(contextProvider);
76 }
77
78 @Override
79 public final String toString()
80 {
81 return "TrafficLightDetectorAnimation [getSource()=" + this.getSource() + "]";
82 }
83
84
85
86
87
88
89
90
91
92
93
94
95 public static class Text extends RenderableTextSource<TrafficLightDetectorData, Text> implements DetectorData.Text
96 {
97
98
99
100
101
102
103
104
105
106
107
108
109 public Text(final TrafficLightDetectorData source, final Supplier<String> text, final float dx, final float dy,
110 final TextAlignment textPlacement, final Color color, final Contextualized contextualized)
111 throws RemoteException, NamingException
112 {
113 super(source, text, dx, dy, textPlacement, color, contextualized, RenderableTextSource.RENDERWHEN10);
114 }
115
116 @Override
117 public final String toString()
118 {
119 return "Text []";
120 }
121 }
122
123
124
125
126
127
128
129
130
131
132 public interface TrafficLightDetectorData extends DetectorData, Identifiable
133 {
134
135
136
137
138 boolean getOccupancy();
139
140 @Override
141 DirectedPoint2d getLocation();
142
143 @Override
144 default double getZ()
145 {
146 return DrawLevel.OBJECT.getZ();
147 }
148 }
149
150 }