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>
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>;
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());
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) {
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)));