Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2004-2024 German Aerospace Center (DLR) and others.
4 : // This program and the accompanying materials are made available under the
5 : // terms of the Eclipse Public License 2.0 which is available at
6 : // https://www.eclipse.org/legal/epl-2.0/
7 : // This Source Code may also be made available under the following Secondary
8 : // Licenses when the conditions for such availability set forth in the Eclipse
9 : // Public License 2.0 are satisfied: GNU General Public License, version 2
10 : // or later which is available at
11 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 : /****************************************************************************/
14 : /// @file PolygonDynamics.h
15 : /// @author Leonhard Luecken
16 : /// @date Apr 2019
17 : ///
18 : // A polygon, which holds a timeSpan for displaying dynamic properties
19 : /****************************************************************************/
20 :
21 :
22 : #pragma once
23 : #include <config.h>
24 :
25 : #include <memory>
26 : #include "SUMOPolygon.h"
27 : #include "utils/common/SUMOTime.h"
28 :
29 : class SUMOTrafficObject;
30 : class ShapeContainer;
31 : class SUMORTree;
32 :
33 : class PolygonDynamics {
34 : public:
35 : /**
36 : * @brief Constructor that takes a SUMOPolygon and adds timelines for the properties to be modified dynamically.
37 : * @param p Polygon to be modified
38 : * @param trackedObject A tracked object (nullptr indicates that no tracking is desired)
39 : * @param timeSpan Anchor time points
40 : * For animated polygons: assumed to have a size >= 2, and start at timeSpan[0]=0,
41 : * such that timeSpan[i+1] >= timeSpan[i])
42 : * If no animation is desired, give timeSpan == nullptr
43 : * @param ...Span property timelines (assumed to be either nullptr, or of size equal to timeSpan (in case of animated poly))
44 : * @param looped Whether the animation should restart when the last keyframe is reached. In that case
45 : * the animation jumps to the first keyframe as soon as the last is reached.
46 : * If looped==false, the controlled polygon is removed as soon as the timeSpan elapses.
47 : * @param rotate Whether the polygon shall be rotated with the tracked object.
48 : */
49 : PolygonDynamics(double creationTime,
50 : SUMOPolygon* p,
51 : SUMOTrafficObject* trackedObject,
52 : const std::vector<double>& timeSpan,
53 : const std::vector<double>& alphaSpan,
54 : bool looped,
55 : bool rotate);
56 : virtual ~PolygonDynamics();
57 :
58 : const std::string& getPolygonID() const {
59 241 : return myPolygon->getID();
60 : }
61 :
62 : SUMOPolygon* getPolygon() const {
63 2270 : return myPolygon;
64 : }
65 :
66 : inline const std::string& getTrackedObjectID() const {
67 262 : return myTrackedObjectID;
68 : }
69 :
70 : /// @brief Updates the polygon according to its timeSpan and follows the tracked object
71 : /// @param t Current sumo time step (in ms.) when this is called
72 : /// @returns Next desired update time.
73 : SUMOTime update(SUMOTime t);
74 :
75 : /// @brief Set the RTree
76 : void setRTree(SUMORTree* rtree) {
77 80 : myVis = rtree;
78 80 : }
79 :
80 : private:
81 :
82 : /// @brief Sets the alpha value for the shape's color
83 : void setAlpha(double alpha);
84 :
85 : /// @brief Initialize the object's position
86 : void initTrackedPosition();
87 :
88 : /// @brief The polygon this dynamics acts upon.
89 : SUMOPolygon* myPolygon;
90 :
91 : /// @brief Current time
92 : double myCurrentTime;
93 :
94 : /// @brief The last time the animation has been updated
95 : double myLastUpdateTime;
96 :
97 : /// @brief Whether this polygon is animated, i.e., whether
98 : /// timelines should be used to control properties.
99 : bool animated;
100 :
101 : /// @brief Whether animation should be looped.
102 : bool looped;
103 :
104 : /// @brief Whether this polygon tracks an object
105 : bool tracking;
106 :
107 : /// @brief Whether this polygon should be rotated with the tracked object
108 : bool rotate;
109 :
110 : /// @brief An object tracked by the shape, deletion by caller
111 : SUMOTrafficObject* myTrackedObject;
112 : std::string myTrackedObjectID;
113 :
114 : /// @brief Initial position of the tracked object
115 : std::unique_ptr<Position> myTrackedObjectsInitialPositon;
116 :
117 : /// @brief Initial angle of the tracked object
118 : double myTrackedObjectsInitialAngle;
119 :
120 : /// @brief the original shape of the polygon
121 : /// (in case of tracking another object, this is converted to relative
122 : /// coords wrt to the other objects initial position as origin)
123 : std::unique_ptr<PositionVector> myOriginalShape;
124 :
125 : /// @brief Time points corresponding to the anchor values of the dynamic properties
126 : /// @note Assumed to have a size >= 2, and start at timeSpan[0]=0, such that timeSpan[i+1] >= timeSpan[i]
127 : std::unique_ptr<std::vector<double> > myTimeSpan;
128 :
129 : /// @brief Pointer to the next time points in timeSpan
130 : /// @note These iterators are only valid if timeSpan != nullptr
131 : std::vector<double>::const_iterator myPrevTime;
132 : std::vector<double>::const_iterator myNextTime;
133 :
134 : /// @brief Alpha values corresponding to
135 : std::unique_ptr<std::vector<double> > myAlphaSpan;
136 : /// @brief Pointer to the next alpha points in alphaSpan
137 : /// @note These iterators are only valid if alphaSpan != nullptr
138 : std::vector<double>::const_iterator myPrevAlpha;
139 : std::vector<double>::const_iterator myNextAlpha;
140 :
141 : /// @brief RTree will be supplied in case of GUI simulation to be updated on move
142 : SUMORTree* myVis;
143 :
144 : };
|