1 #include "betr_geo_object_3d.h"
2 #include <vsol/vsol_box_3d.h>
3 #include <vsol/vsol_point_3d.h>
4 #include <vsol/vsol_region_3d.h>
5 #include <vsol/vsol_volume_3d.h>
6 #include <betr/vsol_mesh_3d.h>
7 
update_box_from_from_vsol_box(const vsol_box_3d_sptr & sbox,betr_geo_box_3d & box) const8   void betr_geo_object_3d::update_box_from_from_vsol_box(const vsol_box_3d_sptr& sbox, betr_geo_box_3d& box) const{
9   if(!sbox)
10     return;
11   // derive four points from the box (three is minimum for geo box)
12   double xmin = sbox->get_min_x(), xmax = sbox->get_max_x();
13   double ymin = sbox->get_min_y(), ymax = sbox->get_max_y();
14   double zmin = sbox->get_min_z(), zmax = sbox->get_max_z();
15   double width = sbox->width(), height = sbox->height(), depth = sbox->depth();
16   double xc = xmin + 0.5*width, yc = ymin+0.5*height, zc = zmin+0.5*depth;
17   auto* gobj_nconst = const_cast<betr_geo_object_3d*>(this);
18   // convert to geographic coordinates using the lvcs
19   double lon = 0.0, lat = 0.0, elev = 0.0;
20   (gobj_nconst->lvcs_).local_to_global(xmin, ymin, zmin, vpgl_lvcs::wgs84,
21                         lon, lat, elev);
22   box.add(lon, lat, elev);
23   (gobj_nconst->lvcs_).local_to_global(xmax, ymax, zmax, vpgl_lvcs::wgs84,
24                         lon, lat, elev);
25   box.add(lon, lat, elev);
26 
27   (gobj_nconst->lvcs_).local_to_global(xc, yc, zc, vpgl_lvcs::wgs84,
28                         lon, lat, elev);
29   box.add(lon, lat, elev);
30 }
base_polygon()31 vsol_polygon_3d_sptr betr_geo_object_3d::base_polygon() {
32   vsol_polygon_3d_sptr local_base_poly;
33   vsol_region_3d* reg_ptr = nullptr;
34   vsol_volume_3d* vol_ptr = nullptr;
35   if( ( reg_ptr = so_->cast_to_region() ) ){
36     vsol_polygon_3d* poly_3d = reg_ptr->cast_to_polygon();
37       if(!poly_3d){
38         std::cout << "only handle polygonal regions for now. Geo object is not a vsol_polygon_3d" << std::endl;
39         return nullptr;
40       }
41       local_base_poly = poly_3d;
42   }else if( ( vol_ptr = so_->cast_to_volume() ) ){
43     vsol_mesh_3d* mesh = vol_ptr->cast_to_mesh();
44     if(!mesh){
45         std::cout << "only handle mesh volumes for now. Geo object is not a vsol_mesh_3d" << std::endl;
46         return nullptr;
47       }
48     local_base_poly =  mesh->extract_bottom_face();
49   }else{
50     std::cout << "In base_polygon - spatial object is unknown " << std::endl;
51     return nullptr;
52   }
53   // convert coordinates to global
54   std::vector<vsol_point_3d_sptr> gverts;
55   unsigned n = local_base_poly->size();
56   for(unsigned i = 0; i<n; ++i){
57     vsol_point_3d_sptr v = local_base_poly->vertex(i);
58     double lon, lat, elev;
59     lvcs_.local_to_global(v->x(), v->y(), v->z(), vpgl_lvcs::wgs84, lon, lat, elev);
60     vsol_point_3d_sptr gv = new vsol_point_3d(lon, lat, elev);
61     gverts.push_back(gv);
62   }
63   return new vsol_polygon_3d(gverts);
64 }
65