|
19 | 19 |
|
20 | 20 | #include <CGAL/is_y_monotone_2.h> |
21 | 21 | #include <gtest/gtest.h> |
| 22 | +#include <CGAL/intersections.h> |
22 | 23 |
|
23 | 24 | #include "polygon_coverage_geometry/cgal_comm.h" |
24 | 25 | #include "polygon_coverage_geometry/test_comm.h" |
25 | 26 | #include "polygon_coverage_geometry/visibility_polygon.h" |
26 | 27 |
|
27 | 28 | using namespace polygon_coverage_planning; |
28 | 29 |
|
29 | | -TEST(VisibilityPolygonTest, computeVisibilityPolygon) { |
30 | | - PolygonWithHoles rectangle_in_rectangle( |
31 | | - createRectangleInRectangle<Polygon_2, PolygonWithHoles>()); |
32 | | - Polygon_2 visibility_polygon; |
| 30 | +TEST(VisibilityPolygonTest, computeVisibilityPolygon |
| 31 | +) { |
| 32 | +PolygonWithHoles rectangle_in_rectangle( |
| 33 | + createRectangleInRectangle<Polygon_2, PolygonWithHoles>()); |
| 34 | +Polygon_2 visibility_polygon; |
33 | 35 |
|
34 | | - // Query on polygon vertex. |
35 | | - Point_2 query(0.0, 0.0); |
36 | | - EXPECT_TRUE(computeVisibilityPolygon(rectangle_in_rectangle, query, |
37 | | - &visibility_polygon)); |
38 | | - // Result manually checked. |
39 | | - VertexConstIterator vit = visibility_polygon.vertices_begin(); |
40 | | - EXPECT_EQ(static_cast<size_t>(9), visibility_polygon.size()); |
41 | | - EXPECT_EQ(Point_2(0.0, 2.0), *vit++); |
42 | | - EXPECT_EQ(Point_2(0.0, 0.0), *vit++); |
43 | | - EXPECT_EQ(Point_2(2.0, 0.0), *vit++); |
44 | | - EXPECT_EQ(Point_2(2.0, 2.0), *vit++); |
45 | | - vit++; // Skip inexact point. (1.6,2) |
46 | | - EXPECT_EQ(Point_2(1.0, 1.25), *vit++); |
47 | | - EXPECT_EQ(Point_2(0.5, 1.25), *vit++); |
48 | | - EXPECT_EQ(Point_2(0.5, 1.75), *vit++); |
49 | | - vit++; // Skip inexact point. (0.571429,2) |
| 36 | +// Query on polygon vertex. |
| 37 | +Point_2 query(0.0, 0.0); |
| 38 | +EXPECT_TRUE(computeVisibilityPolygon(rectangle_in_rectangle, query, |
| 39 | + &visibility_polygon) |
| 40 | +); |
| 41 | +// Result manually checked. |
| 42 | +Line_2 line(Point_2(0, 2), Point_2(2, 2)); |
| 43 | +Ray_2 ray_1(Point_2(0, 0), Point_2(0.5, 1.75)); |
| 44 | +Ray_2 ray_2(Point_2(0, 0), Point_2(1.0, 1.25)); |
| 45 | +auto inter_1 = CGAL::intersection(ray_1, line); |
| 46 | +auto inter_2 = CGAL::intersection(ray_2, line); |
50 | 47 |
|
51 | | - // Query on hole vertex. |
52 | | - query = Point_2(1.0, 1.25); |
53 | | - EXPECT_TRUE(computeVisibilityPolygon(rectangle_in_rectangle, query, |
54 | | - &visibility_polygon)); |
55 | | - vit = visibility_polygon.vertices_begin(); |
56 | | - EXPECT_EQ(static_cast<size_t>(6), visibility_polygon.size()) |
57 | | - << "Query point: " << query << " PWH: " << rectangle_in_rectangle |
58 | | - << "Visibility: " << visibility_polygon; |
59 | | - EXPECT_EQ(Point_2(1, 1.25), *vit++); |
60 | | - EXPECT_EQ(Point_2(0, 1.25), *vit++); |
61 | | - EXPECT_EQ(Point_2(0, 0), *vit++); |
62 | | - EXPECT_EQ(Point_2(2, 0), *vit++); |
63 | | - EXPECT_EQ(Point_2(2, 2), *vit++); |
64 | | - EXPECT_EQ(Point_2(1, 2), *vit++); |
| 48 | +Point_2 points_1[] = {{0.0, 2.0}, {0.0, 0.0}, {2.0, 0.0}, {2.0, 2.0}, |
| 49 | + *boost::get<Point_2>(&*inter_2), {1.0, 1.25}, {0.5, 1.25}, |
| 50 | + {0.5, 1.75}, *boost::get<Point_2>(&*inter_1)}; |
| 51 | +Polygon_2 visibility_polygon_expected_1 |
| 52 | + (points_1, points_1 + sizeof(points_1) / sizeof(points_1[0])); |
| 53 | +EXPECT_EQ(visibility_polygon_expected_1, visibility_polygon |
| 54 | +); |
65 | 55 |
|
66 | | - // Query in face. |
67 | | - query = Point_2(1.0, 0.5); |
68 | | - EXPECT_TRUE(computeVisibilityPolygon(rectangle_in_rectangle, query, |
69 | | - &visibility_polygon)); |
70 | | - // Result manually checked. |
71 | | - vit = visibility_polygon.vertices_begin(); |
72 | | - EXPECT_EQ(static_cast<size_t>(7), visibility_polygon.size()); |
73 | | - EXPECT_EQ(Point_2(0, 0), *vit++); |
74 | | - EXPECT_EQ(Point_2(2, 0), *vit++); |
75 | | - EXPECT_EQ(Point_2(2, 2), *vit++); |
76 | | - EXPECT_EQ(Point_2(1, 2), *vit++); |
77 | | - EXPECT_EQ(Point_2(1, 1.25), *vit++); |
78 | | - EXPECT_EQ(Point_2(0.5, 1.25), *vit++); |
79 | | - EXPECT_EQ(Point_2(0, 2), *vit++); |
| 56 | +// Query on hole vertex. |
| 57 | +query = Point_2(1.0, 1.25); |
| 58 | +EXPECT_TRUE(computeVisibilityPolygon(rectangle_in_rectangle, query, |
| 59 | + &visibility_polygon) |
| 60 | +); |
| 61 | +Point_2 points_2[] = {{0, 0}, {2, 0}, {2, 2}, {1, 2}, {1, 1.25}, {0, 1.25}}; |
| 62 | +Polygon_2 visibility_polygon_expected_2 |
| 63 | + (points_2, points_2 + sizeof(points_2) / sizeof(points_2[0])); |
| 64 | +EXPECT_EQ(visibility_polygon_expected_2, visibility_polygon |
| 65 | +); |
80 | 66 |
|
81 | | - // Query on polygon halfedge. |
82 | | - query = Point_2(1.0, 0.0); |
83 | | - EXPECT_TRUE(computeVisibilityPolygon(rectangle_in_rectangle, query, |
84 | | - &visibility_polygon)); |
85 | | - // Result manually checked. |
86 | | - vit = visibility_polygon.vertices_begin(); |
87 | | - EXPECT_EQ(static_cast<size_t>(8), visibility_polygon.size()); |
88 | | - EXPECT_EQ(Point_2(0, 2), *vit++); |
89 | | - EXPECT_EQ(Point_2(0, 0), *vit++); |
90 | | - EXPECT_EQ(Point_2(2, 0), *vit++); |
91 | | - EXPECT_EQ(Point_2(2, 2), *vit++); |
92 | | - EXPECT_EQ(Point_2(1, 2), *vit++); |
93 | | - EXPECT_EQ(Point_2(1, 1.25), *vit++); |
94 | | - EXPECT_EQ(Point_2(0.5, 1.25), *vit++); |
95 | | - // EXPECT_EQ(Point_2(0.2, 2), *vit++); Skip inexact. |
| 67 | +// Query in face. |
| 68 | +query = Point_2(1.0, 0.5); |
| 69 | +EXPECT_TRUE(computeVisibilityPolygon(rectangle_in_rectangle, query, |
| 70 | + &visibility_polygon) |
| 71 | +); |
| 72 | +// Result manually checked. |
| 73 | +Point_2 points_3[] = |
| 74 | + {{0, 0}, {2, 0}, {2, 2}, {1, 2}, {1, 1.25}, {0.5, 1.25}, {0, 2}}; |
| 75 | +Polygon_2 visibility_polygon_expected_3 |
| 76 | + (points_3, points_3 + sizeof(points_3) / sizeof(points_3[0])); |
| 77 | +EXPECT_EQ(visibility_polygon_expected_3, visibility_polygon |
| 78 | +); |
96 | 79 |
|
97 | | - // Query on hole halfedge. |
98 | | - query = Point_2(0.75, 1.25); |
99 | | - EXPECT_TRUE(computeVisibilityPolygon(rectangle_in_rectangle, query, |
100 | | - &visibility_polygon)); |
101 | | - // Result manually checked. |
102 | | - vit = visibility_polygon.vertices_begin(); |
103 | | - EXPECT_EQ(static_cast<size_t>(4), visibility_polygon.size()); |
104 | | - EXPECT_EQ(Point_2(2, 1.25), *vit++); |
105 | | - EXPECT_EQ(Point_2(0, 1.25), *vit++); |
106 | | - EXPECT_EQ(Point_2(0, 0), *vit++); |
107 | | - EXPECT_EQ(Point_2(2, 0), *vit++); |
| 80 | +// Query on polygon halfedge. |
| 81 | +query = Point_2(1.0, 0.0); |
| 82 | +EXPECT_TRUE(computeVisibilityPolygon(rectangle_in_rectangle, query, |
| 83 | + &visibility_polygon) |
| 84 | +); |
| 85 | +// Result manually checked. |
| 86 | +Ray_2 ray_3(Point_2(1, 0), Point_2(0.5, 1.25)); |
| 87 | +auto inter_3 = CGAL::intersection(ray_3, line); |
| 88 | +Point_2 points_4[] = |
| 89 | + {{0, 2}, {0, 0}, {2, 0}, {2, 2}, {1, 2}, {1, 1.25}, {0.5, 1.25}, |
| 90 | + *boost::get<Point_2>(&*inter_3)}; |
| 91 | +Polygon_2 visibility_polygon_expected_4 |
| 92 | + (points_4, points_4 + sizeof(points_4) / sizeof(points_4[0])); |
| 93 | +EXPECT_EQ(visibility_polygon_expected_4, visibility_polygon |
| 94 | +); |
| 95 | + |
| 96 | +// Query on hole halfedge. |
| 97 | +query = Point_2(0.75, 1.25); |
| 98 | +EXPECT_TRUE(computeVisibilityPolygon(rectangle_in_rectangle, query, |
| 99 | + &visibility_polygon) |
| 100 | +); |
| 101 | +// Result manually checked. |
| 102 | +Point_2 points_5[] = {{2, 1.25}, {0, 1.25}, {0, 0}, {2, 0}}; |
| 103 | +Polygon_2 visibility_polygon_expected_5 |
| 104 | + (points_5, points_5 + sizeof(points_5) / sizeof(points_5[0])); |
| 105 | +EXPECT_EQ(visibility_polygon_expected_5, visibility_polygon |
| 106 | +); |
108 | 107 | } |
109 | 108 |
|
110 | | -int main(int argc, char** argv) { |
| 109 | +int main(int argc, char **argv) { |
111 | 110 | testing::InitGoogleTest(&argc, argv); |
112 | 111 | return RUN_ALL_TESTS(); |
113 | 112 | } |
0 commit comments