From 3f1d769d9fa239283fbc5fe7bdd9e967df1efbdd Mon Sep 17 00:00:00 2001 From: Adam Wulkiewicz Date: Thu, 13 Dec 2012 22:37:06 +0000 Subject: [PATCH] Added MultiPolygon spatial query picture to docs. Added MultiPolygon query to GLUT Vis. [SVN r81921] --- .../r_tree/spatial_queries.html | 11 ++ doc/html/index.html | 2 +- doc/images/intersects_mpoly.png | Bin 0 -> 2687 bytes doc/rtree/spatial_query.qbk | 4 +- tests/additional_glut_vis.cpp | 117 +++++++++++++++--- 5 files changed, 115 insertions(+), 19 deletions(-) create mode 100644 doc/images/intersects_mpoly.png diff --git a/doc/html/geometry_index/r_tree/spatial_queries.html b/doc/html/geometry_index/r_tree/spatial_queries.html index 833e069d7..dc19fd16b 100644 --- a/doc/html/geometry_index/r_tree/spatial_queries.html +++ b/doc/html/geometry_index/r_tree/spatial_queries.html @@ -114,6 +114,7 @@ + @@ -126,6 +127,11 @@ intersects(Polygon)

+ +

+ intersects(MultiPolygon) +

+ @@ -138,6 +144,11 @@ intersects_poly

+ +

+ intersects_mpoly +

+
diff --git a/doc/html/index.html b/doc/html/index.html index 78510d922..73e908eea 100644 --- a/doc/html/index.html +++ b/doc/html/index.html @@ -56,7 +56,7 @@
- +

Last revised: December 13, 2012 at 18:36:05 GMT

Last revised: December 13, 2012 at 22:34:06 GMT


