1 #include <gtest/gtest.h> 3 #include <boost/geometry/algorithms/perimeter.hpp> 29 return p.basicPolygon();
36 p11 =
Point3d(++
id, 0., 0., 0.);
37 p12 =
Point3d(++
id, 1., 2., 1.);
38 p13 =
Point3d(++
id, 1., 0., 0.);
39 p21 =
Point3d(++
id, 2., 0., 0.);
40 p22 =
Point3d(++
id, 3., 1., 0.);
41 p23 =
Point3d(++
id, 3., 0., 0.);
42 p31 =
Point3d(++
id, 1., 0., 2.);
43 p32 =
Point3d(++
id, 1., 1., 2.);
44 p33 =
Point3d(++
id, 2., 1., 2.);
45 p34 =
Point3d(++
id, 2., 0., 2.);
53 p41 =
Point3d(++
id, 1.5, 1.5, 2.);
54 p42 =
Point3d(++
id, 1.5, 0.5, 2.);
70 poly1 = toPolygon<T>(
Polygon3d{++
id, {p11, p12, p13}, poly1Attrs});
71 poly2 = toPolygon<T>(
Polygon3d{++
id, {p21, p22, p23}});
72 poly3 = toPolygon<T>(
Polygon3d{++
id, {p31, p32, p33, p34}});
74 simpleStar = toPolygon<T>(temp);
75 subdivide(temp, 2, ++
id);
76 fancyStar = toPolygon<T>(temp);
85 std::vector<Point3d> points;
86 points.reserve(
size_t(nNew));
87 for (
int i = 0; i < nNew; ++i) {
94 auto initSize = poly.
size();
95 for (
size_t i = 0; i < initSize; ++i) {
96 randomSubdivide(poly, (n + 1) * i, n,
id);
99 std::function<double(void)> randomNum_ = [distr = std::uniform_real_distribution<double>(-0.5, 0.5),
100 gen = std::mt19937(133769420)]()
mutable {
return distr(gen); };
103 template <
typename PolygonT>
105 return PolygonT(list);
108 template <
typename T>
123 poly2 =
PolygonT({tempLs21, tempLs22});
124 poly3 =
PolygonT({tempLs31, tempLs32});
125 simpleStar =
PolygonT({tempStar1, tempStar2});
126 fancyStar = simpleStar;
133 template <
typename T>
134 auto getZ(
const T&
p) -> std::enable_if_t<!traits::is2D<T>(),
double> {
137 template <
typename T>
138 auto getZ(
const T & ) -> std::enable_if_t<traits::is2D<T>(),
double> {
154 template <
typename T>
157 template <
typename T>
160 template <
typename T>
163 template <
typename T>
166 template <
typename T>
169 template <
typename T>
172 template <
typename T>
175 template <
typename T>
178 template <
typename T>
181 template <
typename T>
184 template <
typename T>
189 CompoundPolygon2d, CompoundPolygon3d, CompoundHybridPolygon2d, CompoundHybridPolygon3d>;
190 using NormalPolygons = testing::Types<Polygon2d, Polygon3d, ConstPolygon2d, ConstPolygon3d>;
192 testing::Types<Polygon3d, ConstPolygon3d, ConstHybridPolygon3d, CompoundPolygon3d, CompoundHybridPolygon3d>;
194 testing::Types<Polygon2d, ConstPolygon2d, ConstHybridPolygon2d, CompoundPolygon2d, CompoundHybridPolygon2d>;
196 CompoundPolygon3d, CompoundHybridPolygon3d>;
198 CompoundPolygon2d, CompoundHybridPolygon2d>;
201 testing::Types<Polygon2d, Polygon3d, ConstPolygon2d, ConstPolygon3d, ConstHybridPolygon2d, ConstHybridPolygon3d>;
203 testing::Types<Polygon2d, Polygon3d, ConstPolygon2d, ConstPolygon3d, CompoundPolygon2d, CompoundPolygon3d>;
205 testing::Types<ConstHybridPolygon2d, ConstHybridPolygon3d, CompoundHybridPolygon2d, CompoundHybridPolygon3d>;
208 #ifndef TYPED_TEST_SUITE 210 #define TYPED_TEST_SUITE TYPED_TEST_CASE 225 this->poly1.setId(100);
226 EXPECT_EQ(100, this->poly1.id());
238 EXPECT_EQ(bbox.
min().x(), 2);
239 EXPECT_EQ(bbox.
min().y(), 0);
240 EXPECT_EQ(bbox.
max().x(), 3);
241 EXPECT_EQ(bbox.
max().y(), 1);
246 EXPECT_EQ(bbox.min().x(), 0);
247 EXPECT_EQ(bbox.min().y(), 0);
248 EXPECT_EQ(bbox.min().z(), 0);
249 EXPECT_EQ(bbox.max().x(), 1);
250 EXPECT_EQ(bbox.max().y(), 2);
251 EXPECT_EQ(bbox.max().z(), 1);
264 auto a = geometry::area(this->poly1);
265 EXPECT_DOUBLE_EQ(a, 1.);
270 boost::geometry::centroid(this->poly3,
p);
271 EXPECT_DOUBLE_EQ(
p.x(), 1.5);
272 EXPECT_DOUBLE_EQ(
p.y(), 0.5);
276 auto p = boost::geometry::perimeter(this->poly3);
277 EXPECT_DOUBLE_EQ(
p, 4);
281 auto pBasic = this->poly3.basicPolygon();
282 EXPECT_EQ(4, boost::geometry::perimeter(pBasic));
283 EXPECT_EQ(4ul, pBasic.size());
286 inline auto crossProd(
const Eigen::Matrix<double, 2, 1>&
p1,
const Eigen::Matrix<double, 2, 1>&
p2) {
291 const double eps = 4 * std::numeric_limits<double>::epsilon()) {
292 return crossProd(seg1.normalized(), seg2.normalized()).z() <= eps;
296 for (
size_t i = 2; i < poly.size(); ++i) {
297 if (!
isConnectionConvex(poly.at(i - 1) - poly.at(i - 2), poly.at(i) - poly.at(i - 1))) {
301 return (
isConnectionConvex(poly.back() - poly.at(poly.size() - 2), poly.front() - poly.back()) &&
307 for (
auto i = 0ul; i < parts.size(); ++i) {
308 areaSum += boost::geometry::area(parts.at(i));
309 for (
auto j = i + 1; j < parts.size(); ++j) {
311 boost::geometry::intersection(parts.at(i), parts.at(j), intersection);
312 EXPECT_DOUBLE_EQ(boost::geometry::area(intersection), 0.);
314 for (
const auto&
p : parts.at(i)) {
315 Eigen::Matrix<double, 2, 1> pCopy(
p.x(),
p.y());
319 EXPECT_DOUBLE_EQ(areaSum, boost::geometry::area(poly));
324 EXPECT_EQ(t1.size(), 1ul);
328 EXPECT_EQ(t2.size(), 2ul);
329 for (
const auto& poly : t2) {
334 EXPECT_EQ(t3.size(), 2ul);
335 for (
const auto& poly : t3) {
343 return std::find(p.begin(), p.end(), idx) != p.end();
346 ASSERT_EQ(res.size(), 2ul);
347 EXPECT_EQ(res.front().size(), 3ul);
348 EXPECT_EQ(res.back().size(), 3ul);
349 const auto& t1 = res.front();
350 const auto& t2 = res.back();
351 EXPECT_TRUE((isIn(t1, 1) && isIn(t1, 3) && isIn(t2, 1) && isIn(t2, 3)) ||
352 (isIn(t1, 0) && isIn(t1, 2) && isIn(t2, 0) && isIn(t2, 2)));
iterator insert(iterator position, const PointType &point)
Inserts an element at a specific position.
Polygon with access to primitive points.
iterator end()
mutable iterator to the end of the elements of this vector.
testing::Types< Polygon2d, Polygon3d, ConstPolygon2d, ConstPolygon3d, ConstHybridPolygon2d, ConstHybridPolygon3d > PrimitivePolygons
auto find(ContainerT &&c, const ValueT &val)
static constexpr const char Curbstone[]
An mutable clockwise oriented, open (ie start point != end point) polygon in 2d.
testing::Types< ConstHybridPolygon2d, ConstHybridPolygon3d, CompoundHybridPolygon2d, CompoundHybridPolygon3d > HybridPolygons
An immutable clockwise oriented, open (ie start point != end point) polygon in 2d.
testing::Types< Polygon2d, Polygon3d, ConstPolygon2d, ConstPolygon3d, ConstHybridPolygon2d, ConstHybridPolygon3d, CompoundPolygon2d, CompoundPolygon3d, CompoundHybridPolygon2d, CompoundHybridPolygon3d > AllPolygons
Eigen::Vector3d BasicPoint3d
a simple 3d-point
BasicPolygon2d toPolygon< BasicPolygon2d >(const Polygon3d &p)
Combines multiple linestrings to one polygon in 3d that returns BasicPoint3d.
void randomSubdivide(Polygon3d &poly, const size_t after, const int nNew, Id id) const
testing::Types< Polygon2d, Polygon3d > MutablePolygons
ConstPolygon2d toPolygon< ConstPolygon2d >(const Polygon3d &p)
Primitive 2d polygon with basic points.
A normal 3d linestring with immutable data.
const VectorType &() min() const
std::array< size_t, 3 > IndexedTriangle
size_t size() const noexcept
Return the number of points in this linestring.
Combines multiple linestrings to one polygon in 3d.
Eigen::AlignedBox3d BoundingBox3d
Convenience type for an axis aligned bounding box in 3d.
testing::Types< Polygon3d, ConstPolygon3d, ConstHybridPolygon3d, CompoundPolygon3d, CompoundHybridPolygon3d > ThreeDPolygons
static constexpr const char Type[]
testing::Types< BasicPolygon2d, Polygon2d, ConstPolygon2d, ConstHybridPolygon2d, CompoundPolygon2d, CompoundHybridPolygon2d > TwoDAndBasicPolygons
const VectorType &() max() const
bool isConvex(const BasicPolygon2d &poly)
IndexedTriangles triangulate(const BasicPolygon2d &poly)
TYPED_TEST(MutablePolygonsTest, id)
Polygon with access to primitive points.
PolygonT composePolygon(std::initializer_list< ConstLineString3d > list)
testing::Types< ConstHybridPolygon2d, CompoundHybridPolygon2d > HybridPolygonsTwoD
Polygon2d toPolygon< Polygon2d >(const Polygon3d &p)
IfAr< AreaT, BoundingBox2d > boundingBox2d(const AreaT &area)
calculates an up-right 2d bounding box
Optional< double > distance
testing::Types< BasicPolygon3d, Polygon3d, ConstPolygon3d, ConstHybridPolygon3d, CompoundPolygon3d, CompoundHybridPolygon3d > ThreeDAndBasicPolygons
auto crossProd(const Eigen::Matrix< double, 2, 1 > &p1, const Eigen::Matrix< double, 2, 1 > &p2)
Axis-Aligned bounding box in 2d.
void subdivide(Polygon3d &poly, const int n, Id id)
A mutable clockwise oriented, open (ie start point != end point) polygon in 3d.
Eigen::Matrix< double, 2, 1, Eigen::DontAlign > BasicPoint2d
a simple 2d-point
An immutable clockwise oriented, open (ie start point != end point) polygon in 3d.
Combines multiple linestrings to one polygon in 2d that returns BasicPoint2d.
auto getZ(const T &p) -> std::enable_if_t<!traits::is2D< T >(), double >
auto toBasicPoint(const PointT &point) -> std::enable_if_t< PointTraits< PointT >::IsPrimitive, BasicPointT< PointT >>
BasicPolygons2d convexPartition(const BasicPolygon2d &poly)
IfPoly< Polygon2dT, IndexedTriangles > triangulate(const Polygon2dT &poly)
Split a concave polygon into triangles.
BasicPolygon3d toPolygon< BasicPolygon3d >(const Polygon3d &p)
BoundingBox2d to2D(const BoundingBox3d &primitive)
Primitive 3d polygon with basic points.
Combines multiple linestrings to one polygon in 2d.
testing::Types< Polygon2d, Polygon3d, ConstPolygon2d, ConstPolygon3d > NormalPolygons
IfPoly< Polygon2dT, BasicPolygons2d > convexPartition(const Polygon2dT &poly)
Split a concave polygon into convex parts.
T toPolygon(const Polygon3d &p)
CompoundPolygonTypeTest()
testing::Types< Polygon2d, Polygon3d, ConstPolygon2d, ConstPolygon3d, CompoundPolygon2d, CompoundPolygon3d > NonHybridPolygons
void checkPartitionConsistency(const BasicPolygon2d &poly, const BasicPolygons2d &parts)
bool isConnectionConvex(const BasicPoint2d &seg1, const BasicPoint2d &seg2, const double eps=4 *std::numeric_limits< double >::epsilon())
testing::Types< Polygon2d, ConstPolygon2d, ConstHybridPolygon2d, CompoundPolygon2d, CompoundHybridPolygon2d > TwoDPolygons
double distance2d(const RegulatoryElement ®Elem, const BasicPoint2d &p)
iterator begin()
mutable iterator for the elements of this vector.
IfAr< AreaT, BoundingBox3d > boundingBox3d(const AreaT &area)
calculates 3d bounding box
std::vector< BasicPolygon2d > BasicPolygons2d