float ImageBasedDensityProvider::operator()(const AABB3D& query_cube) const { AABB query_box(Point(query_cube.min.x, query_cube.min.y), Point(query_cube.max.x, query_cube.max.y)); Point img_min = (query_box.min - print_aabb.min - Point(1,1)) * image_size.x / (print_aabb.max.X - print_aabb.min.X); Point img_max = (query_box.max - print_aabb.min + Point(1,1)) * image_size.y / (print_aabb.max.Y - print_aabb.min.Y); long total_lightness = 0; int value_count = 0; for (int x = std::max((coord_t)0, img_min.X); x <= std::min((coord_t)image_size.x - 1, img_max.X); x++) { for (int y = std::max((coord_t)0, img_min.Y); y <= std::min((coord_t)image_size.y - 1, img_max.Y); y++) { for (int z = 0; z < image_size.z; z++) { total_lightness += image[((image_size.y - 1 - y) * image_size.x + x) * image_size.z + z]; value_count++; } } } if (value_count == 0) { // triangle falls outside of image or in between pixels, so we return the closest pixel Point closest_pixel = (img_min + img_max) / 2; closest_pixel.X = std::max((coord_t)0, std::min((coord_t)image_size.x - 1, (coord_t)closest_pixel.X)); closest_pixel.Y = std::max((coord_t)0, std::min((coord_t)image_size.y - 1, (coord_t)closest_pixel.Y)); assert(total_lightness == 0); for (int z = 0; z < image_size.z; z++) { total_lightness += image[((image_size.y - 1 - closest_pixel.Y) * image_size.x + closest_pixel.X) * image_size.z + z]; value_count++; } } return 1.0f - ((float)total_lightness) / value_count / 255.0f; };
int main(void) { typedef bg::model::point<float, 2, bg::cs::cartesian> point; typedef bg::model::box<point> box; typedef std::vector<box>::size_type value; typedef bgi::rstar<16, 4> parameters; typedef my_indexable< std::vector<box> > indexable_getter; // boxes std::vector<box> boxes; // create some boxes for ( unsigned i = 0 ; i < 10 ; ++i ) { // add a box boxes.push_back(box(point(i, i), point(i+0.5f, i+0.5f))); } // display boxes std::cout << "generated boxes:" << std::endl; BOOST_FOREACH(box const& b, boxes) std::cout << bg::wkt<box>(b) << std::endl; // create the rtree parameters params; indexable_getter ind(boxes); bgi::rtree<value, parameters, indexable_getter> rtree(params, ind); // fill the spatial index for ( size_t i = 0 ; i < boxes.size() ; ++i ) rtree.insert(i); // find values intersecting some area defined by a box box query_box(point(0, 0), point(5, 5)); std::vector<value> result_s; rtree.query(bgi::intersects(query_box), std::back_inserter(result_s)); // find 5 nearest values to a point std::vector<value> result_n; rtree.query(bgi::nearest(point(0, 0), 5), std::back_inserter(result_n)); // note: in Boost.Geometry the WKT representation of a box is polygon // display results std::cout << "spatial query box:" << std::endl; std::cout << bg::wkt<box>(query_box) << std::endl; std::cout << "spatial query result:" << std::endl; BOOST_FOREACH(value i, result_s) std::cout << bg::wkt<box>(boxes[i]) << std::endl; std::cout << "knn query point:" << std::endl; std::cout << bg::wkt<point>(point(0, 0)) << std::endl; std::cout << "knn query result:" << std::endl; BOOST_FOREACH(value i, result_n) std::cout << bg::wkt<box>(boxes[i]) << std::endl; return 0; }
int main() { //[rtree_quickstart_valuetype typedef bg::model::point<float, 2, bg::cs::cartesian> point; typedef bg::model::box<point> box; typedef std::pair<box, unsigned> value; //] //[rtree_quickstart_create // create the rtree using default constructor bgi::rtree< value, bgi::quadratic<16> > rtree; //] //[rtree_quickstart_insert // create some values for ( unsigned i = 0 ; i < 10 ; ++i ) { // create a box box b(point(i + 0.0f, i + 0.0f), point(i + 0.5f, i + 0.5f)); // insert new value rtree.insert(std::make_pair(b, i)); } //] //[rtree_quickstart_spatial_query // find values intersecting some area defined by a box box query_box(point(0, 0), point(5, 5)); std::vector<value> result_s; rtree.query(bgi::intersects(query_box), std::back_inserter(result_s)); //] //[rtree_quickstart_nearest_query // find 5 nearest values to a point std::vector<value> result_n; rtree.query(bgi::nearest(point(0, 0), 5), std::back_inserter(result_n)); //] // note: in Boost.Geometry WKT representation of a box is polygon //[rtree_quickstart_output // display results std::cout << "spatial query box:" << std::endl; std::cout << bg::wkt<box>(query_box) << std::endl; std::cout << "spatial query result:" << std::endl; BOOST_FOREACH(value const& v, result_s) std::cout << bg::wkt<box>(v.first) << " - " << v.second << std::endl; std::cout << "knn query point:" << std::endl; std::cout << bg::wkt<point>(point(0, 0)) << std::endl; std::cout << "knn query result:" << std::endl; BOOST_FOREACH(value const& v, result_n) std::cout << bg::wkt<box>(v.first) << " - " << v.second << std::endl; //] return 0; }
int main(void) { typedef bg::model::point<float, 2, bg::cs::cartesian> point; typedef bg::model::box<point> box; typedef boost::shared_ptr<box> shp; typedef shp value; // create the rtree using default constructor bgi::rtree< value, bgi::linear<16, 4> > rtree; std::cout << "filling index with boxes shared pointers:" << std::endl; // fill the spatial index for ( unsigned i = 0 ; i < 10 ; ++i ) { // create a box shp b(new box(point(i, i), point(i+0.5f, i+0.5f))); // display new box std::cout << bg::wkt<box>(*b) << std::endl; // insert new value rtree.insert(b); } // find values intersecting some area defined by a box box query_box(point(0, 0), point(5, 5)); std::vector<value> result_s; rtree.query(bgi::intersects(query_box), std::back_inserter(result_s)); // find 5 nearest values to a point std::vector<value> result_n; rtree.query(bgi::nearest(point(0, 0), 5), std::back_inserter(result_n)); // note: in Boost.Geometry the WKT representation of a box is polygon // display results std::cout << "spatial query box:" << std::endl; std::cout << bg::wkt<box>(query_box) << std::endl; std::cout << "spatial query result:" << std::endl; BOOST_FOREACH(value const& v, result_s) std::cout << bg::wkt<box>(*v) << std::endl; std::cout << "knn query point:" << std::endl; std::cout << bg::wkt<point>(point(0, 0)) << std::endl; std::cout << "knn query result:" << std::endl; BOOST_FOREACH(value const& v, result_n) std::cout << bg::wkt<box>(*v) << std::endl; return 0; }
int main() { typedef bg::model::point<float, 2, bg::cs::cartesian> point; typedef bg::model::box<point> box; typedef bg::model::polygon<point, false, false> polygon; // ccw, open polygon typedef std::pair<box, unsigned> value; // polygons std::vector<polygon> polygons; polygon p; // create some polygons std::ifstream file; file.open("C:/Users/sidharth/Downloads/polygon.txt"); std::string str; int i = 0; while (std::getline(file, str)) { boost::geometry::read_wkt(str, p); polygons.push_back(p); } // create the rtree using default constructor bgi::rtree< value, bgi::rstar<16, 4> > rtree; // fill the spatial index for ( unsigned i = 0 ; i < polygons.size() ; ++i ) { // calculate polygon bounding box box b = bg::return_envelope<box>(polygons[i]); // insert new value rtree.insert(std::make_pair(b, i)); } std::vector<value> result_s; // find values intersecting some area defined by a box for (int i =0; i<1; i++) { box query_box(point(962269+i , 173705+i), point(997902+i, 234692+i)); rtree.query(bgi::intersects(query_box), std::back_inserter(result_s)); } // display results std::cout << "join query result:" << std::endl; BOOST_FOREACH(value const& v, result_s) std::cout << bg::wkt<polygon>(polygons[v.second]) << std::endl; return 0; }
int main(void) { typedef bg::model::point<float, 2, bg::cs::cartesian> point; typedef bg::model::box<point> box; typedef bg::model::polygon<point, false, false> polygon; // ccw, open polygon typedef std::pair<box, unsigned> value; // polygons std::vector<polygon> polygons; // create some polygons for ( unsigned i = 0 ; i < 10 ; ++i ) { // create a polygon polygon p; for ( float a = 0 ; a < 6.28316f ; a += 1.04720f ) { float x = i + int(10*::cos(a))*0.1f; float y = i + int(10*::sin(a))*0.1f; p.outer().push_back(point(x, y)); } // add polygon polygons.push_back(p); } // display polygons std::cout << "generated polygons:" << std::endl; BOOST_FOREACH(polygon const& p, polygons) std::cout << bg::wkt<polygon>(p) << std::endl; // create the rtree using default constructor bgi::rtree< value, bgi::rstar<16, 4> > rtree; // fill the spatial index for ( unsigned i = 0 ; i < polygons.size() ; ++i ) { // calculate polygon bounding box box b = bg::return_envelope<box>(polygons[i]); // insert new value rtree.insert(std::make_pair(b, i)); } // find values intersecting some area defined by a box box query_box(point(0, 0), point(5, 5)); std::vector<value> result_s; rtree.query(bgi::intersects(query_box), std::back_inserter(result_s)); // find 5 nearest values to a point std::vector<value> result_n; rtree.query(bgi::nearest(point(0, 0), 5), std::back_inserter(result_n)); // display results std::cout << "spatial query box:" << std::endl; std::cout << bg::wkt<box>(query_box) << std::endl; std::cout << "spatial query result:" << std::endl; BOOST_FOREACH(value const& v, result_s) std::cout << bg::wkt<polygon>(polygons[v.second]) << std::endl; std::cout << "knn query point:" << std::endl; std::cout << bg::wkt<point>(point(0, 0)) << std::endl; std::cout << "knn query result:" << std::endl; BOOST_FOREACH(value const& v, result_n) std::cout << bg::wkt<polygon>(polygons[v.second]) << std::endl; return 0; }
int main() { typedef bg::model::point<float, 2, bg::cs::cartesian> point; typedef bg::model::box<point> box; typedef bg::model::polygon<point, false, false> polygon; // ccw, open polygon typedef boost::shared_ptr<polygon> shp; typedef std::pair<box, shp> value; // create the rtree using default constructor bgi::rtree< value, bgi::linear<16, 4> > rtree; std::cout << "filling index with polygons shared pointers:" << std::endl; // create some polygons and fill the spatial index for ( unsigned i = 0 ; i < 10 ; ++i ) { // create a polygon shp p(new polygon()); for ( float a = 0 ; a < 6.28316f ; a += 1.04720f ) { float x = i + int(10*::cos(a))*0.1f; float y = i + int(10*::sin(a))*0.1f; p->outer().push_back(point(x, y)); } // display new polygon std::cout << bg::wkt<polygon>(*p) << std::endl; // calculate polygon bounding box box b = bg::return_envelope<box>(*p); // insert new value rtree.insert(std::make_pair(b, p)); } // find values intersecting some area defined by a box box query_box(point(0, 0), point(5, 5)); std::vector<value> result_s; rtree.query(bgi::intersects(query_box), std::back_inserter(result_s)); // find 5 nearest values to a point std::vector<value> result_n; rtree.query(bgi::nearest(point(0, 0), 5), std::back_inserter(result_n)); // note: in Boost.Geometry the WKT representation of a box is polygon // note: the values store the bounding boxes of polygons // the polygons aren't used for querying but are printed // display results std::cout << "spatial query box:" << std::endl; std::cout << bg::wkt<box>(query_box) << std::endl; std::cout << "spatial query result:" << std::endl; BOOST_FOREACH(value const& v, result_s) std::cout << bg::wkt<polygon>(*v.second) << std::endl; std::cout << "knn query point:" << std::endl; std::cout << bg::wkt<point>(point(0, 0)) << std::endl; std::cout << "knn query result:" << std::endl; BOOST_FOREACH(value const& v, result_n) std::cout << bg::wkt<polygon>(*v.second) << std::endl; return 0; }
int main() { // geometries container map geometries; // create some geometries for ( unsigned i = 0 ; i < 10 ; ++i ) { unsigned c = rand() % 3; if ( 0 == c ) { // create polygon polygon p; fill(i, p.outer()); geometries.insert(std::make_pair(i, geometry(p))); } else if ( 1 == c ) { // create ring ring r; fill(i, r); geometries.insert(std::make_pair(i, geometry(r))); } else if ( 2 == c ) { // create linestring linestring l; fill(i, l); geometries.insert(std::make_pair(i, geometry(l))); } } // display geometries std::cout << "generated geometries:" << std::endl; BOOST_FOREACH(map::value_type const& p, geometries) boost::apply_visitor(print_visitor(), p.second); // create the rtree using default constructor bgi::rtree< value, bgi::quadratic<16, 4> > rtree; // fill the spatial index for ( map::iterator it = geometries.begin() ; it != geometries.end() ; ++it ) { // calculate polygon bounding box box b = boost::apply_visitor(envelope_visitor(), it->second); // insert new value rtree.insert(std::make_pair(b, it)); } // find values intersecting some area defined by a box box query_box(point(0, 0), point(5, 5)); std::vector<value> result_s; rtree.query(bgi::intersects(query_box), std::back_inserter(result_s)); // find 5 nearest values to a point std::vector<value> result_n; rtree.query(bgi::nearest(point(0, 0), 5), std::back_inserter(result_n)); // note: in Boost.Geometry the WKT representation of a box is polygon // note: the values store the bounding boxes of geometries // the geometries aren't used for querying but are printed // display results std::cout << "spatial query box:" << std::endl; std::cout << bg::wkt<box>(query_box) << std::endl; std::cout << "spatial query result:" << std::endl; BOOST_FOREACH(value const& v, result_s) boost::apply_visitor(print_visitor(), v.second->second); std::cout << "knn query point:" << std::endl; std::cout << bg::wkt<point>(point(0, 0)) << std::endl; std::cout << "knn query result:" << std::endl; BOOST_FOREACH(value const& v, result_n) boost::apply_visitor(print_visitor(), v.second->second); return 0; }