1 #include <gtest/gtest.h> 3 #include <boost/geometry/algorithms/equals.hpp> 15 p11 =
Point3d(++
id, 0., 0., 0.);
16 p12 =
Point3d(++
id, 0., 1., 0.);
17 p13 =
Point3d(++
id, 0., 2., 1.);
18 p21 =
Point3d(++
id, 1., 0., 0.);
19 p22 =
Point3d(++
id, 2., 0., 0.);
20 p23 =
Point3d(++
id, -1., 2., 0.);
21 p31 =
Point3d(++
id, -1., 0., 2.);
22 p32 =
Point3d(++
id, 0., 1., 2.);
23 p33 =
Point3d(++
id, 1., 2., 2.);
24 p43 =
Point3d(++
id, 1, 1. + sqrt(3) / 3., 0.);
42 p3 =
Point2d(++
id, -1., 0., 0.);
67 std::vector<Point3d> points;
68 for (
auto i = 0; i < n; i++) {
69 points.push_back(
Point3d(++
id, i, y, 0));
95 std::vector<Point3d> points;
96 for (
auto i = 0; i < n; i++) {
97 points.push_back(
Point3d(++
id, i, y, 0));
104 template <
typename T>
130 template <
typename T>
131 auto getZ(
const T&
p) -> std::enable_if_t<!traits::is2D<T>(),
double> {
134 template <
typename T>
135 auto getZ(
const T& ) -> std::enable_if_t<traits::is2D<T>(),
double> {
156 template <
typename T>
159 template <
typename T>
162 template <
typename T>
165 template <
typename T>
168 template <
typename T>
171 template <
typename T>
174 template <
typename T>
177 template <
typename T>
180 template <
typename T>
183 template <
typename T>
185 using TwoDPoints = testing::Types<BasicPoint2d, Point2d, ConstPoint2d>;
188 CompoundLineString3d, CompoundHybridLineString2d, CompoundHybridLineString3d>;
189 using NormalLineStrings = testing::Types<LineString2d, LineString3d, ConstLineString2d, ConstLineString3d>;
191 CompoundHybridLineString3d, BasicLineString3d>;
193 CompoundHybridLineString2d, BasicLineString2d>;
198 CompoundLineString2d, CompoundLineString3d>;
200 CompoundHybridLineString3d>;
204 #ifndef TYPED_TEST_SUITE 206 #define TYPED_TEST_SUITE TYPED_TEST_CASE 220 this->ls1.setId(100);
221 EXPECT_EQ(100, this->ls1.id());
233 EXPECT_EQ(constLs, this->ls1);
237 auto xs =
utils::transform(this->ls1, [](
const auto& elem) {
return elem.x(); });
238 EXPECT_EQ(3ul, xs.size());
245 auto invertLs = this->ls1.invert();
246 auto ys =
utils::transform(invertLs, [](
const auto& elem) {
return elem.y(); });
247 ASSERT_EQ(3ul, ys.size());
254 auto invertLs = this->ls1.invert();
255 EXPECT_NE(invertLs, this->ls1);
256 EXPECT_EQ(invertLs.invert(), this->ls1);
257 this->ls1[0] = PointT(this->p21);
258 EXPECT_EQ(PointT(this->p21), invertLs[2]);
260 invertLs.push_back(this->p22);
261 EXPECT_EQ(this->p22.id(), this->ls1[0].id());
266 auto invertLs = this->ls1.invert();
267 auto it = invertLs.insert(invertLs.begin() + 1, PointT(this->p21));
268 EXPECT_EQ(PointT(this->p21), *it);
269 EXPECT_EQ(PointT(this->p21), this->ls1[2]);
273 auto invertLs = this->ls1.invert();
274 auto it = invertLs.erase(invertLs.begin() + 1);
275 EXPECT_EQ(2ul, this->ls1.size());
276 EXPECT_EQ(this->ls1.front(), *it);
280 auto invertLs = this->ls1.invert();
281 auto pts = std::vector<typename TypeParam::PointType>(this->ls2.begin(), this->ls2.end());
282 auto it = invertLs.insert(invertLs.end(), pts.begin(), pts.end());
283 EXPECT_EQ(it, invertLs.end() - 1);
284 EXPECT_LT(it, invertLs.end());
285 EXPECT_GT(it, invertLs.begin());
286 EXPECT_EQ(this->ls2.back(), invertLs.back());
290 auto invertLs = this->ls1.invert();
292 ASSERT_EQ(2ul, invertLs.size());
293 EXPECT_EQ(invertLs.front(), this->p13);
294 EXPECT_EQ(invertLs.back(), this->p12);
299 EXPECT_EQ(bbox.
min().x(), -1);
300 EXPECT_EQ(bbox.
min().y(), 0);
301 EXPECT_EQ(bbox.
max().x(), 2);
302 EXPECT_EQ(bbox.
max().y(), 2);
307 EXPECT_EQ(bbox.min().x(), 0);
308 EXPECT_EQ(bbox.min().y(), 0);
309 EXPECT_EQ(bbox.min().z(), 0);
310 EXPECT_EQ(bbox.max().x(), 0);
311 EXPECT_EQ(bbox.max().y(), 2);
312 EXPECT_EQ(bbox.max().z(), 1);
321 auto ls2 = this->getLinestringAt(0, 100);
322 auto ls1 = this->getLinestringAt(5, 100);
327 auto l = geometry::length(this->ls1);
329 if (traits::is2D<TypeParam>()) {
330 EXPECT_DOUBLE_EQ(2, l);
332 EXPECT_DOUBLE_EQ(1 + std::sqrt(2), l);
334 EXPECT_DOUBLE_EQ(1, lSeg1);
338 auto equal = [](
auto& ls1,
auto& ls2) {
339 return std::equal(ls1.begin(), ls1.end(), ls2.begin(), ls2.end(),
340 [](
auto&
p1,
auto&
p2) {
return p1.basicPoint() ==
p2.basicPoint(); });
342 typename TypeParam::BasicLineString basicLineString;
343 TypeParam convertedLineString;
344 auto testLs = this->ls1.invert();
345 boost::geometry::convert(testLs, basicLineString);
346 boost::geometry::convert(basicLineString, convertedLineString);
347 EXPECT_PRED2(equal, testLs, convertedLineString);
351 typename TypeParam::BasicPointType
p = this->ls2.front();
352 auto testLs = this->ls1.invert();
353 boost::geometry::append(testLs, p);
354 EXPECT_EQ(testLs.back().basicPoint(),
p);
359 ASSERT_EQ(2ul, lRatios.size());
360 if (traits::is2D<TypeParam>()) {
361 EXPECT_DOUBLE_EQ(0.5, lRatios[0]);
363 EXPECT_DOUBLE_EQ(1 / (1 + std::sqrt(2)), lRatios[0]);
369 ASSERT_EQ(2ul, lRatios.size());
370 EXPECT_DOUBLE_EQ(1, lRatios[1]);
374 const auto twoD = traits::is2D<TypeParam>();
375 const auto pos = twoD ? 1.5 : 1 + std::sqrt(0.5);
376 const auto l = geometry::length(this->ls1);
379 EXPECT_DOUBLE_EQ(
p.x(), 0);
380 EXPECT_DOUBLE_EQ(pInv.x(), 0);
381 EXPECT_DOUBLE_EQ(
p.y(), 1.5);
382 EXPECT_DOUBLE_EQ(pInv.y(), 1.5);
384 EXPECT_DOUBLE_EQ(
getZ(
p), 0.5);
385 EXPECT_DOUBLE_EQ(
getZ(pInv), 0.5);
390 const auto twoD = traits::is2D<TypeParam>();
391 auto pos = twoD ? 1.4 : 1 + std::sqrt(0.4);
392 const auto l = geometry::length(this->ls1);
395 EXPECT_EQ(
p, this->ls1[1]);
396 EXPECT_EQ(pInv, this->ls1[1]);
400 auto segment = this->ls1.segment(0);
401 EXPECT_EQ(2ul, this->ls1.numSegments());
402 EXPECT_EQ(segment.first, this->ls1[0]);
403 EXPECT_EQ(segment.second, this->ls1[1]);
407 auto lsInv = this->ls1.invert();
408 auto segment = lsInv.segment(0);
409 EXPECT_EQ(segment.first, lsInv[0]);
410 EXPECT_EQ(segment.second, lsInv[1]);
421 EXPECT_DOUBLE_EQ(-1.,
d);
423 EXPECT_DOUBLE_EQ(-std::sqrt(1.25), d2);
436 EXPECT_DOUBLE_EQ(-2.,
d);
438 EXPECT_DOUBLE_EQ(1, d2);
452 EXPECT_EQ(-std::sqrt(2), arcPoint.
distance);
453 EXPECT_EQ(0, arcPoint.
length);
456 EXPECT_EQ(1.5, arcPoint2.
length);
462 EXPECT_DOUBLE_EQ(0, projectedPoint.x());
463 EXPECT_DOUBLE_EQ(1.5, projectedPoint.y());
469 EXPECT_DOUBLE_EQ(0, projectedPoint.x());
470 EXPECT_DOUBLE_EQ(1.5, projectedPoint.y());
471 EXPECT_DOUBLE_EQ(0.5, projectedPoint.z());
476 auto ls = this->getLinestringAt(5, 100);
478 EXPECT_DOUBLE_EQ(0, projectedPoint.x());
479 EXPECT_DOUBLE_EQ(5, projectedPoint.y());
484 auto ls = this->getLinestringAt(5, 100);
486 EXPECT_DOUBLE_EQ(0, projectedPoint.x());
487 EXPECT_DOUBLE_EQ(5, projectedPoint.y());
488 EXPECT_DOUBLE_EQ(0, projectedPoint.z());
509 auto ls = this->getLinestringAt(5, 100);
516 auto ls = this->getLinestringAt(5, 100);
523 EXPECT_DOUBLE_EQ((points.first - points.second).norm(),
geometry::distance2d(this->ls1, this->ls2));
530 EXPECT_DOUBLE_EQ((points.first - points.second).norm(),
geometry::distance3d(this->ls1, this->ls2));
536 auto ls1 = this->getLinestringAt(0, 100);
537 auto ls2 = this->getLinestringAt(5, 100);
539 EXPECT_DOUBLE_EQ((points.first - points.second).norm(), 5);
545 auto ls1 = this->getLinestringAt(0, 100);
546 auto ls2 = this->getLinestringAt(5, 100);
548 EXPECT_DOUBLE_EQ((points.first - points.second).norm(), 5);
554 TypeParam ls3(20, {
Point3d(21, 2., 0., 0.),
Point3d(22, 1.5, 0.5, 0.)});
556 EXPECT_EQ(aligned.first, this->ls1);
557 EXPECT_EQ(aligned.second, ls3);
560 EXPECT_EQ(aligned.first.invert(), ls3);
561 EXPECT_EQ(aligned.second.invert(), this->ls1);
565 auto segment = this->ls1.segment(0);
566 EXPECT_DOUBLE_EQ(geometry::length(segment), 1.);
586 EXPECT_TRUE(boost::geometry::equals(ap,
BasicPoint2d{-2, 5}));
599 for (
size_t i = 0; i < ls.size(); ++i) {
600 EXPECT_NEAR(ap[i].x(), comp[i].x(), 1e-9);
601 EXPECT_NEAR(ap[i].y(), comp[i].y(), 1e-9);
620 EXPECT_TRUE(boost::geometry::equals(
623 EXPECT_TRUE(boost::geometry::equals(
634 EXPECT_TRUE(boost::geometry::equals(cs.first, refp));
637 EXPECT_TRUE(boost::geometry::equals(b2dcs.first,
utils::to2D(refp)));
639 EXPECT_TRUE(boost::geometry::equals(b3dcs.first, refp));
643 EXPECT_EQ(this->ls4.size(), 3ul);
646 EXPECT_TRUE(boost::geometry::equals(shifted,
BasicPoint2d(-1, 1. + sqrt(3) / 3)));
664 BasicLineString2d l1{
p1,
p2, p3, p4, p5, p6};
665 BasicLineString2d l2{
p1, p7, p8, p6};
667 EXPECT_TRUE(boost::geometry::equals(ret, l2));
683 BasicLineString2d l1{
p1,
p2, p3};
684 BasicLineString2d l2{
p1,
p2, p3a};
685 BasicLineString2d l3{
p1,
p2, p3b};
687 ASSERT_EQ(lss.size(), 2ul);
688 EXPECT_TRUE(boost::geometry::equals(lss.front(), BasicLineString2d{p4, p5}));
689 EXPECT_TRUE(boost::geometry::equals(lss.back(), BasicLineString2d{p6, p7}));
691 ASSERT_EQ(lss2.size(), 1ul);
692 EXPECT_TRUE(boost::geometry::equals(lss2.front(), BasicLineString2d{p4, p8, p9}));
694 ASSERT_EQ(lss3.size(), 1ul);
695 ASSERT_EQ(lss3.front().size(), 4ul);
696 EXPECT_TRUE(boost::geometry::equals(lss2.front(), BasicLineString2d{p4, p8, p9}));
716 BasicLineString2d l1{
p1,
p2, p3, p4, p5};
testing::Types< LineString2d, LineString3d, ConstLineString2d, ConstLineString3d, ConstHybridLineString2d, ConstHybridLineString3d, CompoundLineString2d, CompoundLineString3d, CompoundHybridLineString2d, CompoundHybridLineString3d > AllLineStrings
testing::Types< LineString2d, LineString3d, ConstLineString2d, ConstLineString3d, CompoundLineString2d, CompoundLineString3d > NonHybridLineStrings
IfLL< Lanelet1T, bool > intersects3d(const Lanelet1T &lanelet, const Lanelet2T &otherLanelet, double heightTolerance)
test whether two lanelets intersect in 2d.
static LineStringT getLinestringAt(double y, size_t n=100)
BasicPoints3d BasicLineString3d
double rangedLength(LineStringIterator start, LineStringIterator end)
A Linestring that returns BasicPoint2d instead of Point2d.
A Compound linestring in 3d (returns Point3d)
static constexpr const char Curbstone[]
Thrown when a geometric operation is not valid.
testing::Types< LineString2d, LineString3d > MutableLineStrings
ConstPrimitiveType< PrimitiveT > toConst(const PrimitiveT &primitive)
Converts a primitive to its matching const type.
BasicPoint2d fromArcCoords(const HybridLineStringT &hLineString, const BasicPoint2d &projStart, const size_t startIdx, const size_t endIdx, const double distance)
auto transform(Iterator begin, Iterator end, const Func f)
Eigen::Vector3d BasicPoint3d
a simple 3d-point
testing::Types< LineString2d, LineString3d, ConstLineString2d, ConstLineString3d, ConstHybridLineString2d, ConstHybridLineString3d > PrimitiveLineStrings
traits::BasicPointT< traits::PointType< LineStringT > > interpolatedPointAtDistance(LineStringT lineString, double dist)
typename LineStringTraits< LineStringT >::PointType PointType
BasicPoint2d fromArcCoordinates(const LineString2dT &lineString, const ArcCoordinates &arcCoords)
create a point by moving laterally arcCoords.distance from the linestring point at arcCoords...
BasicPoint2d shiftLateral(const LineString2dT &lineString, const size_t idx, const double offset, const PointVincinity &pv)
shiftLateral shift point along the bisectrix
A hybrid compound linestring in 2d (returns BasicPoint2d)
std::vector< BasicLineString2d > extractConvex(const LineString2dT &lineString, const double distance)
extractConvex get convex parts of line string offset by distance.
testing::Types< BasicLineString2d, BasicLineString3d > BasicLineStrings
auto getZ(const T &p) -> std::enable_if_t<!traits::is2D< T >(), double >
std::vector< double > lengthRatios(const LineStringT &lineString)
BasicPoint3d project(const LineString3dT &lineString, const BasicPoint3d &pointToProject)
Projects the given point in 3d to the LineString.
Describes a position in linestring coordinates.
A normal 3d linestring with immutable data.
traits::PointType< LineStringT > nearestPointAtDistance(LineStringT lineString, double dist)
returns the cosest point to a position on the linestring
const VectorType &() min() const
IfLS< LineString2dT, std::pair< BasicPoint2d, BasicPoint2d > > projectedPoint2d(const LineString2dT &l1, const LineString2dT &l2)
Computes the projected points on the two linestrings for the shortest distance.
std::vector< Point3d > Points3d
Eigen::AlignedBox3d BoundingBox3d
Convenience type for an axis aligned bounding box in 3d.
static constexpr const char Type[]
A normal 3d linestring with mutable data.
double curvature2d(const Point2dT &p1, const Point2dT &p2, const Point2dT &p3)
const VectorType &() max() const
std::vector< double > accumulatedLengthRatios(const LineStringT &lineString)
A Compound linestring in 2d (returns Point2d)
BasicLineString basicLineString() const noexcept
Create a basic linestring (ie a vector of Eigen Points)
BasicPoints2d BasicLineString2d
IfAr< AreaT, BoundingBox2d > boundingBox2d(const AreaT &area)
calculates an up-right 2d bounding box
Optional< double > distance
LineStringT invert(const LineStringT &ls)
static LineStringT getLinestringAt(double y, size_t n=100)
testing::Types< LineString3d, ConstLineString3d, ConstHybridLineString3d, CompoundLineString3d, CompoundHybridLineString3d, BasicLineString3d > ThreeDLineStrings
A Linestring that returns BasicPoint3d instead of Point3d.
double distance
signed distance to linestring (left=positive)
testing::Types< ConstHybridLineString2d, ConstHybridLineString3d, CompoundHybridLineString2d, CompoundHybridLineString3d > HybridLineStrings
IfLS2< LineString3d1T, LineString3d2T, double > distance3d(const LineString3d1T &l1, const LineString3d2T &l2)
Axis-Aligned bounding box in 2d.
Eigen::Matrix< double, 2, 1, Eigen::DontAlign > BasicPoint2d
a simple 2d-point
auto toBasicSegment(const Segment< PointT > &s)
Segment< BasicPoint2d > closestSegment(const BasicLineString2d &lineString, const BasicPoint2d &pointToProject)
find the segment on a 2d line string that is closest to a given point, determined by boost::geometry:...
testing::Types< LineString2d, LineString3d, ConstLineString2d, ConstLineString3d > NormalLineStrings
A hybrid compound linestring in 3d (returns BasicPoint3d)
TEST(TwoDLineStringsTest, removeSelfIntersections)
testing::Types< LineString2d, ConstLineString2d, ConstHybridLineString2d, CompoundLineString2d, CompoundHybridLineString2d, BasicLineString2d > TwoDLineStrings
BasicLineString2d removeSelfIntersections(const BasicLineString2d &lineString)
auto toBasicPoint(const PointT &point) -> std::enable_if_t< PointTraits< PointT >::IsPrimitive, BasicPointT< PointT >>
typename LineString2d ::BasicLineString LineStringT
double signedDistance(const LineString3dT &lineString, const BasicPoint3d &p)
TYPED_TEST(MutableLineStringsTest, id)
IfLS< LineString3dT, std::pair< BasicPoint3d, BasicPoint3d > > projectedPoint3d(const LineString3dT &l1, const LineString3dT &l2)
Computes the projected points on the two linestrings for the shortest distance.
BasicLineString2d offset(const LineString2dT &lineString, const double distance)
create a linestring that is offset to the original one. Guarantees no self-intersections and no inver...
BoundingBox2d to2D(const BoundingBox3d &primitive)
double length
length along linestring
static LineStringT getLinestringAt(double y, size_t n=100)
A normal 2d linestring with immutable data.
ArcCoordinates toArcCoordinates(const LineString2dT &lineString, const BasicPoint2d &point)
Transform a point to the coordinates of the linestring.
A normal 2d linestring with mutable data.
std::pair< LineString1T, LineString2T > align(LineString1T left, LineString2T right)
inverts the two linestrings such that they are parallel
double distance2d(const RegulatoryElement ®Elem, const BasicPoint2d &p)
testing::Types< BasicPoint2d, Point2d, ConstPoint2d > TwoDPoints
PointVincinity makeVincinity(const LineString2dT &lineString, const size_t idx)
makeVincinity create pair of preceding and following point on a line string
IfAr< AreaT, BoundingBox3d > boundingBox3d(const AreaT &area)
calculates 3d bounding box