Eclipse SUMO - Simulation of Urban MObility
NBNodeShapeComputer.h
Go to the documentation of this file.
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 /****************************************************************************/
20 // This class computes shapes of junctions
21 /****************************************************************************/
22 #pragma once
23 #include <config.h>
24 
26 
27 
28 // ===========================================================================
29 // class definitions
30 // ===========================================================================
31 class NBNode;
32 class NBEdge;
33 
34 
35 // ===========================================================================
36 // class declarations
37 // ===========================================================================
43 public:
45  NBNodeShapeComputer(const NBNode& node);
46 
49 
51  const PositionVector compute(bool forceSmall);
52 
54  double getRadius() const {
55  return myRadius;
56  }
57 
58 private:
59  typedef std::map<NBEdge*, PositionVector> GeomsMap;
60 
66  const PositionVector computeNodeShapeDefault(bool simpleContinuation);
67 
80 
82  void computeEdgeBoundaries(const EdgeVector& edges,
83  GeomsMap& geomsCCW,
84  GeomsMap& geomsCW);
85 
95  void joinSameDirectionEdges(const EdgeVector& edges, std::map<NBEdge*, std::set<NBEdge*> >& same, bool useEndpoints);
96 
104  const EdgeVector& all,
105  std::map<NBEdge*, std::set<NBEdge*> >& same,
106  GeomsMap& geomsCCW,
107  GeomsMap& geomsCW);
108 
118  const Position& begPoint, const Position& endPoint, int cornerDetail);
119 
130  static void initNeighbors(const EdgeVector& edges, const EdgeVector::const_iterator& current,
131  GeomsMap& geomsCW,
132  GeomsMap& geomsCCW,
133  EdgeVector::const_iterator& cwi,
134  EdgeVector::const_iterator& ccwi,
135  double& cad,
136  double& ccad);
137 
139  bool badIntersection(const NBEdge* e1, const NBEdge* e2, double distance);
140 
142  double closestIntersection(const PositionVector& geom1, const PositionVector& geom2, double offset);
143 
145  bool needsLargeTurn(NBEdge* e1, NBEdge* e2,
146  std::map<NBEdge*, std::set<NBEdge*> >& same) const;
147 
149  double getDefaultRadius(const OptionsCont& oc);
150 
152 
153  bool isDivided(const NBEdge* e, std::set<NBEdge*> same, const PositionVector& ccw, const PositionVector& cw) const;
154 
156  static double getExtraWidth(const NBEdge* e, SVCPermissions exclude);
157 
159  static double divisionWidth(const NBEdge* e, std::set<NBEdge*> same, const Position& p, const Position& p2);
160 
161 private:
163  const NBNode& myNode;
164 
166  double myRadius;
167 
169  double EXT;
170 
172 
173 private:
176 
177 };
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
Definition: NBCont.h:35
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
The representation of a single edge during network building.
Definition: NBEdge.h:92
Represents a single node (junction) during network building.
Definition: NBNode.h:66
This class computes shapes of junctions.
PositionVector getSmoothCorner(PositionVector begShape, PositionVector endShape, const Position &begPoint, const Position &endPoint, int cornerDetail)
Compute smoothed corner shape.
double closestIntersection(const PositionVector &geom1, const PositionVector &geom2, double offset)
return the intersection point closest to the given offset
const PositionVector computeNodeShapeSmall()
Computes the node geometry using normals.
double myRadius
the computed node radius
EdgeVector computeUniqueDirectionList(const EdgeVector &all, std::map< NBEdge *, std::set< NBEdge * > > &same, GeomsMap &geomsCCW, GeomsMap &geomsCW)
Joins edges.
bool isDivided(const NBEdge *e, std::set< NBEdge * > same, const PositionVector &ccw, const PositionVector &cw) const
double EXT
the maximum distance to search for a place where neighboring edges intersect and do not overlap
void computeEdgeBoundaries(const EdgeVector &edges, GeomsMap &geomsCCW, GeomsMap &geomsCW)
compute clockwise/counter-clockwise edge boundaries
double getRadius() const
get computed radius for node
std::map< NBEdge *, PositionVector > GeomsMap
NBNodeShapeComputer(const NBNode &node)
Constructor.
~NBNodeShapeComputer()
Destructor.
bool badIntersection(const NBEdge *e1, const NBEdge *e2, double distance)
NBNodeShapeComputer & operator=(const NBNodeShapeComputer &s)
Invalidated assignment operator.
const PositionVector computeNodeShapeDefault(bool simpleContinuation)
Computes the node geometry Edges with the same direction are grouped. Then the node geometry is built...
const PositionVector compute(bool forceSmall)
Computes the shape of the assigned junction.
const NBNode & myNode
The node to compute the geometry for.
void joinSameDirectionEdges(const EdgeVector &edges, std::map< NBEdge *, std::set< NBEdge * > > &same, bool useEndpoints)
Joins edges and computes ccw/cw boundaries.
void computeSameEnd(PositionVector &l1, PositionVector &l2)
static double divisionWidth(const NBEdge *e, std::set< NBEdge * > same, const Position &p, const Position &p2)
compute the width of the divider space for divided roads
double getDefaultRadius(const OptionsCont &oc)
determine the default radius appropriate for the current junction
static void initNeighbors(const EdgeVector &edges, const EdgeVector::const_iterator &current, GeomsMap &geomsCW, GeomsMap &geomsCCW, EdgeVector::const_iterator &cwi, EdgeVector::const_iterator &ccwi, double &cad, double &ccad)
Initialize neighbors and angles.
bool needsLargeTurn(NBEdge *e1, NBEdge *e2, std::map< NBEdge *, std::set< NBEdge * > > &same) const
whether the given edges (along with those in the same direction) requires a large turning radius
static const SVCPermissions SVC_LARGE_TURN
static double getExtraWidth(const NBEdge *e, SVCPermissions exclude)
compute with of rightmost lanes that exlude the given permissions
A storage for options typed value containers)
Definition: OptionsCont.h:89
A point in 2D or 3D with translation and scaling methods.
Definition: Position.h:37
A list of positions.