Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2001-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 NBDistrict.h
15 : /// @author Daniel Krajzewicz
16 : /// @author Sascha Krieg
17 : /// @author Michael Behrisch
18 : /// @date Sept 2002
19 : ///
20 : // A class representing a single district
21 : /****************************************************************************/
22 : #pragma once
23 : #include <config.h>
24 :
25 : #include <vector>
26 : #include <string>
27 : #include <utility>
28 : #include "NBCont.h"
29 : #include <utils/common/Named.h>
30 : #include <utils/common/VectorHelper.h>
31 : #include <utils/geom/Position.h>
32 : #include <utils/geom/PositionVector.h>
33 :
34 :
35 : // ===========================================================================
36 : // class declarations
37 : // ===========================================================================
38 : class NBEdge;
39 : class OutputDevice;
40 :
41 :
42 : // ===========================================================================
43 : // class definitions
44 : // ===========================================================================
45 : /**
46 : * @class NBDistrict
47 : * @brief A class representing a single district
48 : *
49 : * A "district" is an area within the network which may be referenced by
50 : * O/D-matrices. It stems from importing VISUM-networks. Work with VISUM-
51 : * -networks also made it necessary that a district knows the edges at
52 : * which new vehicles shall approach the simulated network (sources) and
53 : * those to use when leaving the network (sinks). These connections to the
54 : * network are weighted.
55 : *
56 : * Later work on VISUM required also parsing the shape of a district. This
57 : * information is used by some external tools only, it is even not shown
58 : * within the GUI.
59 : *
60 : * @todo Recheck whether this can be somehow joined with ODDistrict
61 : */
62 : class NBDistrict : public Named {
63 : public:
64 : /** @brief Constructor with id, and position
65 : *
66 : * @param[in] id The id of the district
67 : * @param[in] pos The position of the district
68 : */
69 : NBDistrict(const std::string& id, const Position& pos);
70 :
71 :
72 : /** @brief Constructor without position
73 : *
74 : * The position must be computed later
75 : *
76 : * @param[in] id The id of the district
77 : */
78 : NBDistrict(const std::string& id);
79 :
80 :
81 : /// @brief Destructor
82 : ~NBDistrict();
83 :
84 :
85 : /** @brief Adds a source
86 : *
87 : * It is checked whether the edge has already been added as a source. false
88 : * is returned in this case. Otherwise, the source is pushed into
89 : * the list of sources and the weight into the list of source weights.
90 : * both lists stay sorted this way. true is returned.
91 : *
92 : * @param[in] source An edge that shall be used as source
93 : * @param[in] weight The weight of the source
94 : * @return Whether the source could be added (was not added before)
95 : * @todo Consider using only one list for sources/weights
96 : */
97 : bool addSource(NBEdge* const source, double weight);
98 :
99 :
100 : /** @brief Adds a sink
101 : *
102 : * It is checked whether the edge has already been added as a sink. false
103 : * is returned in this case. Otherwise, the sink is pushed into
104 : * the list of sink and the weight into the list of sink weights.
105 : * both lists stay sorted this way. true is returned.
106 : *
107 : * @param[in] sink An edge that shall be used as sink
108 : * @param[in] weight The weight of the sink
109 : * @return Whether the sink could be added (was not added before)
110 : * @todo Consider using only one list for sinks/weights
111 : */
112 : bool addSink(NBEdge* const sink, double weight);
113 :
114 :
115 : /** @brief Returns the position of this district's center
116 : *
117 : * @return The position of this district's center
118 : * @todo Recheck when this information is set/needed
119 : */
120 : const Position& getPosition() const {
121 0 : return myPosition;
122 : }
123 :
124 :
125 : /** @brief Sets the center coordinates
126 : *
127 : * @param[in] pos The new center to assign
128 : * @todo Recheck when this information is set/needed
129 : */
130 : void setCenter(const Position& pos);
131 :
132 :
133 : /** @brief Replaces incoming edges from the vector (sinks) by the given edge
134 : *
135 : * When an edge is split/joined/removed/etc., it may get necessary to replace prior
136 : * edges by new ones. This method replaces all occurrences of the edges from
137 : * "which" within incoming edges (sinks) by the given edge.
138 : *
139 : * The new sink edge's weight is the sum of the weights of the replaced edges.
140 : *
141 : * @param[in] which List of edges to replace
142 : * @param[in] by The replacement
143 : */
144 : void replaceIncoming(const EdgeVector& which, NBEdge* const by);
145 :
146 :
147 : /** @brief Replaces outgoing edges from the vector (source) by the given edge
148 : *
149 : * When an edge is split/joined/removed/etc., it may get necessary to replace prior
150 : * edges by new ones. This method replaces all occurrences of the edges from
151 : * "which" within outgoing edges (sources) by the given edge.
152 : *
153 : * The new source edge's weight is the sum of the weights of the replaced edges.
154 : *
155 : * @param[in] which List of edges to replace
156 : * @param[in] by The replacement
157 : */
158 : void replaceOutgoing(const EdgeVector& which, NBEdge* const by);
159 :
160 :
161 : /** @brief Removes the given edge from the lists of sources and sinks
162 : *
163 : * The according weights are removed, too.
164 : *
165 : * @param[in] e The edge to remove from sinks/sources
166 : */
167 : void removeFromSinksAndSources(NBEdge* const e);
168 :
169 :
170 : /** @brief Sets the shape of this district
171 : *
172 : * @param[in] p The new shape
173 : */
174 : void addShape(const PositionVector& p);
175 :
176 :
177 : /** @brief Returns the weights of the sources
178 : * @return The source weights
179 : */
180 : const std::vector<double>& getSourceWeights() const {
181 50 : return mySourceWeights;
182 : }
183 :
184 :
185 : /** @brief Returns the sources
186 : * @return The source edges
187 : */
188 : const std::vector<NBEdge*>& getSourceEdges() const {
189 : return mySources;
190 : }
191 :
192 :
193 : /** @brief Returns the weights of the sinks
194 : * @return The sink weights
195 : */
196 : const std::vector<double>& getSinkWeights() const {
197 50 : return mySinkWeights;
198 : }
199 :
200 :
201 : /** @brief Returns the sinks
202 : * @return The sink edges
203 : */
204 : const std::vector<NBEdge*>& getSinkEdges() const {
205 : return mySinks;
206 : }
207 :
208 :
209 : /** @brief Returns the shape
210 : * @return The district's shape
211 : */
212 : const PositionVector& getShape() const {
213 30 : return myShape;
214 : }
215 :
216 :
217 :
218 : /// @name Applying offset
219 : /// @{
220 :
221 : /** @brief Applies an offset to the district
222 : * @param[in] xoff The x-offset to apply
223 : * @param[in] yoff The y-offset to apply
224 : */
225 : void reshiftPosition(double xoff, double yoff);
226 :
227 : /// @brief mirror coordinates along the x-axis
228 : void mirrorX();
229 : /// @}
230 :
231 :
232 :
233 :
234 :
235 : private:
236 : /// @brief Definition of a vector of connection weights
237 : typedef std::vector<double> WeightsCont;
238 :
239 : /// @brief The sources (connection from district to network)
240 : EdgeVector mySources;
241 :
242 : /// @brief The weights of the sources
243 : WeightsCont mySourceWeights;
244 :
245 : /// @brief The sinks (connection from network to district)
246 : EdgeVector mySinks;
247 :
248 : /// @brief The weights of the sinks
249 : WeightsCont mySinkWeights;
250 :
251 : /// @brief The position of the district
252 : Position myPosition;
253 :
254 : /// @brief The shape of the dsitrict
255 : PositionVector myShape;
256 :
257 :
258 : private:
259 : /** invalid copy constructor */
260 : NBDistrict(const NBDistrict& s);
261 :
262 : /** invalid assignment operator */
263 : NBDistrict& operator=(const NBDistrict& s);
264 :
265 :
266 : };
|