polyhedron_3_to_nef_3.h

来自「CGAL is a collaborative effort of severa」· C头文件 代码 · 共 214 行

H
214
字号
// 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.//// $Source: /CVSROOT/CGAL/Packages/Nef_3/include/CGAL/Nef_3/polyhedron_3_to_nef_3.h,v $// $Revision: 1.25.2.1 $ $Date: 2004/12/08 19:31:09 $// $Name:  $//// 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 POLYHEDRON_3_TO_NEF_3_H#define 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>#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)));    return( Plane( *point_cir, Vector( plane_orthogonal_vector)));  }};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;                                    CGAL_NEF_TRACEN("  calculating facet's planes...");  std::transform( P.facets_begin(), P.facets_end(),		  P.planes_begin(), Facet_plane_3());  SNC_decorator D(S);  //  Progress_indicator_clog progress  //    ( P.size_of_vertices(),  //      "polyhedron_3_to_nef_3: constructing local view of vertices...");  typename Polyhedron::Vertex_iterator pvi;  for( pvi = P.vertices_begin(); pvi != P.vertices_end(); ++pvi ) {    //    progress++;    typename Polyhedron::Vertex pv = *pvi;    Vertex_handle nv = S.new_vertex();    D.point(nv) = pv.point();    D.mark(nv) = 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);    SM.mark(sv_0) = true;     pe++;    CGAL_assertion(pe != pv.vertex_begin());    SVertex_handle sv_prev = sv_0;    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);      SM.mark(sv) = true;            CGAL_NEF_TRACEN(pe_prev->facet()->plane());      CGAL_NEF_TRACEN(pe_target);      CGAL_NEF_TRACEN(pe_prev->opposite()->vertex()->point());      CGAL_assertion(!pe_prev->facet()->plane().is_degenerate());      CGAL_assertion(pe_prev->facet()->plane().		     has_on(pe_prev->opposite()->vertex()->point()));      CGAL_assertion(pe_prev->facet()->plane().has_on(pe_target));      CGAL_assertion(pe_prev->facet()->plane().has_on(pv.point()));      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(SM.point(sv_prev)));      SHalfedge_handle e = SM.new_shalfedge_pair(sv_prev, sv);      SM.circle(e) = ss_circle;      SM.circle(SM.twin(e)) = ss_circle.opposite();      SM.mark(e) = SM.mark(SM.twin(e)) = true;	        sv_prev = sv;      pe_prev = pe;      pe++;    }    while( pe != pv.vertex_begin() );    CGAL_assertion(!pe_0->is_border());    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->facet()->plane().is_degenerate());    CGAL_assertion(pe_prev->facet()->plane().		   has_on(pe_prev->opposite()->vertex()->point()));    CGAL_assertion(pe_prev->facet()->plane().has_on(pe_target_0));    CGAL_assertion(pe_prev->facet()->plane().has_on(pv.point()));    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(SM.point(sv_prev)));    CGAL_assertion(ss_circle.has_on(sp_0));    CGAL_assertion(ss_circle.has_on(SM.point(sv_prev)));        SHalfedge_handle e = SM.new_shalfedge_pair(sv_prev, sv_0);    SM.circle(e) = ss_circle;    SM.circle(SM.twin(e)) = ss_circle.opposite();    SM.mark(e) = SM.mark(SM.twin(e)) = true;    // create faces    SFace_handle fint = SM.new_sface();    SFace_handle fext = SM.new_sface();    SM.link_as_face_cycle(e, fint);    SM.link_as_face_cycle(SM.twin(e), fext);        // mark faces properly...    SM.mark(fint) = true;    SM.mark(fext) = false;    SM.check_integrity_and_topological_planarity();       //    SM_point_locator L(nv);    //    L.init_marks_of_halfspheres();   }}CGAL_END_NAMESPACE#endif //POLYHEDRON_3_TO_NEF_3_H

⌨️ 快捷键说明

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