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