Branch data Line data Source code
1 : : // ----------------- BEGIN LICENSE BLOCK ---------------------------------
2 : : //
3 : : // Copyright (C) 2018-2021 Intel Corporation
4 : : //
5 : : // SPDX-License-Identifier: MIT
6 : : //
7 : : // ----------------- END LICENSE BLOCK -----------------------------------
8 : :
9 : : #include "ad/map/point/GeometryOperation.hpp"
10 : :
11 : : #include <algorithm>
12 : : #include "ad/map/access/Logging.hpp"
13 : : #include "ad/map/access/Operation.hpp"
14 : : #include "ad/map/point/Operation.hpp"
15 : :
16 : : namespace ad {
17 : : namespace map {
18 : : namespace point {
19 : :
20 : 47709 : Geometry createGeometry(const ECEFEdge &points, bool closed)
21 : : {
22 : 47709 : Geometry geometry;
23 : 47709 : geometry.isClosed = closed;
24 [ + - ]: 47709 : geometry.ecefEdge = points;
25 : 47709 : geometry.private_enuEdgeCache.enuVersion = 0;
26 [ + + + - : 47709 : geometry.isValid = (points.size() >= 2) && isValid(points);
+ - ]
27 [ + - ]: 47709 : geometry.length = calcLength(points);
28 : 47709 : return geometry;
29 : : }
30 : :
31 : 24 : ENUEdge getCachedENUEdge(Geometry const &geometry)
32 : : {
33 [ + - ]: 48 : auto coordinateTransform = access::getCoordinateTransform();
34 : 24 : ENUEdgeCache &mutable_enuEdgeCache = const_cast<Geometry *>(&geometry)->private_enuEdgeCache;
35 [ + - + - : 24 : if (!coordinateTransform || geometry.private_enuEdgeCache.enuVersion != coordinateTransform->getENURef())
+ + + + ]
36 : : {
37 : 23 : mutable_enuEdgeCache.enuEdge.clear();
38 : : }
39 [ + + ]: 24 : if (geometry.private_enuEdgeCache.enuEdge.empty())
40 : : {
41 [ + - ]: 23 : if (coordinateTransform)
42 : : {
43 [ + - + - ]: 23 : if (coordinateTransform->isENUValid())
44 : : {
45 [ + - ]: 23 : mutable_enuEdgeCache.enuVersion = coordinateTransform->getENURef();
46 [ + - ]: 23 : coordinateTransform->convert(geometry.ecefEdge, mutable_enuEdgeCache.enuEdge);
47 : : }
48 : : else
49 : : {
50 [ # # # # ]: 0 : access::getLogger()->error("Geometry::GetENU: ENU Reference Point not defined.");
51 : : }
52 : : }
53 : : else
54 : : {
55 [ # # # # ]: 0 : access::getLogger()->error("Geometry::GetENU: Coordinate transformations not defined.");
56 : : }
57 : : }
58 [ + - ]: 48 : return geometry.private_enuEdgeCache.enuEdge;
59 : : }
60 : :
61 : : /////////////
62 : : // Operations
63 : :
64 : 29 : bool isSuccessor(Geometry const &geometry, const Geometry &other)
65 : : {
66 [ + + - + : 29 : if (geometry.ecefEdge.empty() || other.ecefEdge.empty())
+ + ]
67 : : {
68 : 1 : return false;
69 : : }
70 [ + + ]: 28 : else if (geometry.ecefEdge.front() == other.ecefEdge.back())
71 : : {
72 : 8 : return true;
73 : : }
74 [ + + ]: 20 : else if (geometry.ecefEdge.back() == other.ecefEdge.back())
75 : : {
76 : 7 : return true;
77 : : }
78 : : else
79 : : {
80 : 13 : return false;
81 : : }
82 : : }
83 : :
84 : 26 : bool isPredecessor(Geometry const &geometry, const Geometry &other)
85 : : {
86 [ + + - + : 26 : if (geometry.ecefEdge.empty() || other.ecefEdge.empty())
+ + ]
87 : : {
88 : 1 : return false;
89 : : }
90 [ + + ]: 25 : else if (geometry.ecefEdge.front() == other.ecefEdge.front())
91 : : {
92 : 7 : return true;
93 : : }
94 [ + + ]: 18 : else if (geometry.ecefEdge.back() == other.ecefEdge.front())
95 : : {
96 : 5 : return true;
97 : : }
98 : : else
99 : : {
100 : 13 : return false;
101 : : }
102 : : }
103 : :
104 : 12 : bool haveSameStart(Geometry const &geometry, const Geometry &other)
105 : : {
106 [ + + - + : 12 : if (geometry.ecefEdge.empty() || other.ecefEdge.empty())
+ + ]
107 : : {
108 : 1 : return false;
109 : : }
110 : : else
111 : : {
112 : 11 : return geometry.ecefEdge.front() == other.ecefEdge.front();
113 : : }
114 : : }
115 : :
116 : 8 : bool haveSameEnd(Geometry const &geometry, const Geometry &other)
117 : : {
118 [ + + - + : 8 : if (geometry.ecefEdge.empty() || other.ecefEdge.empty())
+ + ]
119 : : {
120 : 1 : return false;
121 : : }
122 : : else
123 : : {
124 : 7 : return geometry.ecefEdge.back() == other.ecefEdge.back();
125 : : }
126 : : }
127 : :
128 : 1774820 : point::ECEFPoint getParametricPoint(Geometry const &geometry, const physics::ParametricValue &t)
129 : : {
130 : 1774820 : return point::getParametricPoint(geometry.ecefEdge, geometry.length, t);
131 : : }
132 : :
133 : 14 : void getParametricRange(Geometry const &geometry,
134 : : const physics::ParametricRange &trange,
135 : : ECEFEdge &outputEdge,
136 : : const bool revertOrder)
137 : : {
138 : 14 : outputEdge = point::getParametricRange(geometry.ecefEdge, geometry.length, trange);
139 [ + + ]: 14 : if (revertOrder)
140 : : {
141 : 5 : std::reverse(outputEdge.begin(), outputEdge.end());
142 : : }
143 : 14 : }
144 : :
145 : 10 : void getParametricRange(Geometry const &geometry,
146 : : const physics::ParametricRange &trange,
147 : : GeoEdge &outputEdge,
148 : : const bool revertOrder)
149 : : {
150 [ + - ]: 20 : ECEFEdge const ecefEdge = point::getParametricRange(geometry.ecefEdge, geometry.length, trange);
151 [ + - ]: 10 : outputEdge = toGeo(ecefEdge);
152 [ + + ]: 10 : if (revertOrder)
153 : : {
154 [ + - ]: 3 : std::reverse(outputEdge.begin(), outputEdge.end());
155 : : }
156 : 10 : }
157 : :
158 : 24 : void getParametricRange(Geometry const &geometry,
159 : : const physics::ParametricRange &trange,
160 : : ENUEdge &outputEdge,
161 : : const bool revertOrder)
162 : : {
163 [ + - ]: 24 : outputEdge = point::getParametricRange(getCachedENUEdge(geometry), geometry.length, trange);
164 [ + + ]: 24 : if (revertOrder)
165 : : {
166 : 9 : std::reverse(outputEdge.begin(), outputEdge.end());
167 : : }
168 : 24 : }
169 : :
170 : 1 : ECEFEdge getMiddleEdge(Geometry const &geometry, Geometry const &other)
171 : : {
172 : : return point::getLateralAlignmentEdge(
173 [ + - ]: 1 : geometry.ecefEdge, geometry.length, other.ecefEdge, other.length, physics::ParametricValue(0.5));
174 : : }
175 : :
176 : 952387 : physics::ParametricValue findNearestPointOnEdge(Geometry const &geometry, const point::ECEFPoint &pt)
177 : : {
178 : 952387 : return findNearestPointOnEdge(geometry.ecefEdge, geometry.length, pt);
179 : : }
180 : :
181 : : } // namespace point
182 : : } // namespace map
183 : : } // namespace ad
|