⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 polyhedron_3_to_nef_3.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
字号:
// Copyright (c) 1997-2002  Max-Planck-Institute Saarbruecken (Germany).// All rights reserved.//// This file is part of CGAL (www.cgal.org); you may redistribute it under// the terms of the Q Public License version 1.0.// See the file LICENSE.QPL distributed with CGAL.//// Licensees holding a valid commercial license may use this file in// accordance with the commercial license agreement provided with the software.//// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.//// $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.3-branch/Nef_3/include/CGAL/Nef_3/polyhedron_3_to_nef_3.h $// $Id: polyhedron_3_to_nef_3.h 39744 2007-08-07 20:08:22Z hachenb $// //// Author(s)     : Michael Seel    <seel@mpi-sb.mpg.de>//                 Miguel Granados <granados@mpi-sb.mpg.de>//                 Susan Hert      <hert@mpi-sb.mpg.de>//                 Lutz Kettner    <kettner@mpi-sb.mpg.de>#ifndef CGAL_NEF_POLYHEDRON_3_TO_NEF_3_H#define CGAL_NEF_POLYHEDRON_3_TO_NEF_3_H#include <CGAL/Circulator_project.h>#include <CGAL/normal_vector_newell_3.h>#include <CGAL/Nef_S2/SM_point_locator.h>#include <CGAL/Nef_3/SNC_indexed_items.h>#undef CGAL_NEF_DEBUG#define CGAL_NEF_DEBUG 29#include <CGAL/Nef_2/debug.h>CGAL_BEGIN_NAMESPACEtemplate < class Node, class Object>struct Project_vertex_point {  typedef Node                  argument_type;  typedef Object                result_type;  Object&       operator()( Node& x)       const { return x.vertex()->point();}  const Object& operator()( const Node& x) const { return x.vertex()->point();}};struct Facet_plane_3 {  template < class Facet_>  typename Facet_::Plane_3 operator()( Facet_& f) {    typedef Facet_                              Facet;    typedef typename Facet::Plane_3             Plane;    typedef Kernel_traits< Plane>               KernelTraits;    typedef typename KernelTraits::Kernel       Kernel;    typedef typename Kernel::Vector_3           Vector;    typedef typename Facet::Halfedge_around_facet_const_circulator                                                Halfedge_circulator;    typedef typename Facet::Halfedge            Halfedge;    typedef typename Halfedge::Vertex           Vertex;    typedef typename Vertex::Point_3            Point;    typedef Project_vertex_point< Halfedge, const Point> Proj_vertex_point;    typedef Circulator_project< Halfedge_circulator, Proj_vertex_point,      const Point, const Point*> Circulator;    /* TODO: to implement a better approach       typedef Project_vertex< Halfedge> Project_vertex;       typedef Project_point< Vertex> Project_point;       typedef Compose< Project_vertex, Project_point> Projector;       typedef Circulator_project< Halfedge_circulator, Projector> Circulator;    */    Circulator point_cir( f.facet_begin());    Vector plane_orthogonal_vector;    normal_vector_newell_3( point_cir, point_cir, plane_orthogonal_vector);    CGAL_NEF_TRACEN( *point_cir);    CGAL_NEF_TRACEN(Plane( *point_cir, Vector( plane_orthogonal_vector)));    if(plane_orthogonal_vector == Vector(0,0,0))      std::cerr << "Error !!!!!!!!!!!!!!!!!!!!!!!" << std::endl;    return( Plane( *point_cir, Vector( plane_orthogonal_vector)));  }};template<typename Items, typename Polyhedron, typename SNC_structure>class Index_adder {  typedef typename SNC_structure::SHalfedge_handle   SHalfedge_handle;    typedef typename Polyhedron::Halfedge_around_vertex_const_circulator    Halfedge_around_vertex_const_circulator; public:  Index_adder(Polyhedron& ) {}  void set_hash(Halfedge_around_vertex_const_circulator,		SHalfedge_handle) {}  void resolve_indexes() {}};template<typename Polyhedron, typename SNC_structure>class Index_adder<CGAL::SNC_indexed_items, Polyhedron, SNC_structure> {  typedef typename SNC_structure::SHalfedge_handle   SHalfedge_handle;    typedef typename Polyhedron::Halfedge_const_handle     Halfedge_const_handle;  typedef typename Polyhedron::Facet_const_iterator     Facet_const_iterator;  typedef typename Polyhedron::Halfedge_around_vertex_const_circulator    Halfedge_around_vertex_const_circulator;  typedef typename Polyhedron::Halfedge_around_facet_const_circulator    Halfedge_around_facet_const_circulator;  typedef typename CGAL::Unique_hash_map<Halfedge_const_handle,                                          SHalfedge_handle> Hash;  Polyhedron& P;  Hash hash; public:  Index_adder(Polyhedron& P_) : P(P_) {}  void set_hash(Halfedge_around_vertex_const_circulator evc,		SHalfedge_handle se) {    hash[evc] = se;  }    void resolve_indexes() {    Facet_const_iterator fi;    for(fi = P.facets_begin(); fi != P.facets_end(); ++fi) {      Halfedge_around_facet_const_circulator 	fc(fi->facet_begin()), end(fc);      hash[fc]->set_index();      hash[fc]->twin()->set_index();      hash[fc]->twin()->source()->set_index();      int se  = hash[fc]->get_index();      int set = hash[fc]->twin()->get_index();      int sv  = hash[fc]->twin()->source()->get_index();            ++fc;      CGAL_For_all(fc, end) {	hash[fc]->set_index(se);	hash[fc]->twin()->set_index(set);	hash[fc]->source()->set_index(sv);	hash[fc]->twin()->source()->set_index();	sv = hash[fc]->twin()->source()->get_index();      }      hash[fc]->source()->set_index(sv);    }  }};template <class Polyhedron_, class SNC_structure>void polyhedron_3_to_nef_3(Polyhedron_& P, SNC_structure& S){  typedef Polyhedron_                                Polyhedron;  typedef typename SNC_structure::SNC_decorator      SNC_decorator;  typedef typename SNC_structure::SM_decorator       SM_decorator;  typedef typename SNC_structure::Vertex_handle      Vertex_handle;  typedef typename SNC_structure::SVertex_handle     SVertex_handle;  typedef typename SNC_structure::SHalfedge_handle   SHalfedge_handle;  typedef typename SNC_structure::SFace_handle       SFace_handle;  typedef typename SNC_structure::Point_3            Point_3;  typedef typename SNC_structure::Sphere_point       Sphere_point;  typedef typename SNC_structure::Sphere_segment     Sphere_segment;  typedef typename SNC_structure::Sphere_circle      Sphere_circle;  typedef typename Polyhedron::Halfedge_around_vertex_const_circulator                               Halfedge_around_vertex_const_circulator;  Index_adder<typename SNC_structure::Items,    Polyhedron, SNC_structure> index_adder(P);  CGAL_NEF_TRACEN("  calculating facet's planes...");  std::transform( P.facets_begin(), P.facets_end(),		  P.planes_begin(), Facet_plane_3());  typename Polyhedron::Vertex_iterator pvi;  for( pvi = P.vertices_begin(); pvi != P.vertices_end(); ++pvi ) {    typename Polyhedron::Vertex pv = *pvi;    Vertex_handle nv = S.new_vertex();    nv->point() = pv.point();    nv->mark() = true;    CGAL_NEF_TRACEN("v "<<pv.point());    SM_decorator SM(&*nv);    Halfedge_around_vertex_const_circulator pe = pv.vertex_begin(), pe_prev(pe);    CGAL_assertion_code(Halfedge_around_vertex_const_circulator pe_0(pe));    CGAL_assertion( pe != 0 );    Point_3 pe_target_0(pe->opposite()->vertex()->point());    Point_3 sp_point_0(CGAL::ORIGIN+(pe_target_0-pv.point()));    Sphere_point sp_0(sp_point_0);    SVertex_handle sv_0 = SM.new_svertex(sp_0);    sv_0->mark() = true;     pe++;    CGAL_assertion(pe != pv.vertex_begin());    SVertex_handle sv_prev = sv_0;    bool with_border = false;    do {      //      CGAL_assertion(!pe->is_border());      CGAL_assertion(pe_prev->face() == pe->opposite()->face());      CGAL_assertion(pe_prev->vertex()->point()==pv.point());      CGAL_assertion(pe->vertex()->point()==pv.point());      Point_3 pe_target = pe->opposite()->vertex()->point();      Point_3 sp_point = CGAL::ORIGIN+(pe_target-pv.point());      Sphere_point sp(sp_point);      SVertex_handle sv = SM.new_svertex(sp);      sv->mark() = true;            //      CGAL_NEF_TRACEN(pe_prev->facet()->plane());      CGAL_NEF_TRACEN(pe_target);      CGAL_NEF_TRACEN(pe_prev->opposite()->vertex()->point());      /*      if(pe_prev->facet()->plane().is_degenerate()) {	typename Polyhedron::Halfedge_around_facet_const_circulator fc(pv.vertex_begin()), fcend(fc);	std::cerr << "wrong cycle "  << std::endl;	CGAL_For_all(fc,fcend) {	  std::cerr << "  " << fc->vertex()->point() << std::endl;	}      }      */      CGAL_assertion(pe_prev->is_border() ||		     !pe_prev->facet()->plane().is_degenerate());      CGAL_assertion(pe_prev->is_border() ||		     pe_prev->facet()->plane().		     has_on(pe_prev->opposite()->vertex()->point()));      CGAL_assertion(pe_prev->is_border() || 		     pe_prev->facet()->plane().has_on(pe_target));      CGAL_assertion(pe_prev->is_border() || 		     pe_prev->facet()->plane().has_on(pv.point()));      if(pe_prev->is_border())	with_border = true;      else {	typename Polyhedron::Facet::Plane_3 ss_plane	  (CGAL::ORIGIN, 	   pe_prev->facet()->plane().opposite().orthogonal_vector());	Sphere_circle ss_circle(ss_plane);		CGAL_assertion(ss_circle.has_on(sp));	CGAL_assertion(ss_circle.has_on(sv_prev->point()));		SHalfedge_handle e = SM.new_shalfedge_pair(sv_prev, sv);	e->circle() = ss_circle;	e->twin()->circle() = ss_circle.opposite();	e->mark() = e->twin()->mark() = true;		index_adder.set_hash(pe_prev, e);      }      sv_prev = sv;      pe_prev = pe;      ++pe;    }    while( pe != pv.vertex_begin() );    CGAL_assertion(pe_prev->face() == pe_0->opposite()->face());    CGAL_assertion(pe_prev->vertex()->point()==pv.point());    CGAL_assertion(pe_0->vertex()->point()==pv.point());    CGAL_NEF_TRACEN(pe_prev->facet()->plane());    CGAL_NEF_TRACEN(pe_target_0);    CGAL_NEF_TRACEN(pe_prev->opposite()->vertex()->point());    CGAL_assertion(pe_prev->is_border() ||		   !pe_prev->facet()->plane().is_degenerate());    CGAL_assertion(pe_prev->is_border() ||		   pe_prev->facet()->plane().		   has_on(pe_prev->opposite()->vertex()->point()));    CGAL_assertion(pe_prev->is_border() || 		   pe_prev->facet()->plane().has_on(pe_target_0));    CGAL_assertion(pe_prev->is_border() ||		   pe_prev->facet()->plane().has_on(pv.point()));    SHalfedge_handle e;    if(pe_prev->is_border()) {      with_border = true;      e = sv_prev->out_sedge();    } else {      typename Polyhedron::Facet::Plane_3 ss_plane	(CGAL::ORIGIN,	 pe_prev->facet()->plane().opposite().orthogonal_vector());      Sphere_circle ss_circle(ss_plane);            CGAL_assertion(ss_plane.has_on(sv_prev->point()));      CGAL_assertion(ss_circle.has_on(sp_0));      CGAL_assertion(ss_circle.has_on(sv_prev->point()));            e = SM.new_shalfedge_pair(sv_prev, sv_0);      e->circle() = ss_circle;      e->twin()->circle() = ss_circle.opposite();      e->mark() = e->twin()->mark() = true;            index_adder.set_hash(pe_prev, e);    }    // create faces    SFace_handle fext = SM.new_sface();    SM.link_as_face_cycle(e->twin(), fext);    fext->mark() = false;    if(!with_border) {      SFace_handle fint = SM.new_sface();      SM.link_as_face_cycle(e, fint);      fint->mark() = false;    }    SM.check_integrity_and_topological_planarity();     }  index_adder.resolve_indexes();}CGAL_END_NAMESPACE#endif //CGAL_NEF_POLYHEDRON_3_TO_NEF_3_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -