Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/utils/shapes/PolygonDynamics.h
169678 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2004-2025 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
return myPolygon->getID();
60
}
61
62
SUMOPolygon* getPolygon() const {
63
return myPolygon;
64
}
65
66
inline const std::string& getTrackedObjectID() const {
67
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
myVis = rtree;
78
}
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
};
145
146