diff --git a/doc/images/intersects_mpoly.png b/doc/images/intersects_mpoly.png new file mode 100644 index 0000000000000000000000000000000000000000..f6172d2109ec47d7b0be44b9fb63c262c5ab64f8 GIT binary patch literal 2687 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 TpS!;Bg4%(eu6{1-oD!M #include +#include #include #include @@ -31,6 +32,7 @@ typedef bg::model::box

B; //bgi::rtree t(2, 1); typedef bg::model::ring

R; typedef bg::model::polygon

Poly; +typedef bg::model::multi_polygon MPoly; bgi::rtree< B, @@ -47,9 +49,10 @@ std::vector nearest_boxes; B search_box; R search_ring; Poly search_poly; +MPoly search_multi_poly; enum query_mode_type { - qm_knn, qm_c, qm_d, qm_i, qm_o, qm_w, qm_nc, qm_nd, qm_ni, qm_no, qm_nw, qm_all, qm_ri, qm_pi + qm_knn, qm_c, qm_d, qm_i, qm_o, qm_w, qm_nc, qm_nd, qm_ni, qm_no, qm_nw, qm_all, qm_ri, qm_pi, qm_mpi } query_mode = qm_knn; bool search_valid = false; @@ -227,6 +230,78 @@ void query_poly() std::cout << "boxes not found\n"; } +template +void query_multi_poly() +{ + float x = ( rand() % 1000 ) / 10.0f; + float y = ( rand() % 1000 ) / 10.0f; + float w = 10 + ( rand() % 1000 ) / 100.0f; + float h = 10 + ( rand() % 1000 ) / 100.0f; + + search_multi_poly.clear(); + + search_multi_poly.push_back(Poly()); + search_multi_poly[0].outer().push_back(P(x - w, y - h)); + search_multi_poly[0].outer().push_back(P(x - w/2, y - h)); + search_multi_poly[0].outer().push_back(P(x, y - 3*h/2)); + search_multi_poly[0].outer().push_back(P(x + w/2, y - h)); + search_multi_poly[0].outer().push_back(P(x + w, y - h)); + search_multi_poly[0].outer().push_back(P(x + w, y - h/2)); + search_multi_poly[0].outer().push_back(P(x + 3*w/2, y)); + search_multi_poly[0].outer().push_back(P(x + w, y + h/2)); + search_multi_poly[0].outer().push_back(P(x + w, y + h)); + search_multi_poly[0].outer().push_back(P(x + w/2, y + h)); + search_multi_poly[0].outer().push_back(P(x, y + 3*h/2)); + search_multi_poly[0].outer().push_back(P(x - w/2, y + h)); + search_multi_poly[0].outer().push_back(P(x - w, y + h)); + search_multi_poly[0].outer().push_back(P(x - w, y + h/2)); + search_multi_poly[0].outer().push_back(P(x - 3*w/2, y)); + search_multi_poly[0].outer().push_back(P(x - w, y - h/2)); + search_multi_poly[0].outer().push_back(P(x - w, y - h)); + + search_multi_poly[0].inners().push_back(Poly::ring_type()); + search_multi_poly[0].inners()[0].push_back(P(x - w/2, y - h/2)); + search_multi_poly[0].inners()[0].push_back(P(x + w/2, y - h/2)); + search_multi_poly[0].inners()[0].push_back(P(x + w/2, y + h/2)); + search_multi_poly[0].inners()[0].push_back(P(x - w/2, y + h/2)); + search_multi_poly[0].inners()[0].push_back(P(x - w/2, y - h/2)); + + search_multi_poly.push_back(Poly()); + search_multi_poly[1].outer().push_back(P(x - 2*w, y - 2*h)); + search_multi_poly[1].outer().push_back(P(x - 6*w/5, y - 2*h)); + search_multi_poly[1].outer().push_back(P(x - 6*w/5, y - 6*h/5)); + search_multi_poly[1].outer().push_back(P(x - 2*w, y - 6*h/5)); + search_multi_poly[1].outer().push_back(P(x - 2*w, y - 2*h)); + + search_multi_poly.push_back(Poly()); + search_multi_poly[2].outer().push_back(P(x + 6*w/5, y + 6*h/5)); + search_multi_poly[2].outer().push_back(P(x + 2*w, y + 6*h/5)); + search_multi_poly[2].outer().push_back(P(x + 2*w, y + 2*h)); + search_multi_poly[2].outer().push_back(P(x + 6*w/5, y + 2*h)); + search_multi_poly[2].outer().push_back(P(x + 6*w/5, y + 6*h/5)); + + nearest_boxes.clear(); + found_count = t.spatial_query(Predicate(search_multi_poly), std::back_inserter(nearest_boxes) ); + + if ( found_count > 0 ) + { + std::cout << "search multi_poly[0] outer: "; + BOOST_FOREACH(P const& p, search_multi_poly[0].outer()) + { + bgi::detail::rtree::visitors::detail::print_indexable(std::cout, p); + std::cout << ' '; + } + std::cout << "\nfound: "; + for ( size_t i = 0 ; i < nearest_boxes.size() ; ++i ) + { + bgi::detail::rtree::visitors::detail::print_indexable(std::cout, nearest_boxes[i]); + std::cout << '\n'; + } + } + else + std::cout << "boxes not found\n"; +} + void search() { if ( query_mode == qm_knn ) @@ -257,6 +332,8 @@ void search() query_ring< bgi::detail::intersects >(); else if ( query_mode == qm_pi ) query_poly< bgi::detail::intersects >(); + else if ( query_mode == qm_mpi ) + query_multi_poly< bgi::detail::intersects >(); search_valid = true; } @@ -289,12 +366,13 @@ void draw_knn_area() glEnd(); } -void draw_query_box_area() +template +void draw_box(Box const& box) { - float x1 = boost::geometry::get(search_box); - float y1 = boost::geometry::get(search_box); - float x2 = boost::geometry::get(search_box); - float y2 = boost::geometry::get(search_box); + float x1 = boost::geometry::get(box); + float y1 = boost::geometry::get(box); + float x2 = boost::geometry::get(box); + float y2 = boost::geometry::get(box); float z = t.depth(); // search box @@ -307,7 +385,7 @@ void draw_query_box_area() } template -void draw_ring_area(Range const& range) +void draw_ring(Range const& range) { float z = t.depth(); @@ -324,16 +402,19 @@ void draw_ring_area(Range const& range) glEnd(); } -void draw_query_ring_area() +template +void draw_polygon(Polygon const& polygon) { - draw_ring_area(search_ring); + draw_ring(polygon.outer()); + BOOST_FOREACH(Poly::ring_type const& r, polygon.inners()) + draw_ring(r); } -void draw_query_poly_area() +template +void draw_multi_polygon(MultiPolygon const& multi_polygon) { - draw_ring_area(search_poly.outer()); - BOOST_FOREACH(Poly::ring_type const& r, search_poly.inners()) - draw_ring_area(r); + BOOST_FOREACH(Poly const& p, multi_polygon) + draw_polygon(p); } void render_scene(void) @@ -349,11 +430,13 @@ void render_scene(void) if ( query_mode == qm_knn ) draw_knn_area(); else if ( query_mode == qm_ri ) - draw_query_ring_area(); + draw_ring(search_ring); else if ( query_mode == qm_pi ) - draw_query_poly_area(); + draw_polygon(search_poly); + else if ( query_mode == qm_mpi ) + draw_multi_polygon(search_multi_poly); else - draw_query_box_area(); + draw_box(search_box); for ( size_t i = 0 ; i < nearest_boxes.size() ; ++i ) boost::geometry::index::detail::rtree::visitors::detail::gl_draw_indexable(nearest_boxes[i], t.depth()); @@ -513,6 +596,8 @@ void keyboard(unsigned char key, int x, int y) query_mode = qm_ri; else if ( current_line == "pi" ) query_mode = qm_pi; + else if ( current_line == "mpi" ) + query_mode = qm_mpi; search(); glutPostRedisplay();