mirror of https://github.com/CGAL/cgal
visual hull with indexes
This commit is contained in:
parent
6388e9579f
commit
ece33a9fe5
|
|
@ -7,6 +7,7 @@
|
||||||
#include <CGAL/IO/Polyhedron_iostream.h>
|
#include <CGAL/IO/Polyhedron_iostream.h>
|
||||||
#include <CGAL/IO/Nef_polyhedron_iostream_3.h>
|
#include <CGAL/IO/Nef_polyhedron_iostream_3.h>
|
||||||
#include <CGAL/Modifier_base.h>
|
#include <CGAL/Modifier_base.h>
|
||||||
|
#include <CGAL/Nef_3/SNC_indexed_items.h>
|
||||||
|
|
||||||
CGAL_BEGIN_NAMESPACE
|
CGAL_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
|
@ -22,7 +23,10 @@ class visual_hull_creator : public CGAL::Modifier_base<SNC_> {
|
||||||
typedef typename SNC_structure::SM_decorator SM_decorator;
|
typedef typename SNC_structure::SM_decorator SM_decorator;
|
||||||
|
|
||||||
typedef typename SNC_structure::Vertex_handle Vertex_handle;
|
typedef typename SNC_structure::Vertex_handle Vertex_handle;
|
||||||
|
typedef typename SNC_structure::SHalfedge_handle SHalfedge_handle;
|
||||||
typedef typename SNC_structure::SVertex_iterator SVertex_iterator;
|
typedef typename SNC_structure::SVertex_iterator SVertex_iterator;
|
||||||
|
typedef typename SNC_structure::SHalfedge_around_sface_circulator
|
||||||
|
SHalfedge_around_sface_circulator;
|
||||||
typedef typename SNC_structure::Point_3 Point_3;
|
typedef typename SNC_structure::Point_3 Point_3;
|
||||||
typedef typename SNC_structure::Plane_3 Plane_3;
|
typedef typename SNC_structure::Plane_3 Plane_3;
|
||||||
typedef typename SNC_structure::Vector_3 Vector_3;
|
typedef typename SNC_structure::Vector_3 Vector_3;
|
||||||
|
|
@ -35,6 +39,10 @@ class visual_hull_creator : public CGAL::Modifier_base<SNC_> {
|
||||||
Plane_3 cut;
|
Plane_3 cut;
|
||||||
SNC_structure* sncp;
|
SNC_structure* sncp;
|
||||||
std::list<std::list<Point_3> > polygon_list;
|
std::list<std::list<Point_3> > polygon_list;
|
||||||
|
int vbase;
|
||||||
|
int voffset;
|
||||||
|
int ebase;
|
||||||
|
int eoffset;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Plane_3 find_cutoff_plane() {
|
Plane_3 find_cutoff_plane() {
|
||||||
|
|
@ -83,11 +91,58 @@ class visual_hull_creator : public CGAL::Modifier_base<SNC_> {
|
||||||
return Plane_3();
|
return Plane_3();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void add_camera_indexes(SHalfedge_handle se) {
|
||||||
|
SHalfedge_around_sface_circulator sfc(se), send(sfc);
|
||||||
|
CGAL_For_all(sfc, send) {
|
||||||
|
sfc->source()->set_index(vbase+voffset);
|
||||||
|
++voffset;
|
||||||
|
sfc->set_index(ebase+eoffset);
|
||||||
|
sfc->twin()->set_index(ebase+eoffset+1);
|
||||||
|
eoffset+=2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Distance>
|
||||||
|
void add_opposite_indexes(SHalfedge_handle se,
|
||||||
|
Distance spoints, bool outer) {
|
||||||
|
SHalfedge_around_sface_circulator sfc(se);
|
||||||
|
if(spoints > 0) {
|
||||||
|
sfc->source()->set_index(vbase+voffset+spoints-1);
|
||||||
|
--voffset;
|
||||||
|
} else
|
||||||
|
sfc->source()->set_index(vbase+voffset);
|
||||||
|
if(outer) {
|
||||||
|
sfc->set_index(ebase+eoffset);
|
||||||
|
sfc->twin()->set_index(ebase+eoffset+1);
|
||||||
|
} else {
|
||||||
|
sfc->set_index(ebase+eoffset+1);
|
||||||
|
sfc->twin()->set_index(ebase+eoffset);
|
||||||
|
}
|
||||||
|
--sfc;
|
||||||
|
sfc->source()->set_index(vbase);
|
||||||
|
if(spoints > 0) {
|
||||||
|
sfc->set_index(ebase+2*spoints-2);
|
||||||
|
sfc->twin()->set_index(ebase+2*spoints-1);
|
||||||
|
} else {
|
||||||
|
sfc->set_index(ebase);
|
||||||
|
sfc->twin()->set_index(ebase+1);
|
||||||
|
ebase+=2;
|
||||||
|
eoffset-=2;
|
||||||
|
}
|
||||||
|
--sfc;
|
||||||
|
++vbase;
|
||||||
|
sfc->source()->set_index(vbase+voffset);
|
||||||
|
sfc->set_index(ebase);
|
||||||
|
sfc->twin()->set_index(ebase+1);
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
visual_hull_creator(Point_3 min, Point_3 max, Point_3 position,
|
visual_hull_creator(Point_3 min, Point_3 max, Point_3 position,
|
||||||
std::list<std::list<Point_3> > p) :
|
std::list<std::list<Point_3> > p) :
|
||||||
room_min(min), room_max(max), c_pos(position), polygon_list(p) { }
|
room_min(min), room_max(max),
|
||||||
|
c_pos(position), polygon_list(p),
|
||||||
|
vbase(Index_generator::get_unique_index()),
|
||||||
|
voffset(0), ebase(vbase), eoffset(0) {}
|
||||||
|
|
||||||
void operator()(SNC_structure& snc) {
|
void operator()(SNC_structure& snc) {
|
||||||
|
|
||||||
|
|
@ -105,12 +160,18 @@ class visual_hull_creator : public CGAL::Modifier_base<SNC_> {
|
||||||
add_inner_cycle_to_camera(li->begin(), li->end());
|
add_inner_cycle_to_camera(li->begin(), li->end());
|
||||||
}
|
}
|
||||||
|
|
||||||
for(li=polygon_list.begin(); li!=polygon_list.end(); ++li)
|
for(li=polygon_list.begin(); li!=polygon_list.end(); ++li) {
|
||||||
if(li==polygon_list.begin()) {
|
if(li==polygon_list.begin()) {
|
||||||
create_outer_cycles_opposites(li->begin(), li->end());
|
create_outer_cycles_opposites(li->begin(), li->end());
|
||||||
} else {
|
} else {
|
||||||
create_inner_cycles_opposites(li->begin(), li->end());
|
create_inner_cycles_opposites(li->begin(), li->end());
|
||||||
}
|
}
|
||||||
|
++voffset;
|
||||||
|
ebase+=2;
|
||||||
|
eoffset-=2;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(Index_generator::get_unique_index() < ebase + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Forward_iterator>
|
template<typename Forward_iterator>
|
||||||
|
|
@ -124,7 +185,9 @@ class visual_hull_creator : public CGAL::Modifier_base<SNC_> {
|
||||||
spoints.push_back(Sphere_point(*si-camera->point()));
|
spoints.push_back(Sphere_point(*si-camera->point()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SHalfedge_handle se =
|
||||||
C.add_outer_sedge_cycle(camera, spoints.begin(), spoints.end(), false);
|
C.add_outer_sedge_cycle(camera, spoints.begin(), spoints.end(), false);
|
||||||
|
add_camera_indexes(se);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Forward_iterator>
|
template<typename Forward_iterator>
|
||||||
|
|
@ -158,7 +221,12 @@ class visual_hull_creator : public CGAL::Modifier_base<SNC_> {
|
||||||
bool orient(CGAL::orientation(*si_prev,
|
bool orient(CGAL::orientation(*si_prev,
|
||||||
*si,
|
*si,
|
||||||
*si_next,camera->point()) == CGAL::POSITIVE);
|
*si_next,camera->point()) == CGAL::POSITIVE);
|
||||||
|
SHalfedge_handle se =
|
||||||
C.add_outer_sedge_cycle(sncp->new_vertex(*si),spoints.begin(), spoints.end(), orient);
|
C.add_outer_sedge_cycle(sncp->new_vertex(*si),spoints.begin(), spoints.end(), orient);
|
||||||
|
if(si == points_on_plane.begin())
|
||||||
|
add_opposite_indexes(se, points_on_plane.size(), true);
|
||||||
|
else
|
||||||
|
add_opposite_indexes(se, 0, true);
|
||||||
++si_prev;
|
++si_prev;
|
||||||
if(si_prev==points_on_plane.end()) si_prev=points_on_plane.begin();
|
if(si_prev==points_on_plane.end()) si_prev=points_on_plane.begin();
|
||||||
}
|
}
|
||||||
|
|
@ -175,7 +243,9 @@ class visual_hull_creator : public CGAL::Modifier_base<SNC_> {
|
||||||
spoints.push_back(Sphere_point(*si-camera->point()));
|
spoints.push_back(Sphere_point(*si-camera->point()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SHalfedge_handle se =
|
||||||
C.add_inner_sedge_cycle(camera, spoints.begin(), spoints.end(),false,true);
|
C.add_inner_sedge_cycle(camera, spoints.begin(), spoints.end(),false,true);
|
||||||
|
add_camera_indexes(se);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Forward_iterator>
|
template<typename Forward_iterator>
|
||||||
|
|
@ -209,7 +279,13 @@ class visual_hull_creator : public CGAL::Modifier_base<SNC_> {
|
||||||
bool orient(CGAL::orientation(*si_prev,
|
bool orient(CGAL::orientation(*si_prev,
|
||||||
*si,
|
*si,
|
||||||
*si_next,camera->point()) == CGAL::NEGATIVE);
|
*si_next,camera->point()) == CGAL::NEGATIVE);
|
||||||
|
|
||||||
|
SHalfedge_handle se =
|
||||||
C.add_inner_sedge_cycle(sncp->new_vertex(*si),spoints.begin(), spoints.end(),orient,false);
|
C.add_inner_sedge_cycle(sncp->new_vertex(*si),spoints.begin(), spoints.end(),orient,false);
|
||||||
|
if(si == points_on_plane.begin())
|
||||||
|
add_opposite_indexes(se, points_on_plane.size(), false);
|
||||||
|
else
|
||||||
|
add_opposite_indexes(se, 0, false);
|
||||||
++si_prev;
|
++si_prev;
|
||||||
if(si_prev==points_on_plane.end()) si_prev=points_on_plane.begin();
|
if(si_prev==points_on_plane.end()) si_prev=points_on_plane.begin();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue