geometry/impl/Area.h
Go to the documentation of this file.
1 #pragma once
3 
8 
9 namespace lanelet {
10 namespace geometry {
11 namespace internal {
12 template <typename T>
13 struct GetGeometry<T, IfAr<T, void>> {
14  static inline auto twoD(const T& geometry) { return geometry.basicPolygonWithHoles2d(); }
15  static inline auto threeD(const T& geometry) { return geometry.basicPolygonWithHoles3d(); }
16 };
17 } // namespace internal
18 
19 template <typename AreaT>
20 IfAr<AreaT, bool> inside(const AreaT& area, const BasicPoint2d& point) {
21  return boost::geometry::covered_by(point, area.basicPolygonWithHoles2d());
22 }
23 
24 template <typename AreaT>
26  return boundingBox2d(traits::to2D(area.outerBoundPolygon()));
27 }
28 
29 template <typename AreaT>
31  return boundingBox3d(area.outerBoundPolygon());
32 }
33 
34 template <typename Area1T, typename Area2T>
35 IfAr<Area1T, bool> intersects2d(const Area1T& area, const Area2T& otherArea) {
36  if (area == otherArea) {
37  return true;
38  }
39  return intersects(area.basicPolygonWithHoles2d(), otherArea.basicPolygonWithHoles2d());
40 }
41 
42 template <typename AreaT>
43 IfAr<AreaT, bool> overlaps2d(const AreaT& area, const AreaT& otherArea) {
44  return overlaps2d(traits::to2D(area.outerBoundPolygon()), traits::to2D(otherArea.outerBoundPolygon()));
45 }
46 
47 template <typename AreaT>
48 IfAr<AreaT, bool> overlaps3d(const AreaT& area, const AreaT& otherArea, double heightTolerance) {
49  return overlaps3d(area.outerBoundPolygon(), otherArea.outerBoundPolygon(), heightTolerance);
50 }
51 
52 template <typename AreaT, typename LaneletT>
53 IfAr<AreaT, IfLL<LaneletT, bool>> overlaps2d(const AreaT& area, const LaneletT& lanelet) {
54  return overlaps2d(utils::to2D(area.outerBoundPolygon()), lanelet.polygon2d());
55 }
56 
57 template <typename AreaT, typename LaneletT>
58 IfAr<AreaT, IfLL<LaneletT, bool>> overlaps3d(const AreaT& area, const LaneletT& lanelet, double heightTolerance) {
59  return overlaps3d(area.outerBoundPolygon(), lanelet.polygon3d(), heightTolerance);
60 }
61 
62 inline bool leftOf(const ConstLanelet& right, const ConstArea& left) {
63  return utils::anyOf(left.outerBound(), [&right](auto& bound) { return bound.invert() == right.leftBound(); });
64 }
65 
66 inline bool rightOf(const ConstLanelet& left, const ConstArea& area) { return leftOf(left.invert(), area); }
67 
68 inline bool follows(const ConstLanelet& prev, const ConstArea& next) {
69  auto outer = next.outerBound();
70  return utils::anyOf(outer,
71  [p1 = prev.leftBound().back(), p2 = prev.rightBound().back()](const ConstLineString3d& ls) {
72  return (ls.front() == p1 && ls.back() == p2) || (ls.front() == p2 && ls.back() == p1);
73  });
74 }
75 
76 inline bool follows(const ConstArea& prev, const ConstLanelet& next) { return follows(next.invert(), prev); }
77 
78 inline bool adjacent(const ConstArea& area1, const ConstArea& area2) {
79  auto outer1 = area1.outerBoundPolygon();
80  auto outer2 = area2.outerBoundPolygon();
81  auto rotatedNext = [&ls = outer2](auto iter) { return iter + 1 == ls.end() ? ls.begin() : iter + 1; };
82  for (auto i = 0u; i < outer1.numSegments(); ++i) {
83  auto segment = outer1.segment(i);
84  auto second = std::find(outer2.begin(), outer2.end(), segment.second);
85  if (second != outer2.end() && *rotatedNext(second) == segment.first) {
86  return true;
87  }
88  }
89  return false;
90 }
91 
93  return utils::findIf(ar.outerBound(), [p1 = ll.leftBound().back(), p2 = ll.rightBound().back()](auto& boundLs) {
94  return (boundLs.back() == p1 && boundLs.front() == p2);
95  });
96 }
97 
99  return determineCommonLinePreceding(ll.invert(), ar);
100 }
101 
103  const ConstLanelet& ll) {
104  return utils::findIf(ar.outerBound(), [p1 = ll.leftBound().front(), p2 = ll.rightBound().front(),
105  p3 = ll.leftBound().back(), p4 = ll.rightBound().back()](auto& boundLs) {
106  return ((boundLs.back() == p2 && boundLs.front() == p1) || (boundLs.back() == p3 && boundLs.front() == p4));
107  });
108 }
109 
111  auto res = determineCommonLineLeft(ll, ar);
112  return res ? res : determineCommonLineRight(ll, ar);
113 }
114 
116  return utils::findIf(ar.outerBound(), [lb = ll.leftBound(), rb = ll.rightBound()](auto& boundLs) {
117  return boundLs == lb.invert() || boundLs == rb;
118  });
119 }
120 
122  return utils::findIf(ar1.outerBound(), [&ar2](auto& ar1Bound) {
123  return !!utils::findIf(ar2.outerBound(),
124  [ar1Bound = ar1Bound.invert()](auto& ar2Bound) { return ar2Bound == ar1Bound; });
125  });
126 }
127 
129  auto res = determineCommonLineFollowingOrPreceding(ar, ll);
130  return res ? res : determineCommonLineSideways(ar, ll);
131 }
132 
134  auto res = determineCommonLineRight(right.invert(), left);
135  if (res) {
136  return res->invert();
137  }
138  return {};
139 }
140 
142  return utils::findIf(right.outerBound(), [&left](auto& bound) { return bound == left.rightBound(); });
143 }
144 
145 } // namespace geometry
146 } // namespace lanelet
lanelet::geometry::intersects2d
IfAr< Area1T, bool > intersects2d(const Area1T &area, const Area2T &otherArea)
test whether two areas intersect in 2d.
Definition: geometry/impl/Area.h:35
lanelet::geometry::boundingBox3d
IfAr< AreaT, BoundingBox3d > boundingBox3d(const AreaT &area)
calculates 3d bounding box
Definition: geometry/impl/Area.h:30
lanelet::geometry::determineCommonLineFollowing
Optional< ConstLineString3d > determineCommonLineFollowing(const ConstArea &ar, const ConstLanelet &ll)
Definition: geometry/impl/Area.h:98
lanelet::geometry::follows
bool follows(const ConstLanelet &prev, const ConstArea &next)
Test whether area follows lanelet.
Definition: geometry/impl/Area.h:68
lanelet::traits::to2D
BoundingBox2d to2D(const BoundingBox3d &primitive)
Definition: primitives/BoundingBox.h:304
lanelet
Definition: Attribute.h:13
lanelet::geometry::inside
IfAr< AreaT, bool > inside(const AreaT &area, const BasicPoint2d &point)
Checks whether a point is within or at the border of a area.
Definition: geometry/impl/Area.h:20
lanelet::ConstLanelet::invert
ConstLanelet invert() const
returns the inverted lanelet
Definition: primitives/Lanelet.h:157
lanelet::ConstArea
A const (i.e. immutable) Area.
Definition: primitives/Area.h:114
p2
BasicPoint p2
Definition: LineStringGeometry.cpp:167
lanelet::geometry::determineCommonLineFollowingOrPreceding
Optional< ConstLineString3d > determineCommonLineFollowingOrPreceding(const ConstArea &ar, const ConstLanelet &ll)
Definition: geometry/impl/Area.h:102
Polygon.h
Area.h
lanelet::geometry::internal::GetGeometry< T, IfAr< T, void > >::threeD
static auto threeD(const T &geometry)
Definition: geometry/impl/Area.h:15
lanelet::ConstLineStringImpl::back
const ConstPointType & back() const noexcept
returns the last point (if it exist)
Definition: primitives/LineString.h:295
Point.h
lanelet::geometry::determineCommonLineRight
Optional< ConstLineString3d > determineCommonLineRight(const ConstLanelet &left, const ConstArea &right)
Definition: geometry/impl/Area.h:141
lanelet::Optional
boost::optional< T > Optional
Definition: Optional.h:7
Area.h
lanelet::geometry::determineCommonLineSideways
Optional< ConstLineString3d > determineCommonLineSideways(const ConstLanelet &ll, const ConstArea &ar)
Definition: geometry/impl/Area.h:110
lanelet::geometry::determineCommonLine
Optional< ConstLineString3d > determineCommonLine(const ConstArea &ar, const ConstLanelet &ll)
Definition: geometry/impl/Area.h:128
p1
BasicPoint p1
Definition: LineStringGeometry.cpp:166
lanelet::utils::findIf
auto findIf(ContainerT &&c, Func f)
Definition: Utilities.h:196
lanelet::geometry::overlaps2d
IfAr< AreaT, bool > overlaps2d(const AreaT &area, const AreaT &otherArea)
Definition: geometry/impl/Area.h:43
lanelet::BasicPoint2d
Eigen::Matrix< double, 2, 1, Eigen::DontAlign > BasicPoint2d
a simple 2d-point
Definition: primitives/Point.h:20
lanelet::geometry::internal::GetGeometry< T, IfAr< T, void > >::twoD
static auto twoD(const T &geometry)
Definition: geometry/impl/Area.h:14
lanelet::geometry::overlaps3d
IfAr< AreaT, bool > overlaps3d(const AreaT &area, const AreaT &otherArea, double heightTolerance)
Definition: geometry/impl/Area.h:48
lanelet::geometry::determineCommonLinePreceding
Optional< ConstLineString3d > determineCommonLinePreceding(const ConstLanelet &ll, const ConstArea &ar)
Definition: geometry/impl/Area.h:92
lanelet::ConstArea::outerBoundPolygon
CompoundPolygon3d outerBoundPolygon() const
get the outer bound as polygon
Definition: primitives/Area.h:159
lanelet::utils::anyOf
bool anyOf(const Container &c, Predicate &&p)
Definition: Utilities.h:216
lanelet::geometry::boundingBox2d
IfAr< AreaT, BoundingBox2d > boundingBox2d(const AreaT &area)
calculates an up-right 2d bounding box
Definition: geometry/impl/Area.h:25
lanelet::geometry::leftOf
bool leftOf(const ConstLanelet &right, const ConstArea &left)
Test whether area is left of lanelet.
Definition: geometry/impl/Area.h:62
lanelet::ConstLineStringImpl::front
const ConstPointType & front() const noexcept
returns the first point (if it exist)
Definition: primitives/LineString.h:286
lanelet::CompoundLineStringImpl::end
const_iterator end() const noexcept
returns an iterator to end of the points
Definition: CompoundLineString.h:154
lanelet::ConstLineString3d
A normal 3d linestring with immutable data.
Definition: primitives/LineString.h:521
Lanelet.h
lanelet::IfAr
std::enable_if_t< traits::isAreaT< T >(), RetT > IfAr
Definition: primitives/Area.h:364
lanelet::ConstArea::outerBound
ConstLineStrings3d outerBound() const
Get linestrings that form the outer bound.
Definition: primitives/Area.h:150
lanelet::ConstLanelet
An immutable lanelet.
Definition: primitives/Lanelet.h:131
lanelet::ConstLanelet::leftBound
ConstLineString3d leftBound() const
get the left bound.
Definition: primitives/Lanelet.h:160
lanelet::utils::find
auto find(ContainerT &&c, const ValueT &val)
Definition: Utilities.h:186
lanelet::geometry::rightOf
bool rightOf(const ConstLanelet &left, const ConstArea &area)
Test whether area is right of lanelet.
Definition: geometry/impl/Area.h:66
lanelet::ConstLanelet::rightBound
ConstLineString3d rightBound() const
get the right bound.
Definition: primitives/Lanelet.h:169
lanelet::geometry::determineCommonLineLeft
Optional< ConstLineString3d > determineCommonLineLeft(const ConstLanelet &right, const ConstArea &left)
Definition: geometry/impl/Area.h:133
lanelet::geometry::adjacent
bool adjacent(const ConstArea &area1, const ConstArea &area2)
Test if two areas are adjacent.
Definition: geometry/impl/Area.h:78


lanelet2_core
Author(s): Fabian Poggenhans
autogenerated on Thu Mar 6 2025 03:25:52