Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/netbuild/NBAlgorithms_Ramps.h
169665 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2012-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 NBAlgorithms_Ramps.h
15
/// @author Daniel Krajzewicz
16
/// @author Jakob Erdmann
17
/// @date 29. March 2012
18
///
19
// Algorithms for highway on-/off-ramps computation
20
/****************************************************************************/
21
#pragma once
22
#include <config.h>
23
24
#include <vector>
25
26
27
// ===========================================================================
28
// class declarations
29
// ===========================================================================
30
class NBNetBuilder;
31
class OptionsCont;
32
class NBNode;
33
class NBEdgeCont;
34
class NBDistrictCont;
35
36
37
// ===========================================================================
38
// class definitions
39
// ===========================================================================
40
// ---------------------------------------------------------------------------
41
// NBAlgorithms_Ramps
42
// ---------------------------------------------------------------------------
43
/* @class NBRampsComputer
44
* @brief Computes highway on-/off-ramps (if wished)
45
*/
46
class NBRampsComputer {
47
public:
48
/** @brief Computes highway on-/off-ramps (if wished)
49
* @param[in, changed] nb The network builder which contains the current network representation
50
* @param[in] oc The options container
51
*/
52
NBRampsComputer();
53
54
void computeRamps(NBNetBuilder& nb, OptionsCont& oc, bool mayAddOrRemove);
55
56
/// @brief suffix for newly generated on-ramp edges
57
static const std::string ADDED_ON_RAMP_EDGE;
58
59
private:
60
61
std::map<NBEdge*, double> myShiftedEdges;
62
63
64
/** @brief Determines whether the given node may be an on-ramp begin
65
* @param[in] cur The node to check
66
* @param[in] minHighwaySpeed The minimum speed limit a highway must have for being a highway
67
* @param[in] maxRampSpeed The maximum speed limit a ramp must have for being a ramp
68
* @param[in] noramps Edges that shall not be treated as ramps
69
* @param[in] minWeaveLength The minimum length for weaving areas
70
* @return Whether the node is assumed to be an on-ramp begin
71
*/
72
static bool mayNeedOnRamp(NBNode* cur, double minHighwaySpeed, double maxRampSpeed,
73
const std::set<std::string>& noramps, double minWeaveLength);
74
75
76
/** @brief Determines whether the given node may be an off-ramp end
77
* @param[in] cur The node to check
78
* @param[in] minHighwaySpeed The minimum speed limit a highway must have for being a highway
79
* @param[in] maxRampSpeed The maximum speed limit a ramp must have for being a ramp
80
* @param[in] noramps Edges that shall not be treated as ramps
81
* @return Whether the node is assumed to be an off-ramp end
82
*/
83
static bool mayNeedOffRamp(NBNode* cur, double minHighwaySpeed, double maxRampSpeed,
84
const std::set<std::string>& noramps);
85
86
87
/** @brief Builds an on-ramp starting at the given node
88
* @param[in] cur The node at which the on-ramp shall begin
89
* @param[in] nc The container of nodes
90
* @param[in] ec The container of edges
91
* @param[in] dc The container of districts
92
* @param[in] rampLength The wished ramp length
93
* @param[in] dontSplit Whether no edges shall be split
94
* @param[in, filled] incremented The list of edges which lane number was already incremented
95
*/
96
void buildOnRamp(NBNode* cur, NBNodeCont& nc, NBEdgeCont& ec, NBDistrictCont& dc, double rampLength, bool dontSplit, bool addLanes);
97
98
99
/** @brief Builds an off-ramp ending at the given node
100
* @param[in] cur The node at which the off-ramp shall end
101
* @param[in] nc The container of nodes
102
* @param[in] ec The container of edges
103
* @param[in] dc The container of districts
104
* @param[in] rampLength The wished ramp length
105
* @param[in] dontSplit Whether no edges shall be split
106
* @param[in, filled] incremented The list of edges which lane number was already incremented
107
*/
108
void buildOffRamp(NBNode* cur, NBNodeCont& nc, NBEdgeCont& ec, NBDistrictCont& dc, double rampLength, bool dontSplit, bool addLanes,
109
const std::set<NBNode*, ComparatorIdLess>& potOnRamps);
110
111
112
static void getOnRampEdges(NBNode* n, NBEdge** potHighway, NBEdge** potRamp, NBEdge** other);
113
static void getOffRampEdges(NBNode* n, NBEdge** potHighway, NBEdge** potRamp, NBEdge** other);
114
static bool determinedBySpeed(NBEdge** potHighway, NBEdge** potRamp);
115
static bool determinedByLaneNumber(NBEdge** potHighway, NBEdge** potRamp);
116
117
/** @brief Checks whether an on-/off-ramp can be bult here
118
*
119
* - none of the participating edges must be a macroscopic connector
120
* - ramp+highways together must have more lanes than the continuation
121
* - speeds must match the defined swells
122
* @param[in] potHighway The highway part to check
123
* @param[in] potRamp The ramp part to check
124
* @param[in] other The successor/predecessor edge
125
* @param[in] minHighwaySpeed The minimum speed limit a highway must have for being a highway
126
* @param[in] maxRampSpeed The maximum speed limit a ramp must have for being a ramp
127
* @param[in] noramps Edges that shall not be treated as ramps
128
* @return Whether a ramp can be built here
129
*/
130
static bool fulfillsRampConstraints(NBEdge* potHighway, NBEdge* potRamp, NBEdge* other, double minHighwaySpeed, double maxRampSpeed,
131
const std::set<std::string>& noramps);
132
133
134
/** @brief Moves the ramp to the right, as new lanes were added
135
* @param[in] ramp The ramp to move
136
* @param[in] addedLanes The number of added lanes
137
*/
138
void moveRampRight(NBEdge* ramp, int addedLanes);
139
140
/// @brief whether the edge has a mode that does not indicate a ramp edge
141
static bool hasWrongMode(NBEdge* edge);
142
143
/// @brief shift ramp geometry to merge smoothly with the motorway
144
static void patchRampGeometry(NBEdge* potRamp, NBEdge* first, NBEdge* potHighway, bool onRamp);
145
146
template <class T>
147
static std::string getUnusedID(const std::string& prefix, const T& objectCont) {
148
if (objectCont.retrieve(prefix) == nullptr) {
149
return prefix;
150
}
151
int i = 0;
152
std::string result = prefix + "#" + toString(i);
153
while (objectCont.retrieve(result) != nullptr) {
154
i++;
155
result = prefix + "#" + toString(i);
156
}
157
return result;
158
}
159
};
160
161