Reintroduce package Generalized map

This commit is contained in:
Guillaume Damiand 2016-01-15 14:12:34 +01:00
parent 9bd6d59454
commit 16f490251a
34 changed files with 10467 additions and 0 deletions

View File

View File

@ -0,0 +1,42 @@
# Created by the script cgal_create_cmake_script
# This is the CMake script for compiling a CGAL application.
# cmake ../ -DCMAKE_BUILD_TYPE=Debug
# ou
# cmake ../ -DCMAKE_BUILD_TYPE=Release
project( GMap_examples )
CMAKE_MINIMUM_REQUIRED(VERSION 2.4.5)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -w -pedantic -Wextra -Wall")
if ( COMMAND cmake_policy )
cmake_policy( SET CMP0003 NEW )
endif()
# Pour le problème de valgrind avec CGAL
# add_definition(-DCGAL_DISABLE_ROUNDING_MATH_CHECK)
find_package(CGAL QUIET COMPONENTS Core )
if ( CGAL_FOUND )
include( ${CGAL_USE_FILE} )
include( CGAL_CreateSingleSourceCGALProgram )
include_directories(BEFORE ../../include)
create_single_source_cgal_program( "gmap_3_simple_example.cpp" )
create_single_source_cgal_program( "gmap_4_simple_example.cpp" )
create_single_source_cgal_program( "gmap_3_with_colored_facets.cpp" )
create_single_source_cgal_program( "gmap_3_operations.cpp" )
create_single_source_cgal_program( "gmap_3_marks.cpp" )
else()
message(STATUS "This program requires the CGAL library, and will not be compiled.")
endif()

View File

@ -0,0 +1,73 @@
// Copyright (c) 2010 CNRS, LIRIS, http://liris.cnrs.fr/, All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; version 2.1 of the License.
// See the file LICENSE.LGPL 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#include <CGAL/Generalized_map.h>
#include <CGAL/Generalized_map_constructors.h>
#include <iostream>
#include <cstdlib>
typedef CGAL::Generalized_map<3> CMap_3;
typedef CMap_3::Dart_handle Dart_handle;
int main()
{
CMap_3 cm;
// Reserve a mark
int mark = cm.get_new_mark();
if ( mark==-1 )
{
std::cerr<<"No more free mark, exit."<<std::endl;
exit(-1);
}
// Create two tetrahedra.
Dart_handle dh1 = CGAL::make_combinatorial_tetrahedron(cm);
Dart_handle dh2 = CGAL::make_combinatorial_tetrahedron(cm);
CGAL_assertion( cm.is_valid() );
CGAL_assertion( CGAL::is_volume_combinatorial_tetrahedron(cm, dh1) );
CGAL_assertion( CGAL::is_volume_combinatorial_tetrahedron(cm, dh2) );
// 3-sew them.
cm.sew<3>(dh1, dh2);
// Mark the darts belonging to the first tetrahedron.
for (CMap_3::Dart_of_cell_range<3>::iterator
it(cm.darts_of_cell<3>(dh1).begin()),
itend(cm.darts_of_cell<3>(dh1).end()); it!=itend; ++it)
cm.mark(it, mark);
// Remove the common 2-cell between the two cubes:
// the two tetrahedra are merged.
// cm.remove_cell<2>(dh1);
// Thanks to the mark, we know which darts come from the first tetrahedron.
unsigned int res=0;
for (CMap_3::Dart_range::iterator it(cm.darts().begin()),
itend(cm.darts().end()); it!=itend; ++it)
{
if ( cm.is_marked(it, mark) )
++res;
}
std::cout<<"Number of darts from the first tetrahedron: "<<res<<std::endl;
cm.free_mark(mark);
return EXIT_SUCCESS;
}

View File

@ -0,0 +1,73 @@
// Copyright (c) 2010 CNRS, LIRIS, http://liris.cnrs.fr/, All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; version 2.1 of the License.
// See the file LICENSE.LGPL 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#include <CGAL/Generalized_map.h>
#include <CGAL/Generalized_map_constructors.h>
#include <iostream>
#include <cstdlib>
typedef CGAL::Generalized_map<3> CMap_3;
typedef CMap_3::Dart_handle Dart_handle;
int main()
{
CMap_3 cm;
// Create one hexahedron.
Dart_handle d1 = CGAL::make_combinatorial_hexahedron(cm);
CGAL_assertion( cm.is_valid() );
CGAL_assertion( CGAL::is_volume_combinatorial_hexahedron(cm, d1) );
// Add two edges along two opposite facets.
// CGAL::insert_cell_1_in_cell_2(cm,d1->alpha(1),d1->alpha(0));
CGAL_assertion( cm.is_valid() );
Dart_handle d2=d1->alpha(2)->alpha(1)->alpha(1)->alpha(2);
// CGAL::insert_cell_1_in_cell_2(cm,d2,d2->alpha(1)->alpha(1));
CGAL_assertion( cm.is_valid() );
// Insert a facet along these two new edges plus two initial edges of the cube.
std::vector<Dart_handle> path;
path.push_back(d1->alpha(1));
path.push_back(d1->alpha(0)->alpha(2)->alpha(1));
path.push_back(d2->alpha(0));
path.push_back(d2->alpha(2)->alpha(1));
//Dart_handle d3=CGAL::insert_cell_2_in_cell_3(cm,path.begin(),path.end());
CGAL_assertion( cm.is_valid() );
// Display the m characteristics.
cm.display_characteristics(std::cout) << ", valid=" <<
cm.is_valid() << std::endl;
// We use the removal operations to get back to the initial cube.
// cm.remove_cell<2>(d3);
CGAL_assertion( cm.is_valid() );
// cm.remove_cell<1>(d1->alpha(1));
CGAL_assertion( cm.is_valid() );
// cm.remove_cell<1>(d2->alpha(0));
CGAL_assertion( cm.is_valid() );
// Display the m characteristics.
cm.display_characteristics(std::cout) << ", valid="
<< cm.is_valid() << std::endl;
return EXIT_SUCCESS;
}

View File

@ -0,0 +1,44 @@
#include <CGAL/Generalized_map.h>
#include <CGAL/Generalized_map_constructors.h>
#include <iostream>
#include <cstdlib>
typedef CGAL::Generalized_map<3> CMap_3;
typedef CMap_3::Dart_handle Dart_const_handle;
int main()
{
CMap_3 cm;
// Create two tetrahedra.
Dart_const_handle d1 = CGAL::make_combinatorial_tetrahedron(cm);
Dart_const_handle d2 = CGAL::make_combinatorial_tetrahedron(cm);
// Display the map characteristics.
cm.display_characteristics(std::cout);
std::cout<<", valid="<<cm.is_valid()<<std::endl;
unsigned int res = 0;
// Iterate through all the darts of the first tetrahedron.
// Note that CMap_3::Dart_of_orbit_range<1,2> is in 3D equivalent to
// CMap_3::Dart_of_cell_range<3>.
for (CMap_3::Dart_of_orbit_range<0,1,2>::const_iterator
it(cm.darts_of_orbit<0,1,2>(d1).begin()),
itend(cm.darts_of_orbit<0,1,2>(d1).end());
it!=itend; ++it)
++res;
std::cout<<"Number of darts of the first tetrahedron: "<<res<<std::endl;
res = 0;
// Iterate through all the darts of the face incident to d1.
for (CMap_3::Dart_of_orbit_range<0,1>::const_iterator
it(cm.darts_of_orbit<0,1>(d1).begin()),
itend(cm.darts_of_orbit<0,1>(d1).end());
it!=itend; ++it)
++res;
std::cout<<"Number of darts of the face incident to d1: "<<res<<std::endl;
return EXIT_SUCCESS;
}

View File

@ -0,0 +1,114 @@
// Copyright (c) 2010 CNRS, LIRIS, http://liris.cnrs.fr/, All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; version 2.1 of the License.
// See the file LICENSE.LGPL 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#include <CGAL/Generalized_map.h>
#include <CGAL/Generalized_map_constructors.h>
#include <CGAL/Cell_attribute.h>
#include <iostream>
#include <algorithm>
#include <cstdlib>
struct Sum_functor
{
template<class Cell_attribute>
void operator()(Cell_attribute& ca1,Cell_attribute& ca2)
{ ca1.info()=ca1.info()+ca2.info(); }
};
struct Divide_by_two_functor
{
template<class Cell_attribute>
void operator()(Cell_attribute& ca1,Cell_attribute& ca2)
{
ca1.info()=(ca1.info()/2);
ca2.info()=(ca1.info());
}
};
struct Myitem
{
template<class CMap>
struct Dart_wrapper
{
typedef CGAL::GMap_dart<3, CMap> Dart;
typedef CGAL::Cell_attribute<CMap, int, CGAL::Tag_true,
Sum_functor, Divide_by_two_functor>
Facet_attribute;
typedef CGAL::cpp0x::tuple<void,void,Facet_attribute> Attributes;
};
};
typedef CGAL::Generalized_map<3,Myitem> CMap_3;
typedef CMap_3::Dart_handle Dart_handle;
int main()
{
CMap_3 cm;
// Create 2 cubes.
Dart_handle dh1 = CGAL::make_combinatorial_hexahedron(cm);
Dart_handle dh2 = CGAL::make_combinatorial_hexahedron(cm);
// 1) Create all 2-attributes and associated them to darts.
for (CMap_3::Dart_range::iterator
it=cm.darts().begin(), itend=cm.darts().end();
it!=itend; ++it)
{
if ( it->attribute<2>()==NULL )
cm.set_attribute<2>(it, cm.create_attribute<2>());
}
// 2) Set the color of all facets of the first cube to 1
for (CMap_3::One_dart_per_incident_cell_range<2, 3>::iterator
it=cm.one_dart_per_incident_cell<2,3>(dh1).begin(),
itend=cm.one_dart_per_incident_cell<2,3>(dh1).end(); it!=itend; ++it)
{ it->attribute<2>()->info()=7; }
// 3) Set the color of all facets of the second cube to 19
for (CMap_3::One_dart_per_incident_cell_range<2, 3>::iterator it=
cm.one_dart_per_incident_cell<2,3>(dh2).begin(),
itend=cm.one_dart_per_incident_cell<2,3>(dh2).end(); it!=itend; ++it)
{ it->attribute<2>()->info()=13; }
// 4) 3-Sew the two cubes along one facet
cm.sew<3>(dh1, dh2);
// 5) Display all the values of 2-attributes
for (CMap_3::Attribute_range<2>::type::iterator
it=cm.attributes<2>().begin(), itend=cm.attributes<2>().end();
it!=itend; ++it)
{
std::cout<<it->info()<<"; ";
}
std::cout<<std::endl;
// 6) Barycentric triangulation of one facet of the first cube.
//CGAL::insert_cell_0_in_cell_2(cm, dh2);
// 7) Display all the values of 2-attributes
for (CMap_3::Attribute_range<2>::type::iterator
it=cm.attributes<2>().begin(), itend=cm.attributes<2>().end();
it!=itend; ++it)
{
std::cout<<it->info()<<"; ";
}
std::cout<<std::endl;
cm.display_characteristics(std::cout);
std::cout<<", valid="<<cm.is_valid()<<std::endl;
return EXIT_SUCCESS;
}

View File

@ -0,0 +1,41 @@
// Copyright (c) 2010 CNRS, LIRIS, http://liris.cnrs.fr/, All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; version 2.1 of the License.
// See the file LICENSE.LGPL 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#include <CGAL/Generalized_map.h>
#include<CGAL/Generalized_map_constructors.h>
#include <iostream>
#include <cstdlib>
typedef CGAL::Generalized_map<4> CMap_4;
typedef CMap_4::Dart_handle Dart_handle;
int main()
{
CMap_4 cm;
Dart_handle d1 = CGAL::make_combinatorial_tetrahedron(cm);
Dart_handle d2 = CGAL::make_combinatorial_tetrahedron(cm);
CGAL_assertion(cm.is_valid());
cm.sew<4>(d1,d2);
cm.display_characteristics(std::cout);
std::cout<<", valid="<<cm.is_valid()<<std::endl;
return EXIT_SUCCESS;
}

View File

@ -0,0 +1,106 @@
// Copyright (c) 2014 CNRS and LIRIS' Establishments (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 3 of the License,
// or (at your option) any later version.
//
// 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#ifndef CGAL_GMAP_CELL_CONST_ITERATORS_H
#define CGAL_GMAP_CELL_CONST_ITERATORS_H 1
#include <CGAL/GMap_cell_iterators.h>
// TODO do all the orbit iterator of any orbit ?
namespace CGAL {
/** @file GMap_cell_const_iterators.h
* The cell const iterators. There are 3 classes:
* - GMap_cell_const_iterator<Map,i,dim>
* - GMap_one_dart_per_incident_cell_const_iterator<Map,Ite,i,dim>
* - GMap_one_dart_per_cell_const_iterator<Map,Ite,i,dim>
*/
//****************************************************************************
template <typename Map_,unsigned int i,unsigned int dim=Map_::dimension>
class GMap_cell_const_iterator: public GMap_cell_iterator<Map_,i,dim,true>
{
public:
typedef GMap_cell_iterator<Map_,i,dim,true> Base;
typedef typename Map_::Dart_const_handle Dart_const_handle;
/// Main constructor.
GMap_cell_const_iterator(const Map_& amap,
Dart_const_handle adart):
Base(amap,adart)
{}
/// Constructor from non const version.
GMap_cell_const_iterator
(const GMap_cell_iterator<Map_,i,dim,false>& it):
Base(*const_cast<const Map_*>(it.get_combinatorial_map()),
it.get_first_dart())
{}
};
//****************************************************************************
template <typename Map_,unsigned int i,unsigned int j,
unsigned int dim=Map_::dimension>
class GMap_one_dart_per_incident_cell_const_iterator:
public GMap_one_dart_per_incident_cell_iterator<Map_,i,j,dim,true>
{
public:
typedef GMap_one_dart_per_incident_cell_iterator<Map_,i,j,dim,true> Base;
typedef typename Map_::Dart_const_handle Dart_const_handle;
/// Main constructor.
GMap_one_dart_per_incident_cell_const_iterator(const Map_& amap,
Dart_const_handle adart):
Base(amap, adart)
{}
/// Constructor from non const version.
GMap_one_dart_per_incident_cell_const_iterator
(const GMap_one_dart_per_incident_cell_iterator<Map_,i,j,dim,false>& it):
Base(*const_cast<const Map_*>(it.get_combinatorial_map()),
it.get_first_dart())
{}
};
//****************************************************************************
template <typename Map_,unsigned int i,unsigned int dim=Map_::dimension>
class GMap_one_dart_per_cell_const_iterator:
public GMap_one_dart_per_cell_iterator<Map_,i,dim,true>
{
public:
typedef GMap_one_dart_per_cell_iterator<Map_,i,dim,true> Base;
typedef typename Map_::Dart_const_handle Dart_const_handle;
/// Main constructor.
GMap_one_dart_per_cell_const_iterator(const Map_& amap): Base(amap)
{}
/// Constructor with a dart in parameter (for end iterator).
GMap_one_dart_per_cell_const_iterator(const Map_& amap,
Dart_const_handle adart):
Base(amap)
{ this->set_current_dart(adart); }
/// Constructor from non const version.
GMap_one_dart_per_cell_const_iterator
(const GMap_one_dart_per_cell_iterator<Map_,i,dim,false>& it):
Base(*const_cast<const Map_*>(it.get_combinatorial_map()))
{}
};
//****************************************************************************
//****************************************************************************
} // namespace CGAL
//******************************************************************************
#endif // CGAL_GMAP_CELL_CONST_ITERATORS_H
//******************************************************************************

View File

@ -0,0 +1,202 @@
// Copyright (c) 2014 CNRS and LIRIS' Establishments (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 3 of the License,
// or (at your option) any later version.
//
// 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#ifndef CGAL_GMAP_CELL_ITERATORS_H
#define CGAL_GMAP_CELL_ITERATORS_H 1
#include <CGAL/Cell_iterators.h>
// TODO do all the orbit iterator of any orbit ?
namespace CGAL {
/** @file Cell_iterators.h
* Cell iterators. There are 3 classes:
* * - GMap_cell_iterator<Map,i,dim>: one dart per each i-cell
* * - GMap_one_dart_per_incident_cell_iterator<Map,Ite,i,dim>
* * - GMap_one_dart_per_cell_iterator<Map,Ite,i,dim>
*/
//****************************************************************************
/* Class GMap_cell_iterator<Map,i,dim,Tag_false>: to iterate onto
* all the cells of the gmap.
*/
template <typename Map_,unsigned int i,unsigned int dim,bool Const>
class GMap_cell_iterator: public GMap_dart_iterator_basic_of_all<Map_,Const>
{
public:
typedef GMap_dart_iterator_basic_of_all<Map_,Const> Base;
typedef GMap_cell_iterator<Map_,i,dim,Const> Self;
typedef typename Base::Dart_handle Dart_handle;
typedef typename Base::Map Map;
protected:
/// Unmark all the marked darts during the iterator.
void unmark_treated_darts()
{
if (this->mmap->is_whole_map_unmarked(mmark_number)) return;
this->mmap->negate_mark(mmark_number);
if (this->mmap->is_whole_map_unmarked(mmark_number)) return;
Base::rewind();
mark_cell<Map,i,dim>(*this->mmap, (*this),
mmark_number);
while (this->mmap->number_of_unmarked_darts(mmark_number) > 0)
this->operator++();
this->mmap->negate_mark(mmark_number);
CGAL_assertion(this->mmap->is_whole_map_unmarked(mmark_number));
}
public:
/// Main constructor.
GMap_cell_iterator(Map& amap):
Base(amap),
mmark_number(amap.get_new_mark())
{
CGAL_static_assertion( (boost::is_same<typename Base::Basic_iterator,
Tag_true>::value) );
CGAL_assertion(amap.is_whole_map_unmarked(mmark_number));
mark_cell<Map,i,dim>(amap, (*this), mmark_number);
}
/// Destructor.
~GMap_cell_iterator()
{
if (this->mmap->get_number_of_times_mark_reserved(mmark_number)==1)
unmark_treated_darts();
this->mmap->free_mark(mmark_number);
}
/// Copy constructor.
GMap_cell_iterator(const Self& aiterator):
Base(aiterator),
mmark_number(aiterator.mmark_number)
{ this->mmap->share_a_mark(mmark_number); }
/// Assignment operator.
Self& operator=(Self& aiterator)
{
if (this != &aiterator)
{
Base::operator=(aiterator);
mmark_number = aiterator.mmark_number;
this->mmap->share_a_mark(mmark_number);
}
return *this;
}
/// Rewind of the iterator to its beginning.
void rewind()
{
unmark_treated_darts();
Base::rewind();
mark_cell<Map,i,dim>(*this->mmap, (*this), mmark_number);
}
/// Postfix ++ operator.
Self operator++(int)
{ Self res=*this; operator ++(); return res; }
/// Prefix ++ operator.
Self& operator++()
{
CGAL_assertion(this->cont());
do
{
Base::operator++();
}
while (this->cont() &&
this->mmap->is_marked((*this), mmark_number));
if (this->cont())
mark_cell<Map,i,dim>(*this->mmap, (*this), mmark_number);
return *this;
}
private:
/// A mark used to mark treated cells.
int mmark_number;
};
//****************************************************************************
/* Class GMap_one_dart_per_incident_cell_iterator<Map,i,j,dim>: to iterate
* onto one dart per i-cell incident to the given j-cell.
*/
template <typename Map_,unsigned int i,unsigned int j,
unsigned int dim=Map_::dimension,bool Const=false>
class GMap_one_dart_per_incident_cell_iterator:
public CMap_cell_iterator<Map_,
GMap_dart_iterator_basic_of_cell
<Map_,j,dim,Const>, i,dim,Const>
{
public:
typedef GMap_one_dart_per_incident_cell_iterator<Map_,i,j,dim,Const> Self;
typedef CMap_cell_iterator<Map_,
GMap_dart_iterator_basic_of_cell<Map_,j,
dim,Const>,
i,dim,Const> Base;
typedef typename Base::Dart_handle Dart_handle;
typedef typename Base::Map Map;
typedef Tag_false Use_mark;
typedef Tag_false Basic_iterator;
/// Main constructor.
GMap_one_dart_per_incident_cell_iterator(Map& amap, Dart_handle adart):
Base(amap, adart)
{}
};
//****************************************************************************
/* Class GMap_one_dart_per_cell_iterator<Map,i,dim>: to iterate onto the
* i-cells incident of the map (one dart by each i-cell).
*/
template <typename Map_,unsigned int i,unsigned int dim=Map_::dimension,
bool Const=false>
class GMap_one_dart_per_cell_iterator:
public CMap_cell_iterator<Map_,GMap_dart_iterator_basic_of_all<Map_,Const>,
i,dim,Const>
{
public:
typedef GMap_one_dart_per_cell_iterator<Map_,i,dim,Const> Self;
typedef CMap_cell_iterator<Map_,
GMap_dart_iterator_basic_of_all<Map_,Const>,
i,dim,Const> Base;
typedef typename Base::Dart_handle Dart_handle;
typedef typename Base::Map Map;
typedef Tag_false Use_mark;
typedef Tag_false Basic_iterator;
/// Main constructor.
GMap_one_dart_per_cell_iterator(Map& amap): Base(amap)
{}
/// Constructor with a dart in parameter (for end iterator).
GMap_one_dart_per_cell_iterator(Map& amap, Dart_handle adart): Base(amap)
{ this->set_current_dart(adart); }
};
//****************************************************************************
//****************************************************************************
} // namespace CGAL
//******************************************************************************
#endif // CGAL_GMAP_CELL_ITERATORS_H
//******************************************************************************

View File

@ -0,0 +1,214 @@
// Copyright (c) 2014 CNRS and LIRIS' Establishments (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 3 of the License,
// or (at your option) any later version.
//
// 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#ifndef CGAL_GMAP_DART_H
#define CGAL_GMAP_DART_H 1
#include <CGAL/Compact_container.h>
#include <CGAL/assertions.h>
#include <bitset>
namespace CGAL {
/** @file GMap_dart.h
* Definition of nD dart for generalized maps.
*/
namespace internal {
template <typename Map,unsigned int i>
struct basic_link_alpha_functor;
template <typename CMap,unsigned int i>
struct link_alpha_functor;
}
/** Definition of nD dart.
* The GMap_dart class describes an nD dart (basic element of a
* generalized map). A dart is composed with handle towards its neighbors,
* a bitset containing Boolean marks, and handle towards enabled attributes.
* n is the dimension of the space (2 for 2D, 3 for 3D...)
* Refs the ref class
*/
template <int d, typename Refs>
struct GMap_dart
{
template < unsigned int, class, class, class, class >
friend class Generalized_map_base;
template < unsigned int, class, class >
friend class Generalized_map_storage_1;
template < unsigned int, class, class >
friend class Generalized_map_storage_2;
template <class, class, class>
friend class Compact_container;
template<class, unsigned int, unsigned int>
friend struct Remove_cell_functor;
template<class, unsigned int>
friend struct Contract_cell_functor;
template <typename, unsigned int>
friend struct internal::link_alpha_functor;
public:
typedef GMap_dart<d,Refs> Self;
typedef typename Refs::Dart_handle Dart_handle;
typedef typename Refs::size_type size_type;
typedef typename Refs::Dart_const_handle Dart_const_handle;
typedef typename Refs::Helper Helper;
/// Typedef for attributes
template<int i>
struct Attribute_handle: public Refs::template Attribute_handle<i>
{};
template<int i>
struct Attribute_const_handle: public Refs::template Attribute_const_handle<i>
{};
/// The number of used marks.
static const size_type NB_MARKS = Refs::NB_MARKS;
/// The dimension of the generalized map.
static const unsigned int dimension = d;
/** Return the alpha of this dart for a given dimension.
* @return alpha(\em i).
*/
template<unsigned int i>
Dart_handle alpha()
{
CGAL_assertion(i <= dimension);
return malpha[i];
}
template<unsigned int i>
Dart_const_handle alpha() const
{
CGAL_assertion(i <= dimension);
return malpha[i];
}
Dart_handle alpha(unsigned int i)
{
CGAL_assertion(i <= dimension);
return malpha[i];
}
Dart_const_handle alpha(unsigned int i) const
{
CGAL_assertion(i <= dimension);
return malpha[i];
}
/// @return a handle on the i-attribute
template<int i>
typename Attribute_handle<i>::type attribute()
{
CGAL_static_assertion_msg( Helper::template Dimension_index<i>::value>=0,
"attribute<i> but i-attributes are disabled.");
return CGAL::cpp0x::get<Helper::template Dimension_index<i>::value>
(mattribute_handles);
}
template<int i>
typename Attribute_const_handle<i>::type attribute() const
{
CGAL_static_assertion_msg( Helper::template Dimension_index<i>::value>=0,
"attribute<i> but i-attributes are disabled.");
return CGAL::cpp0x::get<Helper::template Dimension_index<i>::value>
(mattribute_handles);
}
/** Return the mark value of a given mark number.
* @param amark the mark number.
* @return the value for this number.
*/
bool get_mark(int amark) const
{
CGAL_assertion(amark>=0 && (size_type)amark<NB_MARKS);
return mmarks[(size_type)amark];
}
/** Set the mark of a given mark number to a given value.
* @param amark the mark number.
* @param AValue the value.
*/
void set_mark(int amark, bool avalue) const
{
CGAL_assertion(amark>=0 && (size_type)amark<NB_MARKS);
mmarks.set((size_type)amark, avalue);
}
/** Flip the mark of a given mark number.
* @param amark the mark number.
*/
void flip_mark(int amark) const
{
CGAL_assertion(amark>=0 && (size_type)amark<NB_MARKS);
mmarks.flip((size_type)amark);
}
/** Return all the marks of this dart.
* @return the marks.
*/
std::bitset<NB_MARKS> get_marks() const
{ return mmarks; }
/** Set simultaneously all the marks of this dart to a given value.
* @param amarks the value of the marks.
*/
void set_marks(const std::bitset<NB_MARKS>& amarks) const
{ mmarks = amarks; }
protected:
/** Default constructor: no real initialisation,
* because this is done in the generalized map class.
*/
GMap_dart()
{}
/** Copy constructor:
* @param adart a dart.
*/
GMap_dart(const GMap_dart& adart) :
mmarks(adart.mmarks),
mattribute_handles(adart.mattribute_handles)
{
for (unsigned int i = 0; i <= dimension; ++i)
malpha[i] = adart.malpha[i];
}
public:
void * for_compact_container() const
{ return malpha[0].for_compact_container(); }
void * & for_compact_container()
{ return malpha[0].for_compact_container(); }
protected:
/// Alpha for each dimension +1 (from 0 to dimension).
Dart_handle malpha[dimension+1];
/// Values of Boolean marks.
mutable std::bitset<NB_MARKS> mmarks;
/// Attributes enabled
typename Helper::Attribute_handles mattribute_handles;
};
} // namespace CGAL
#endif // CGAL_GMAP_DART_H //
// EOF //

View File

@ -0,0 +1,282 @@
// Copyright (c) 2014 CNRS and LIRIS' Establishments (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 3 of the License,
// or (at your option) any later version.
//
// 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#ifndef CGAL_GMAP_DART_CONST_ITERATORS_HH
#define CGAL_GMAP_DART_CONST_ITERATORS_HH 1
#include <CGAL/GMap_dart_iterators.h>
namespace CGAL {
/** @file GMap_dart_const_iterators.h
* Definition of gmap dart const iterators.
* There are 7 iterators:
* - GMap_dart_const_iterator_basic_of_orbit<Map,Alpha...>
* - GMap_dart_const_iterator_basic_of_cell<Map,i,d>
* - GMap_dart_const_iterator_basic_of_involution<Map,i,d>
* - GMap_dart_const_iterator_basic_of_all<Map>
* - GMap_dart_const_iterator_of_orbit<Map,Alpha...>
* - GMap_dart_const_iterator_of_cell<Map,i,d>
* - GMap_dart_const_iterator_of_involution<Map,i,d>
*/
//****************************************************************************
#ifndef CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES
template<typename Map_,unsigned int...Alpha>
class GMap_dart_const_iterator_basic_of_orbit:
public GMap_dart_iterator_basic_of_orbit_generic<Map_,true,Alpha...>
{
public:
typedef GMap_dart_const_iterator_basic_of_orbit<Map_,Alpha...> Self;
typedef GMap_dart_iterator_basic_of_orbit_generic<Map_,true,Alpha...> Base;
typedef typename Map_::Dart_const_handle Dart_const_handle;
/// Main constructor.
GMap_dart_const_iterator_basic_of_orbit(const Map_& amap,
Dart_const_handle adart):
Base(amap,adart)
{}
/// Main constructor.
GMap_dart_const_iterator_basic_of_orbit(const Map_& amap,
Dart_const_handle adart,
int amark):
Base(amap,adart,amark)
{}
/// Constructor from non const version.
GMap_dart_const_iterator_basic_of_orbit
(const GMap_dart_const_iterator_basic_of_orbit<Map_,Alpha...>& it):
Base(*const_cast<const Map_*>(it.get_combinatorial_map()),
it.get_first_dart(),
it.mmark_number)
{}
};
//****************************************************************************
template<typename Map_,unsigned int...Alpha>
class GMap_dart_const_iterator_of_orbit:
public GMap_dart_iterator_of_orbit_generic<Map_,true,Alpha...>
{
public:
typedef GMap_dart_const_iterator_of_orbit<Map_,Alpha...> Self;
typedef GMap_dart_iterator_of_orbit_generic<Map_,true,Alpha...> Base;
typedef typename Map_::Dart_const_handle Dart_const_handle;
/// Main constructor.
GMap_dart_const_iterator_of_orbit(const Map_& amap,
Dart_const_handle adart):
Base(amap,adart)
{}
/// Constructor from non const version.
GMap_dart_const_iterator_of_orbit
(const GMap_dart_iterator_of_orbit<Map_,Alpha...>& it):
Base(*const_cast<const Map_*>(it.get_combinatorial_map()),
it.get_first_dart())
{}
};
#else
//****************************************************************************
template<typename Map_,int B1=-1,int B2=-1,int B3=-1,int B4=-1,int B5=-1,
int B6=-1,int B7=-1,int B8=-1,int B9=-1>
class GMap_dart_const_iterator_basic_of_orbit:
public GMap_dart_iterator_basic_of_orbit_generic<Map_,true,B1,B2,B3,B4,
B5,B6,B7,B8,B9>
{
public:
typedef GMap_dart_const_iterator_basic_of_orbit<Map_,B1,B2,B3,B4,B5,B6,
B7,B8,B9> Self;
typedef GMap_dart_iterator_basic_of_orbit_generic<Map_,true,B1,B2,B3,B4,
B5,B6,B7,B8,B9> Base;
typedef typename Map_::Dart_const_handle Dart_const_handle;
/// Main constructor.
GMap_dart_const_iterator_basic_of_orbit(const Map_& amap,
Dart_const_handle adart):
Base(amap,adart)
{}
/// Main constructor.
GMap_dart_const_iterator_basic_of_orbit(const Map_& amap,
Dart_const_handle adart,
int amark):
Base(amap,adart,amark)
{}
/// Constructor from non const version.
GMap_dart_const_iterator_basic_of_orbit
(const GMap_dart_const_iterator_basic_of_orbit<Map_,B1,B2,B3,B4,B5,B6,
B7,B8,B9>& it):
Base(*const_cast<const Map_*>(it.get_combinatorial_map()),
it.get_first_dart(),
it.mmark_number)
{}
};
//****************************************************************************
template<typename Map_,int B1=-1,int B2=-1,int B3=-1,int B4=-1,int B5=-1,
int B6=-1,int B7=-1,int B8=-1,int B9=-1>
class GMap_dart_const_iterator_of_orbit:
public GMap_dart_iterator_of_orbit_generic<Map_,true,B1,B2,B3,B4,
B5,B6,B7,B8,B9>
{
public:
typedef GMap_dart_const_iterator_of_orbit<Map_,B1,B2,B3,B4,B5,B6,
B7,B8,B9> Self;
typedef GMap_dart_iterator_of_orbit_generic<Map_,true,B1,B2,B3,B4,
B5,B6,B7,B8,B9> Base;
typedef typename Map_::Dart_const_handle Dart_const_handle;
/// Main constructor.
GMap_dart_const_iterator_of_orbit(const Map_& amap,
Dart_const_handle adart):
Base(amap,adart)
{}
/// Constructor from non const version.
GMap_dart_const_iterator_of_orbit
(const GMap_dart_iterator_of_orbit<Map_,B1,B2,B3,B4,B5,B6,B7,B8,B9>& it):
Base(*const_cast<const Map_*>(it.get_combinatorial_map()),
it.get_first_dart())
{}
};
#endif // CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES
//****************************************************************************
template<typename Map_>
class GMap_dart_const_iterator_basic_of_all:
public GMap_dart_iterator_basic_of_all<Map_,true>
{
public:
typedef GMap_dart_iterator_basic_of_all<Map_,true> Base;
typedef typename Map_::Dart_const_handle Dart_const_handle;
/* Main constructor. */
GMap_dart_const_iterator_basic_of_all(const Map_& amap,
Dart_const_handle adart):
Base(amap,adart)
{}
/* Main constructor. */
GMap_dart_const_iterator_basic_of_all(const Map_& amap,
Dart_const_handle adart,
int /*amark*/):
Base(amap,adart)
{}
/// Constructor from non const version.
GMap_dart_const_iterator_basic_of_all
(const GMap_dart_iterator_basic_of_all<Map_,false>& it):
Base(*const_cast<const Map_*>(it.get_combinatorial_map()),
it.get_first_dart())
{}
};
//****************************************************************************
template<typename Map_,int i,int d=Map_::dimension>
class GMap_dart_const_iterator_basic_of_cell:
public GMap_dart_iterator_basic_of_cell<Map_,i,d,true>
{
public:
typedef GMap_dart_iterator_basic_of_cell<Map_,i,d,true> Base;
typedef typename Map_::Dart_const_handle Dart_const_handle;
/* Main constructor. */
GMap_dart_const_iterator_basic_of_cell(const Map_& amap,
Dart_const_handle adart):
Base(amap,adart)
{}
/* Main constructor. */
GMap_dart_const_iterator_basic_of_cell(const Map_& amap,
Dart_const_handle adart, int amark):
Base(amap,adart,amark)
{}
/// Constructor from non const version.
GMap_dart_const_iterator_basic_of_cell
(const GMap_dart_iterator_basic_of_cell<Map_,i,d,false>& it):
Base(*const_cast<const Map_*>(it.get_combinatorial_map()),
it.get_first_dart())
{}
};
//****************************************************************************
template<typename Map_, int i, int d=Map_::dimension>
class GMap_dart_const_iterator_of_cell:
public GMap_dart_iterator_of_cell<Map_,i,d,true>
{
public:
typedef GMap_dart_iterator_of_cell<Map_,i,d,true> Base;
typedef typename Map_::Dart_const_handle Dart_const_handle;
/* Main constructor. */
GMap_dart_const_iterator_of_cell(const Map_& amap,
Dart_const_handle adart):
Base(amap,adart)
{}
/// Constructor from non const version.
GMap_dart_const_iterator_of_cell
(const GMap_dart_iterator_of_cell<Map_,i,d,false>& it):
Base(*const_cast<const Map_*>(it.get_combinatorial_map()),
it.get_first_dart())
{}
};
//****************************************************************************
template<typename Map_,int i,int d=Map_::dimension>
class GMap_dart_const_iterator_basic_of_involution:
public GMap_dart_iterator_basic_of_involution<Map_,i,d,true>
{
public:
typedef GMap_dart_iterator_basic_of_involution<Map_,i,d,true> Base;
typedef typename Map_::Dart_const_handle Dart_const_handle;
/* Main constructor. */
GMap_dart_const_iterator_basic_of_involution(const Map_& amap,
Dart_const_handle adart):
Base(amap,adart)
{}
/* Main constructor. */
GMap_dart_const_iterator_basic_of_involution(const Map_& amap,
Dart_const_handle adart,
int amark):
Base(amap,adart,amark)
{}
/// Constructor from non const version.
GMap_dart_const_iterator_basic_of_involution
(const GMap_dart_iterator_basic_of_involution<Map_,i,d,false>& it):
Base(*const_cast<const Map_*>(it.get_combinatorial_map()),
it.get_first_dart(), it.mmark_number)
{}
};
//****************************************************************************
template<typename Map_,int i,int d=Map_::dimension>
class GMap_dart_const_iterator_of_involution:
public GMap_dart_iterator_of_involution<Map_,i,d,true>
{
public:
typedef GMap_dart_iterator_of_involution<Map_,i,d,true> Base;
typedef typename Map_::Dart_const_handle Dart_const_handle;
/* Main constructor. */
GMap_dart_const_iterator_of_involution(const Map_& amap,
Dart_const_handle adart):
Base(amap,adart)
{}
/// Constructor from non const version.
GMap_dart_const_iterator_of_involution
(const GMap_dart_iterator_of_involution<Map_,i,d,false>& it):
Base(*const_cast<const Map_*>(it.get_combinatorial_map()),
it.get_first_dart())
{}
};
//****************************************************************************
} // namespace CGAL
//******************************************************************************
#endif // CGAL_GMAP_DART_CONST_ITERATORS_HH
//******************************************************************************

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,291 @@
// Copyright (c) 2014 CNRS and LIRIS' Establishments (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 3 of the License,
// or (at your option) any later version.
//
// 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#ifndef CGAL_GENERALIZED_MAP_CONSTRUCTORS_H
#define CGAL_GENERALIZED_MAP_CONSTRUCTORS_H 1
#include <CGAL/Combinatorial_map_basic_operations.h>
namespace CGAL {
/** @file Generalized_map_constructors.h
* Basic creation operations for a generalized map.
* Create edge, triangle, quadrilateral, tetrahedron, hexahedron.
*/
/** Create an edge.
* @param amap the used generalized map.
* @return a dart of the new edge.
*/
template < class Map >
typename Map::Dart_handle make_edge(Map& amap)
{
typename Map::Dart_handle d1 = amap.create_dart();
typename Map::Dart_handle d2 = amap.create_dart();
amap.basic_link_alpha(d1, d2, 0);
return d1;
}
/** Create a combinatorial polygon of length alg
* (a cycle of alg edges alpha1 links together).
* @param amap the used generalized map.
* @return a new dart.
*/
template < class Map >
typename Map::Dart_handle make_combinatorial_polygon(Map& amap,
unsigned int alg)
{
CGAL_assertion(alg>0);
typename Map::Dart_handle start = make_edge(amap);
typename Map::Dart_handle prev = amap.template alpha<0>(start);
for ( unsigned int nb=1; nb<alg; ++nb )
{
typename Map::Dart_handle cur = make_edge(amap);
amap.template basic_link_alpha<1>(prev, cur);
prev=amap.template alpha<0>(cur);
}
amap.template basic_link_alpha<1>(prev, start);
return start;
}
/** Test if a face is a combinatorial polygon of length alg
* (a cycle of alg darts beta1 links together).
* @param amap the used generalized map.
* @param adart an intial dart
* @return true iff the face containing adart is a polygon of length alg.
*/
template < class Map >
bool is_face_combinatorial_polygon(const Map& amap,
typename Map::Dart_const_handle adart,
unsigned int alg)
{
CGAL_assertion(alg>0);
unsigned int nb = 0;
typename Map::Dart_const_handle cur = adart;
do
{
++nb;
if ( amap.is_free(cur, 0) || amap.is_free(amap.alpha(cur, 0), 1) )
return false; // Open face
cur = amap.alpha(cur,0,1);
}
while( cur!=adart );
return (nb==alg);
}
/** Create a combinatorial tetrahedron from 4 triangles.
* @param amap the used generalized map.
* @param d1 a dart onto a first triangle.
* @param d2 a dart onto a second triangle.
* @param d3 a dart onto a third triangle.
* @param d4 a dart onto a fourth triangle.
* @return a new dart.
*/
template < class Map >
typename Map::Dart_handle
make_combinatorial_tetrahedron(Map& amap,
typename Map::Dart_handle d1,
typename Map::Dart_handle d2,
typename Map::Dart_handle d3,
typename Map::Dart_handle d4)
{
amap.template topo_sew<2>(d1, d2);
amap.template topo_sew<2>(d3, amap.alpha(d2, 1));
amap.template topo_sew<2>(amap.alpha(d1, 1), amap.alpha(d3, 1));
amap.template topo_sew<2>(d4, amap.alpha(d2, 0, 1));
amap.template topo_sew<2>(amap.alpha(d4, 0, 1), amap.alpha(d3, 0, 1));
amap.template topo_sew<2>(amap.alpha(d4, 1), amap.alpha(d1, 0, 1));
return d1;
}
/** Test if a volume is a combinatorial tetrahedron.
* @param amap the used generalized map.
* @param adart an intial dart
* @return true iff the volume containing adart is a combinatorial tetrahedron.
*/
template < class Map >
bool is_volume_combinatorial_tetrahedron(const Map& amap,
typename Map::Dart_const_handle d1)
{
typename Map::Dart_const_handle d2 = amap.alpha(d1, 2);
typename Map::Dart_const_handle d3 = amap.alpha(d2, 1, 2);
typename Map::Dart_const_handle d4 = amap.alpha(d2, 0, 1, 2);
if ( !is_face_combinatorial_polygon(amap, d1, 3) ||
!is_face_combinatorial_polygon(amap, d2, 3) ||
!is_face_combinatorial_polygon(amap, d3, 3) ||
!is_face_combinatorial_polygon(amap, d4, 3) ) return false;
// TODO do better with marks (?).
if ( belong_to_same_cell<Map,2,1>(amap, d1, d2) ||
belong_to_same_cell<Map,2,1>(amap, d1, d3) ||
belong_to_same_cell<Map,2,1>(amap, d1, d4) ||
belong_to_same_cell<Map,2,1>(amap, d2, d3) ||
belong_to_same_cell<Map,2,1>(amap, d2, d4) ||
belong_to_same_cell<Map,2,1>(amap, d3, d4) ) return false;
if ( amap.alpha(d1,1,2)!=amap.alpha(d3,1) ||
amap.alpha(d4,0,1,2)!=amap.alpha(d3,0,1) ||
amap.alpha(d4,1,2)!=amap.alpha(d1,0,1) ) return false;
return true;
}
/** Create a new combinatorial tetrahedron.
* @param amap the used generalized map.
* @return a new dart.
*/
template < class Map >
typename Map::Dart_handle make_combinatorial_tetrahedron(Map& amap)
{
typename Map::Dart_handle d1 = make_combinatorial_polygon(amap,3);
typename Map::Dart_handle d2 = make_combinatorial_polygon(amap,3);
typename Map::Dart_handle d3 = make_combinatorial_polygon(amap,3);
typename Map::Dart_handle d4 = make_combinatorial_polygon(amap,3);
return make_combinatorial_tetrahedron(amap, d1, d2, d3, d4);
}
/** Create a combinatorial hexahedron from 6 quadrilaterals.
* @param amap the used generalized map.
* @param d1 a dart onto a first quadrilateral.
* @param d2 a dart onto a second quadrilateral.
* @param d3 a dart onto a third quadrilateral.
* @param d4 a dart onto a fourth quadrilateral.
* @param d5 a dart onto a fifth quadrilateral.
* @param d6 a dart onto a sixth quadrilateral.
* @return a dart of the new cuboidal_cell.
*/
template < class Map >
typename Map::Dart_handle
make_combinatorial_hexahedron(Map& amap,
typename Map::Dart_handle d1,
typename Map::Dart_handle d2,
typename Map::Dart_handle d3,
typename Map::Dart_handle d4,
typename Map::Dart_handle d5,
typename Map::Dart_handle d6)
{
amap.template topo_sew<2>(d1,
amap.alpha(d4,1,0,1,0));
amap.template topo_sew<2>(amap.alpha(d1,0,1),
amap.alpha(d6,1));
amap.template topo_sew<2>(amap.alpha(d1,1,0,1),
d2);
amap.template topo_sew<2>(amap.alpha(d1,1),
d5);
amap.template topo_sew<2>(d3,
amap.alpha(d2,1,0,1));
amap.template topo_sew<2>(amap.alpha(d3,0,1,0),
amap.alpha(d6,0,1));
amap.template topo_sew<2>(amap.alpha(d3,1,0,1,0),
d4);
amap.template topo_sew<2>(amap.alpha(d3,1),
amap.alpha(d5,0,1,0,1));
amap.template topo_sew<2>(d6,
amap.alpha(d4,1,0));
amap.template topo_sew<2>(amap.alpha(d6,1,0,1),
amap.alpha(d2,0,1));
amap.template topo_sew<2>(amap.alpha(d5,1,0),
amap.alpha(d4,0,1));
amap.template topo_sew<2>(amap.alpha(d5,0,1),
amap.alpha(d2,1));
return d1;
}
/** Test if a volume is a combinatorial hexahedron.
* @param amap the used generalized map.
* @param adart an intial dart
* @return true iff the volume containing adart is a combinatorial hexahedron.
*/
template < class Map >
bool is_volume_combinatorial_hexahedron(const Map& amap,
typename Map::Dart_const_handle d1)
{
typename Map::Dart_const_handle d2 = amap.alpha(d1,1,0,1,2);
typename Map::Dart_const_handle d3 = amap.alpha(d2,1,0,1,2);
typename Map::Dart_const_handle d4 = amap.alpha(d3,1,0,1,0,2);
typename Map::Dart_const_handle d5 = amap.alpha(d1,1,2);
typename Map::Dart_const_handle d6 = amap.alpha(d4,1,0,2);
if (!is_face_combinatorial_polygon(amap, d1, 4) ||
!is_face_combinatorial_polygon(amap, d2, 4) ||
!is_face_combinatorial_polygon(amap, d3, 4) ||
!is_face_combinatorial_polygon(amap, d4, 4) ||
!is_face_combinatorial_polygon(amap, d5, 4) ||
!is_face_combinatorial_polygon(amap, d6, 4) ) return false;
// TODO do better with marks.
if ( belong_to_same_cell<Map,2,1>(amap, d1, d2) ||
belong_to_same_cell<Map,2,1>(amap, d1, d3) ||
belong_to_same_cell<Map,2,1>(amap, d1, d4) ||
belong_to_same_cell<Map,2,1>(amap, d1, d5) ||
belong_to_same_cell<Map,2,1>(amap, d1, d6) ||
belong_to_same_cell<Map,2,1>(amap, d2, d3) ||
belong_to_same_cell<Map,2,1>(amap, d2, d4) ||
belong_to_same_cell<Map,2,1>(amap, d2, d5) ||
belong_to_same_cell<Map,2,1>(amap, d2, d6) ||
belong_to_same_cell<Map,2,1>(amap, d3, d4) ||
belong_to_same_cell<Map,2,1>(amap, d3, d5) ||
belong_to_same_cell<Map,2,1>(amap, d3, d6) ||
belong_to_same_cell<Map,2,1>(amap, d4, d5) ||
belong_to_same_cell<Map,2,1>(amap, d4, d6) ||
belong_to_same_cell<Map,2,1>(amap, d5, d6) )
return false;
if ( amap.alpha(d1,2) !=amap.alpha(d4,0,1,0,1) ||
amap.alpha(d1,0,1,2) !=amap.alpha(d6,1) ||
amap.alpha(d3,0,1,2) !=amap.alpha(d6,0,1,0) ||
amap.alpha(d3,1,2) !=amap.alpha(d5,0,1,0,1) ||
amap.alpha(d6,1,0,1,2)!=amap.alpha(d2,0,1) ||
amap.alpha(d5,1,2) !=amap.alpha(d4,0,1,0) ||
amap.alpha(d5,0,1,2) !=amap.alpha(d2,1) ) return false;
return true;
}
/** Create a new combinatorial hexahedron.
* @param amap the used generalized map.
* @return a new dart.
*/
template < class Map >
typename Map::Dart_handle make_combinatorial_hexahedron(Map& amap)
{
typename Map::Dart_handle d1 = make_combinatorial_polygon(amap,4);
typename Map::Dart_handle d2 = make_combinatorial_polygon(amap,4);
typename Map::Dart_handle d3 = make_combinatorial_polygon(amap,4);
typename Map::Dart_handle d4 = make_combinatorial_polygon(amap,4);
typename Map::Dart_handle d5 = make_combinatorial_polygon(amap,4);
typename Map::Dart_handle d6 = make_combinatorial_polygon(amap,4);
return make_combinatorial_hexahedron(amap, d1, d2, d3, d4, d5, d6);
}
} // namespace CGAL
#endif // CGAL_GENERALIZED_MAP_CONSTRUCTORS_H //
// EOF //

View File

@ -0,0 +1,545 @@
// Copyright (c) 2014 CNRS and LIRIS' Establishments (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 3 of the License,
// or (at your option) any later version.
//
// 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#ifndef CGAL_GENERALIZED_MAP_INSERTIONS_H
#define CGAL_GENERALIZED_MAP_INSERTIONS_H
namespace CGAL
{
/** @file Generalized_map_insertions.h
* Insertion operations on generalized map.
*/
/** Insert a vertex in a given edge.
* @param amap the used generalized map.
* @param adart a dart of the edge (!=NULL).
* @return a dart of the new vertex.
*/
template<class CMap>
typename CMap::Dart_handle
insert_cell_0_in_cell_1( CMap& amap, typename CMap::Dart_handle adart,
typename CMap::template
Attribute_handle<0>::type ah=CMap::null_handle )
{
typename CMap::Dart_handle d1, d2;
int mark=amap.get_new_mark();
// 1) We store all the darts of the edge.
std::deque<typename CMap::Dart_handle> vect;
int m=amap.get_new_mark();
{
for ( typename CMap::template Dart_of_cell_basic_range<1>::iterator
it=amap.template darts_of_cell_basic<1>(adart, m).begin();
it != amap.template darts_of_cell_basic<1>(adart, m).end(); ++it )
vect.push_back(it);
}
// 2) For each dart of the cell, we modify link of neighbors.
typename std::deque<typename CMap::Dart_handle>::iterator it = vect.begin();
for (; it != vect.end(); ++it)
{
d1 = amap.create_dart();
if (!amap.template is_free<0>(*it) &&
amap.is_marked(amap.template alpha<0>(*it), mark))
amap.template basic_link_alpha<1>(d1, amap.template alpha<0,0>(*it));
amap.template basic_link_alpha<0>(*it, d1);
amap.mark(*it, mark);
for ( unsigned int dim=2; dim<=CMap::dimension; ++dim )
{
if (!amap.is_free(*it, dim) && amap.is_marked(amap.alpha(*it, dim), mark))
{
amap.basic_link_alpha(amap.beta(*it, dim, 0), d1, dim);
}
}
// We copy all the attributes except for dim=0
CMap::Helper::template Foreach_enabled_attributes_except
<CGAL::internal::Group_attribute_functor_of_dart<CMap>, 0>::
run(&amap,*it,d1);
// We initialise the 0-atttrib to ah
CGAL::internal::Set_i_attribute_of_dart_functor<CMap, 0>::
run(&amap, d1, ah);
amap.mark(*it, mark);
}
for (it = vect.begin(); it != vect.end(); ++it)
{
amap.unmark(*it, m);
amap.unmark(*it, mark);
}
CGAL_assertion(amap.is_whole_map_unmarked(m));
CGAL_assertion(amap.is_whole_map_unmarked(mark));
amap.free_mark(m);
amap.free_mark(mark);
if ( !amap.template is_free<1>(amap.template alpha<0>(adart)) )
{
CGAL::internal::Degroup_attribute_functor_run<CMap, 1>::
run(&amap, adart, amap.template alpha<0,1>(adart));
}
#ifdef CGAL_CMAP_TEST_VALID_INSERTIONS
CGAL_assertion( amap.is_valid() );
#endif
return amap.template alpha<0>(adart);
}
/** Insert a vertex in the given 2-cell which is splitted in triangles,
* once for each inital edge of the facet.
* @param amap the used generalized map.
* @param adart a dart of the facet to triangulate.
* @return A dart incident to the new vertex.
*/
template < class CMap >
typename CMap::Dart_handle
insert_cell_0_in_cell_2( CMap& amap, typename CMap::Dart_handle adart,
typename CMap::template
Attribute_handle<0>::type ah=CMap::null_handle )
{
CGAL_assertion(adart!=amap.null_handle);
typename CMap::Dart_handle d1=amap.null_handle, d2=amap.null_handle;
// Mark used to mark darts already treated.
int treated = amap.get_new_mark();
int m = amap.get_new_mark();
// Stack of darts of the face
std::deque<typename CMap::Dart_handle> vect;
{
for ( typename CMap::template Dart_of_cell_basic_range<2>::iterator
it=amap.template darts_of_cell_basic<2>(adart,m).begin();
it != amap.template darts_of_cell_basic<2>(adart,m).end(); ++it )
vect.push_back(it);
}
// Stack of darts to degroup (one dart per edge of the face)
std::deque<typename CMap::Dart_handle> todegroup;
{
for ( typename CMap::template Dart_of_cell_basic_range<2,2>::iterator
it=amap.template darts_of_cell_basic<2,2>(adart).begin();
it != amap.template darts_of_cell_basic<2,2>(adart).end(); ++it )
if ( it!=adart && it!=amap.template alpha<0>(adart) )
todegroup.push_back(it);
}
// 2) For each dart of the cell, we modify link of neighbors.
typename std::deque<typename CMap::Dart_handle>::iterator it = vect.begin();
for (; it != vect.end(); ++it)
{
d1 = amap.create_dart();
d2 = amap.create_dart();
amap.template basic_link_alpha<0>(d1, d2);
amap.mark(*it, treated);
amap.template basic_link_alpha<1>(*it, d1);
if (!amap.template is_free<0>(*it) &&
amap.is_marked(amap.template alpha<0>(*it), treated))
amap.template basic_link_alpha<1>(d2, amap.template alpha<0,1,0>(*it));
for ( unsigned int dim=3; dim<=CMap::dimension; ++dim )
{
if (!amap.is_free(*it, dim) && amap.is_marked(amap.alpha(*it, dim), treated))
{
amap.basic_link_alpha(amap.beta(*it, dim, 1), d1, dim);
amap.basic_link_alpha(amap.beta(*it, dim, 1, 0), d2, dim);
}
}
// We copy all the attributes except for dim=1
CMap::Helper::template Foreach_enabled_attributes_except
<CGAL::internal::Group_attribute_functor_of_dart<CMap>, 1>::
run(&amap,*it,d1);
// We initialise the 0-atttrib to ah
CGAL::internal::Set_i_attribute_of_dart_functor<CMap, 0>::
run(&amap, d2, ah);
}
for (it = vect.begin(); it != vect.end(); ++it)
{
amap.unmark(*it, m);
amap.unmark(*it, treated);
}
CGAL_assertion(amap.is_whole_map_unmarked(m));
CGAL_assertion(amap.is_whole_map_unmarked(treated));
amap.free_mark(m);
amap.free_mark(treated);
for (it = todegroup.begin(); it != todegroup.end(); ++it)
{
CGAL::internal::Degroup_attribute_functor_run<CMap, 2>::
run(&amap, adart, *it);
}
#ifdef CGAL_CMAP_TEST_VALID_INSERTIONS
CGAL_assertion( amap.is_valid() );
#endif
return amap.template alpha<1,0>(adart);
}
/** Test if an edge can be inserted onto a 2-cell between two given darts.
* @param amap the used generalized map.
* @param adart1 a first dart.
* @param adart2 a second dart.
* @return true iff an edge can be inserted between adart1 and adart2.
*/
template < class CMap >
bool is_insertable_cell_1_in_cell_2(const CMap& amap,
typename CMap::Dart_const_handle adart1,
typename CMap::Dart_const_handle adart2)
{
if ( adart1==adart2 || adart1==amap.template alpha<0>(adart2) ) return false;
for ( CGAL::CMap_dart_const_iterator_of_orbit<CMap,0,1> it(amap,adart1);
it.cont(); ++it )
{
if ( it==adart2 ) return true;
}
return false;
}
/** Insert an edge in a 2-cell between two given darts.
* @param amap the used generalized map.
* @param adart1 a first dart of the facet (!=NULL && !=null_dart_handle).
* @param adart2 a second dart of the facet. If NULL insert a dangling edge.
* @return a dart of the new edge, and not incident to the
* same vertex than adart1.
*/
template<class CMap>
typename CMap::Dart_handle
insert_cell_1_in_cell_2(CMap& amap,
typename CMap::Dart_handle adart1,
typename CMap::Dart_handle adart2)
{
if ( adart2!=amap.null_handle)
{
CGAL_assertion(is_insertable_cell_1_in_cell_2<CMap>(amap, adart1, adart2));
}
int m1=amap.get_new_mark();
CGAL::CMap_dart_iterator_basic_of_involution<CMap,1> it1(amap, adart1, m1);
int m2=amap.get_new_mark();
CGAL::CMap_dart_iterator_basic_of_involution<CMap,1> it2(amap, adart2, m2);
typename CMap::Dart_handle d1=amap.null_handle;
typename CMap::Dart_handle d2=amap.null_handle;
int treated=amap.get_new_mark();
for ( ; it1.cont(); ++it1)
{
CGAL_assertion (it2.cont() );
d1 = amap.create_dart();
d2 = amap.create_dart();
amap.template basic_link_alpha<0>(d1, d2);
amap.mark(it1,treated);
if ( !amap.template is_free<1>(it1) &&
amap.is_marked(amap.template alpha<1>(it1), treated) )
{
amap.template basic_link_alpha<2>(amap.template alpha<1,1>(it1), d1);
amap.template basic_link_alpha<2>(amap.template alpha<2,0>(d1), d2);
}
for ( unsigned int dim=3; dim<=CMap::dimension; ++dim)
{
if ( !amap.is_free(it1, dim) &&
amap.is_marked(amap.alpha(it1, dim), treated) )
{
amap.basic_link_alpha(amap.alpha(it1, dim, 1), d1, dim);
amap.basic_link_alpha(amap.alpha(d1, dim, 0), d2, dim);
}
}
amap.template link_alpha<1>(it1, d1);
if ( adart2!=amap.null_handle )
{
amap.template link_alpha<1>(it2, d2);
++it2;
}
}
if ( !amap.template is_free<2>(d1) && d2!=amap.null_handle )
CGAL::internal::Degroup_attribute_functor_run<CMap, 2>::
run(&amap, d1, amap.template alpha<2>(d1));
amap.negate_mark(m1);
it1.rewind();
if ( adart2!=amap.null_handle )
{ it2.rewind(); amap.negate_mark(m2); }
for ( ; it1.cont(); ++it1, ++it2)
{
amap.mark(it1,m1);
amap.unmark(it1,treated);
if ( adart2!=amap.null_handle ) amap.mark(it2,m2);
}
amap.negate_mark(m1);
CGAL_assertion( amap.is_whole_map_unmarked(m1) );
CGAL_assertion( amap.is_whole_map_unmarked(treated) );
amap.free_mark(m1);
amap.free_mark(treated);
if ( adart2!=amap.null_handle )
{
amap.negate_mark(m2);
CGAL_assertion( amap.is_whole_map_unmarked(m2) );
}
amap.free_mark(m2);
#ifdef CGAL_CMAP_TEST_VALID_INSERTIONS
CGAL_assertion( amap.is_valid() );
#endif
return amap.template alpha<1>(adart1);
}
/** Test if a 2-cell can be inserted onto a given 3-cell along
* a path of edges.
* @param amap the used generalized map.
* @param afirst iterator on the begining of the path.
* @param alast iterator on the end of the path.
* @return true iff a 2-cell can be inserted along the path.
* the path is a sequence of dartd, one per edge
* where the face will be inserted.
*/
template <class CMap, class InputIterator>
bool is_insertable_cell_2_in_cell_3(const CMap& amap,
InputIterator afirst,
InputIterator alast)
{
CGAL_assertion( CMap::dimension>= 3 );
// The path must have at least one dart.
if (afirst==alast) return false;
typename CMap::Dart_const_handle prec = amap.null_handle;
typename CMap::Dart_const_handle od = amap.null_handle;
for (InputIterator it(afirst); it!=alast; ++it)
{
// The path must contain only non empty darts.
if (*it == amap.null_handle) return false;
// Two consecutive darts of the path must belong to two edges
// incident to the same vertex of the same volume.
if (prec != amap.null_handle)
{
if ( amap.template is_free<0>(prec) ) return false;
// alpha0(prec) and *it must belong to the same vertex of the same volume
if ( !CGAL::belong_to_same_cell<CMap, 0, 2>
(amap, amap.template alpha<0>(prec), *it) )
return false;
}
prec = *it;
}
// The path must be closed.
if ( amap.template is_free<0>(prec) ) return false;
if (!CGAL::belong_to_same_cell<CMap, 0, 2>
(amap, amap.template alpha<0>(prec), *afirst))
return false;
return true;
}
/** Insert a 2-cell in a given 3-cell along a path of darts.
* @param amap the used generalized map.
* @param afirst iterator on the begining of the path.
* @param alast iterator on the end of the path.
* the path is a sequence of dartd, one per edge
* where the face will be inserted.
* @return a dart of the new 2-cell.
*/
template<class CMap, class InputIterator>
typename CMap::Dart_handle
insert_cell_2_in_cell_3(CMap& amap, InputIterator afirst, InputIterator alast)
{
CGAL_assertion(is_insertable_cell_2_in_cell_3(amap,afirst,alast));
typename CMap::Dart_handle prec = amap.null_handle, d = amap.null_handle,
dd = amap.null_handle, first = amap.null_handle;
bool withAlpha3 = false;
int treated = amap.get_new_mark();
{
for (InputIterator it(afirst); !withAlpha3 && it!=alast; ++it)
{
if (!amap.template is_free<2>(*it)) withAlpha3 = true;
}
}
{
for (InputIterator it(afirst); it!=alast; ++it)
{
d = amap.create_dart();
amap.template basic_link_alpha<0>(d, amap.create_dart());
if ( withAlpha3 )
{
dd = amap.create_dart();
amap.template basic_link_alpha<0>(dd, amap.create_dart());
}
if ( prec!=amap.null_handle )
{
amap.template basic_link_alpha<1>(prec, d);
if (withAlpha3)
amap.template basic_link_alpha<1>(amap.template alpha<3>(prec), dd);
}
else first = amap.template alpha<0>(d);
if ( !amap.template is_free<2>(*it) )
{
amap.template link_alpha<2>(amap.template alpha<2>(*it), dd);
}
amap.template link_alpha<2>(*it, d);
if (withAlpha3) amap.template basic_link_alpha<3>(d, dd);
prec = amap.template alpha<0>(d);
}
}
amap.template basic_link_alpha<1>(prec, first);
if ( withAlpha3 )
{
amap.template basic_link_alpha<1>(amap.template alpha<3>(prec),
amap.template alpha<3>(first));
}
// Make copies of the new facet for dimension >=4
/* for ( unsigned int dim=4; dim<=CMap::dimension; ++dim )
{
if ( !amap.is_free(*it, dim) )
{
ddd = amap.create_dart();
amap.template basic_link_alpha<0>(ddd, amap.create_dart());
amap.basic_link_alpha(d, ddd, dim);
amap.basic_link_alpha(amap.template alpha<0>(d),
amap.template alpha<0>(ddd), dim);
if ( withAlpha3 )
{
dddd = amap.create_dart();
amap.template basic_link_alpha<0>(dddd, amap.create_dart());
amap.basic_link_alpha(dd, dddd, dim);
amap.basic_link_alpha(amap.template alpha<0>(dd),
amap.template alpha<0>(dddd), dim);
}
}
}*/
// Make copies of the new facet for dimension >=4
for ( unsigned int dim=4; dim<=CMap::dimension; ++dim )
{
if ( !amap.is_free(first, dim) )
{
typename CMap::Dart_handle first2 = amap.null_handle;
prec = amap.null_handle;
for ( CMap_dart_iterator_basic_of_orbit<CMap,0,1> it(amap, first);
it.cont(); ++it )
{
d = amap.create_dart();
amap.basic_link_alpha(amap.template alpha<2>(it), d, dim);
if ( withAlpha3 )
{
dd = amap.create_dart();
amap.basic_link_alpha_for_involution
(amap.template alpha<2,3>(it), dd, dim);
amap.template basic_link_alpha_for_involution<3>(d, dd);
}
if ( prec!=amap.null_handle )
{
amap.link_alpha_0(prec, d);
if ( withAlpha3 )
{
amap.basic_link_alpha_1(amap.template alpha<3>(prec), dd);
}
}
else first2 = prec;
// We consider dim2=2 out of the loop to use link_alpha instead of
// basic _link_alpha (to modify non void attributes only once).
if ( !amap.template is_free<2>(it) &&
amap.is_free(amap.template alpha<2>(it), dim) )
amap.template link_alpha_for_involution<2>
(amap.alpha(it,2,dim), d);
if ( withAlpha3 &&
!amap.template is_free<2>(amap.template alpha<3>(it)) &&
amap.is_free(amap.template alpha<3,2>(it), dim) )
amap.template link_alpha_for_involution<2>(amap.alpha(it,3,2,dim), dd);
for ( unsigned int dim2=3; dim2<=CMap::dimension; ++dim2 )
{
if ( dim2+1!=dim && dim2!=dim && dim2!=dim+1 )
{
if ( !amap.is_free(it, dim2) && amap.is_free(amap.alpha(it, dim2), dim) )
amap.basic_link_alpha_for_involution(amap.alpha(it, dim2, dim),
d, dim2);
if ( withAlpha3 && !amap.is_free(amap.template alpha<3>(it), dim2) &&
amap.is_free(amap.alpha(it, 3, dim2), dim) )
amap.basic_link_alpha_for_involution
(amap.alpha(it, 3, dim2, dim), dd, dim2);
}
}
prec = d;
}
amap.basic_link_alpha_0( prec, first2 );
if ( withAlpha3 )
{
amap.basic_link_alpha_1( amap.template alpha<3>(prec),
amap.template alpha<3>(first2) );
}
}
}
// Degroup the attributes
if ( withAlpha3 )
{ // Here we cannot use Degroup_attribute_functor_run as new darts do not
// have their 3-attribute
CGAL::internal::Degroup_attribute_functor_run<CMap, 3>::
run(&amap, first, amap.template alpha<3>(first));
}
#ifdef CGAL_CMAP_TEST_VALID_INSERTIONS
CGAL_assertion( amap.is_valid() );
#endif
return first;
}
} // namespace CGAL
#endif // CGAL_GENERALIZED_MAP_INSERTIONS_H

View File

@ -0,0 +1,237 @@
// Copyright (c) 2014 CNRS and LIRIS' Establishments (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 3 of the License,
// or (at your option) any later version.
//
// 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#ifndef CGAL_GENERALIZED_MAP_ITERATORS_BASE_HH
#define CGAL_GENERALIZED_MAP_ITERATORS_BASE_HH 1
// to get OperationState type, some OP, and CMap_dart_iterator
#include <CGAL/Combinatorial_map_iterators_base.h>
// Other includes
#include <CGAL/Compact_container.h>
#include <queue>
#include <boost/mpl/if.hpp>
#include <boost/type_traits/is_same.hpp>
namespace CGAL {
/** @file generalized_map_iterators_base.h
* Basic classes that serve as tools for definition of iterators.
* There is 1 class:
* - GMap_extend_iterator<GMap,Ite,Ai> to extend the given iterator by
* adding the involution Ai.
*/
//****************************************************************************
/// Enum of all the possible operations used by the ++ operator.
/// Extension of the enum for generalized maps.
enum
{
OP_ALPHAI=OP_END+1, ///< Previous op was the first alpha.
OP_ALPHAJ, ///< Previous op was the second alpha.
OP_ALPHAK, ///< Previous op was the third alpha.
OP_ALPHAIJ, ///< Previous op was the composition of two alpha.
OP_ALPHAJI, ///< Previous op was the composition of two alpha.
};
//****************************************************************************
/* Class GMap_extend_iterator<Map,Ite,Ai> which extend a given iterator by
* adding Ai and by using a stack and a mark.
* General case when Ite does not have already a stack.
*/
template <typename Map_,typename Ite,int Ai,
typename Ite_has_stack=typename Ite::Use_mark>
class GMap_extend_iterator: public Ite
{
public:
typedef GMap_extend_iterator<Map_,Ite,Ai, Ite_has_stack> Self;
typedef Ite Base;
typedef typename Base::Dart_handle Dart_handle;
typedef typename Base::Map Map;
typedef Tag_true Use_mark;
CGAL_static_assertion( (Ai<=Map::dimension &&
boost::is_same<Ite_has_stack,Tag_false>::value) );
public:
/// Main constructor.
GMap_extend_iterator(Map& amap, Dart_handle adart, int amark):
Base(amap, adart),
mmark_number(amark),
minitial_dart(adart)
{
if ( adart!=amap.null_handle )
{
this->mmap->mark(adart, mmark_number);
if (!this->mmap->template is_free<Ai>(adart))
{
mto_treat.push(this->mmap->template alpha<Ai>(adart));
this->mmap->mark(this->mmap->template alpha<Ai>(adart),
mmark_number);
}
}
}
/// Rewind of the iterator to its beginning.
void rewind()
{
CGAL_assertion(mmark_number != -1);
Base::operator= ( Base(*this->mmap,minitial_dart) );
mto_treat = std::queue<Dart_handle>();
this->mmap->mark(minitial_dart, mmark_number);
if (!this->mmap->template is_free<Ai>(minitial_dart))
{
mto_treat.push(this->mmap->template alpha<Ai>(minitial_dart));
this->mmap->mark(this->mmap->template alpha<Ai>(minitial_dart),
mmark_number);
}
}
/// Prefix ++ operator.
Self& operator++()
{
CGAL_assertion(mmark_number != -1);
CGAL_assertion(this->cont());
do
{
Base::operator++();
}
while ( this->cont() &&
this->mmap->is_marked(*this, mmark_number) );
if ( !this->cont() )
{
if ( !mto_treat.empty() )
{
Base::operator= ( Base(*this->mmap,mto_treat.front()) );
mto_treat.pop();
this->mprev_op = OP_POP;
CGAL_assertion( this->mmap->is_marked((*this), mmark_number) );
if (!this->mmap->is_free(*this, Ai) &&
!this->mmap->is_marked(this->mmap->alpha(*this, Ai), mmark_number) )
{
mto_treat.push(this->mmap->alpha(*this, Ai));
this->mmap->mark(this->mmap->alpha(*this, Ai), mmark_number);
}
}
}
else
{
this->mmap->mark((*this), mmark_number);
if (!this->mmap->is_free(*this, Ai) &&
!this->mmap->is_marked(this->mmap->alpha(*this, Ai), mmark_number) )
{
mto_treat.push(this->mmap->alpha(*this, Ai));
this->mmap->mark(this->mmap->alpha(*this, Ai), mmark_number);
}
}
return *this;
}
/// Postfix ++ operator.
Self operator++(int)
{ Self res=*this; operator ++(); return res; }
protected:
/// Queue of darts to process.
std::queue<Dart_handle> mto_treat;
/// Index of the used mark.
int mmark_number;
/// Initial dart
Dart_handle minitial_dart;
};
//****************************************************************************
/* Class GMap_extend_iterator<Map,Ite,Ai> which extend a given iterator by
* adding Ai and by using a stack and a mark.
* Specialization when Ite has already a stack.
*/
template <typename Map_,typename Ite,int Ai>
class GMap_extend_iterator<Map_,Ite,Ai,Tag_true>: public Ite
{
public:
typedef GMap_extend_iterator<Map_,Ite,Ai,Tag_true> Self;
typedef Ite Base;
typedef typename Base::Dart_handle Dart_handle;
typedef typename Base::Map Map;
typedef Tag_true Use_mark;
/// Main constructor.
GMap_extend_iterator(Map& amap, Dart_handle adart, int amark):
Base(amap, adart, amark)
{
if (adart!=amap.null_handle)
{
if (!this->mmap->is_free(adart, Ai) &&
!this->mmap->is_marked(this->mmap->alpha(amap, Ai), this->mmark_number))
{
this->mto_treat.push(adart->alpha(Ai));
this->mmap->mark(this->mmap->alpha(this->minitial_dart, Ai), this->mmark_number);
}
}
}
/// Rewind of the iterator to its beginning.
void rewind()
{
CGAL_assertion(this->mmark_number != -1);
Base::rewind();
if ( !this->mmap->is_free(this->minitial_dart, Ai) )
{
this->mto_treat.push(this->mmap->alpha(this->minitial_dart, Ai));
this->mmap->mark(this->mmap->alpha(this->minitial_dart, Ai), this->mmark_number);
}
}
/// Prefix ++ operator.
Self& operator++()
{
Base::operator++();
if ( this->cont() )
{
CGAL_assertion( this->mmap->is_marked(*this, this->mmark_number) );
if (!this->mmap->is_free(*this, Ai) &&
!this->mmap->is_marked(this->mmap->alpha(*this, Ai),
this->mmark_number))
{
this->mto_treat.push(this->mmap->alpha(*this, Ai));
this->mmap->mark(this->mmap->alpha(*this, Ai), this->mmark_number);
}
}
return *this;
}
/// Postfix ++ operator.
Self operator++(int)
{ Self res=*this; operator ++(); return res; }
};
//****************************************************************************
//****************************************************************************
} // namespace CGAL
//******************************************************************************
#endif // CGAL_GENERALIZED_MAP_ITERATORS_BASE_HH
//******************************************************************************

View File

@ -0,0 +1,50 @@
// Copyright (c) 2014 CNRS and LIRIS' Establishments (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 3 of the License,
// or (at your option) any later version.
//
// 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#ifndef CGAL_GENERALIZED_MAP_MIN_ITEMS_H
#define CGAL_GENERALIZED_MAP_MIN_ITEMS_H 1
#include <CGAL/GMap_dart.h>
namespace CGAL {
/** @file Generalized_map_min_items.h
* Definition of min item class for dD generalized map.
*/
/** Minimal items for dD generalized map.
* Generalized_map_min_items defines what is the minimal item
* class for a d-gmap It provides definitions for darts without attribute.
*/
template <unsigned int d>
struct Generalized_map_min_items
{
/// Dart_wrapper defines the type of darts used, and enabled attributes.
template < class Refs >
struct Dart_wrapper
{
typedef CGAL::GMap_dart< d, Refs > Dart;
typedef CGAL::cpp11::tuple<> Attributes;
};
};
} // namespace CGAL
#endif // CGAL_GENERALIZED_MAP_MIN_ITEMS_H //
// EOF //

View File

@ -0,0 +1,422 @@
// Copyright (c) 2014 CNRS and LIRIS' Establishments (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 3 of the License,
// or (at your option) any later version.
//
// 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#ifndef CGAL_GENERALIZED_MAP_OPERATIONS_H
#define CGAL_GENERALIZED_MAP_OPERATIONS_H 1
#include <CGAL/Generalized_map.h>
#include <CGAL/Generalized_map_insertions.h>
#include <deque>
#include <stack>
namespace CGAL
{
/** @file Generalized_map_operations.h
* Some operations to modify a generalized map.
*/
/** Test if an i-cell can be removed.
* An i-cell can be removed if i==CMap::dimension or i==CMap::dimension-1,
* or if there are at most two (i+1)-cell incident to it.
* @param adart a dart of the i-cell.
* @return true iff the i-cell can be removed.
*/
template <class CMap, unsigned int i, unsigned int nmi=CMap::dimension-i>
struct Is_removable_functor
{
static bool run(const CMap& amap, typename CMap::Dart_const_handle adart)
{
// TODO? Optimisation for dim-2, and to not test all the darts of the cell?
bool res = true;
for ( CGAL::GMap_dart_const_iterator_of_cell<CMap,i> it(amap, adart);
res && it.cont(); ++it )
{
if (amap.template alpha<i+2,i+1>(it)!=amap.template alpha<i+1,i+2>(it))
res = false;
}
return res;
}
};
// Specialization for i=CMap::dimension
template <class CMap, unsigned int i>
struct Is_removable_functor<CMap, i, 0>
{
static bool run(const CMap&, typename CMap::Dart_const_handle)
{ return true; }
};
// Specialization for i=CMap::dimension-1
template <class CMap, unsigned int i>
struct Is_removable_functor<CMap, i, 1>
{
static bool run(const CMap&, typename CMap::Dart_const_handle)
{ return true; }
};
/** Test if an i-cell can be removed.
* An i-cell can be removed if i==CMap::dimension or i==CMap::dimension-1,
* or if there are at most two (i+1)-cell incident to it.
* @param adart a dart of the i-cell.
* @return true iff the i-cell can be removed.
*/
template < class CMap, unsigned int i >
bool is_removable(const CMap& amap, typename CMap::Dart_const_handle adart)
{ return CGAL::Is_removable_functor<CMap, i>::run(amap,adart); }
/** Remove an i-cell, 0<=i<dimension, and merge eventually both incident
* (i+1)-cells.
* @param amap the used generalized map.
* @param adart a dart of the i-cell to remove.
* @return the number of deleted darts.
*/
template<class CMap, unsigned int i, unsigned int nmi>
struct Remove_cell_functor
{
static size_t run(CMap& amap, typename CMap::Dart_handle adart)
{
CGAL_static_assertion ( i<CMap::dimension );
CGAL_assertion( (is_removable<CMap,i>(amap, adart)) );
size_t res = 0;
typename CMap::Dart_handle d1, d2;
typename CMap::Dart_handle dg1=amap.null_handle, dg2=amap.null_handle;
int mark = amap.get_new_mark();
int mark_modified_darts = amap.get_new_mark();
std::deque<typename CMap::Dart_handle> to_erase;
// First we store and mark all the darts of the i-cell to remove.
for ( CGAL::GMap_dart_iterator_basic_of_cell<CMap,i> it(amap,adart,mark);
it.cont(); ++it )
{
to_erase.push_back(it);
if ( !amap.template is_free<i+1>(it) && dg1==amap.null_handle )
{ dg1=it; dg2=amap.template alpha<i+1>(it); }
amap.mark(it, mark);
++res;
}
// We group the two (i+1)-cells incident if they exist.
if ( dg1!=amap.null_handle )
CGAL::internal::Group_attribute_functor_run<CMap, i+1>::
run(&amap, dg1, dg2);
// During the operation, we store in modified_darts the darts modified
// to test after the loop the non void attributes that are split.
std::deque<typename CMap::Dart_handle> modified_darts;
// For each dart of the i-cell, we modify i-links of neighbors.
typename std::deque<typename CMap::Dart_handle>::iterator it =
to_erase.begin();
for ( ; it!=to_erase.end(); ++it )
{
d1=amap.template alpha<i>(*it);
if ( !amap.is_marked(d1, mark) )
{
d2=amap.template alpha<i+1,i>(*it);
while ( amap.is_marked(d2, mark) )
{
d2=amap.template alpha<i+1,i>(d2);
}
if ( !amap.is_marked(d1, mark_modified_darts) )
{
CGAL_assertion( !amap.is_marked(d2, mark_modified_darts) );
amap.template basic_link_alpha<i>(d1, d2);
amap.mark(d1, mark_modified_darts);
modified_darts.push_back(d1);
// TODO push only one out of two dart ?
if ( d2!=d1 )
{
modified_darts.push_back(d2);
amap.mark(d2, mark_modified_darts);
}
}
}
}
// We test the split of all the incident cells for all the non
// void attributes.
CMap::Helper::template Foreach_enabled_attributes_except
<CGAL::internal::Test_split_attribute_functor<CMap,i>, i>::
run(&amap, modified_darts, mark_modified_darts);
// We remove all the darts of the i-cell.
for ( it=to_erase.begin(); it!=to_erase.end(); ++it )
{ amap.erase_dart(*it); }
CGAL_assertion( amap.is_whole_map_unmarked(mark) );
amap.free_mark(mark);
// If no attribute is enabled (or if only i-attributes are enabled),
// the darts are not unmark by Foreach_enabled_attributes_except.
// Thus we unmark them now.
if ( !amap.is_whole_map_unmarked(mark_modified_darts) )
{
for ( it=modified_darts.begin();
it!=modified_darts.end(); ++it )
amap.unmark(*it, mark_modified_darts);
}
CGAL_assertion ( amap.is_whole_map_unmarked(mark_modified_darts) );
amap.free_mark(mark_modified_darts);
#ifdef CGAL_GMAP_TEST_VALID_REMOVALS
CGAL_assertion( amap.is_valid() );
#endif
return res;
}
};
/** Remove a d-cell, in a d-map (special case).
* @param amap the used combinatorial map.
* @param adart a dart of the volume to remove.
* @return the number of deleted darts.
*/
template<class Gmap,unsigned int i>
struct Remove_cell_functor<Gmap,i,0>
{
static size_t run(Gmap& amap, typename Gmap::Dart_handle adart)
{
int mark = amap.get_new_mark();
std::deque<typename Gmap::Dart_handle> to_erase;
size_t res = 0;
std::deque<typename Gmap::Dart_handle> modified_darts;
// We mark all the darts of the d-cell.
for ( CGAL::GMap_dart_iterator_basic_of_cell<Gmap,Gmap::dimension>
it(amap,adart,mark); it.cont(); ++it )
{
to_erase.push_back(it);
amap.mark(it,mark);
++res;
}
// We unlink all the darts of the volume for alpha-d.
typename std::deque<typename Gmap::Dart_handle>::iterator
it = to_erase.begin();
for ( it = to_erase.begin(); it != to_erase.end(); ++it )
{
if ( !amap.template is_free<Gmap::dimension>(*it) &&
!amap.is_marked(amap.template alpha<Gmap::dimension>(*it), mark) )
{
modified_darts.push_back(amap.template alpha<Gmap::dimension>(*it));
amap.template unlink_alpha<Gmap::dimension>(*it);
}
}
// We test the split of all the incident cells for all the non
// void attributes.
Gmap::Helper::template Foreach_enabled_attributes_except
<CGAL::internal::Test_split_attribute_functor<Gmap,i>,
Gmap::dimension>::run(&amap, modified_darts);
// We remove all the darts of the d-cell.
for ( it = to_erase.begin(); it != to_erase.end(); ++it )
{ amap.erase_dart(*it); }
CGAL_assertion( amap.is_whole_map_unmarked(mark) );
amap.free_mark(mark);
#ifdef CGAL_GMAP_TEST_VALID_REMOVALS
CGAL_assertion( amap.is_valid() );
#endif
return res;
}
};
/** Remove an i-cell, 0<=i<=dimension.
* @param amap the used generalized map.
* @param adart a dart of the i-cell to remove.
* @return the number of deleted darts.
*/
template< class Gmap, unsigned int i >
size_t remove_cell(Gmap& amap, typename Gmap::Dart_handle adart)
{
return
CGAL::Remove_cell_functor<Gmap,i,Gmap::dimension-i>::run(amap,adart);
}
/** Test if an i-cell can be contracted.
* An i-cell can be contracted if i==1
* or if there are at most two (i-1)-cell incident to it.
* @param adart a dart of the i-cell.
* @return true iff the i-cell can be contracted.
*/
template <class Gmap, unsigned int i>
struct Is_contractible_functor
{
static bool run(const Gmap& amap, typename Gmap::Dart_const_handle adart)
{
// TODO ? Optimisation possible to not test all the darts of the cell ?
bool res = true;
for ( CGAL::GMap_dart_const_iterator_of_cell<Gmap,i> it(amap, adart);
res && it.cont(); ++it )
{
if (amap.template alpha<i-2,i-1>(it)!=amap.template alpha<i-1,i-2>(it))
res = false;
}
return res;
}
};
// Specialization for i=0
template <class Gmap>
struct Is_contractible_functor<Gmap, 0>
{
static bool run(const Gmap&, typename Gmap::Dart_const_handle)
{ return false; }
};
// Specialization for i=1
template <class Gmap>
struct Is_contractible_functor<Gmap, 1>
{
static bool run(const Gmap&, typename Gmap::Dart_const_handle)
{ return true; }
};
/** Test if an i-cell can be contracted.
* An i-cell can be contracted if i==1
* or if there are at most two (i-1)-cell incident to it.
* @param adart a dart of the i-cell.
* @return true iff the i-cell can be contracted.
*/
template < class Gmap, unsigned int i >
bool is_contractible(const Gmap& amap, typename Gmap::Dart_const_handle adart)
{ return CGAL::Is_contractible_functor<Gmap, i>::run(amap,adart); }
/** Contract an i-cell, 1<=i<=dimension, and merge eventually both incident
* (i-1)-cells.
* @param amap the used generalized map.
* @param adart a dart of the i-cell to contract.
* @return the number of deleted darts.
*/
template<class Gmap, unsigned int i>
struct Contract_cell_functor
{
static size_t run(Gmap& amap, typename Gmap::Dart_handle adart)
{
CGAL_static_assertion ( 1<=i && i<=Gmap::dimension );
CGAL_assertion( (is_contractible<Gmap,i>(amap, adart)) );
size_t res = 0;
typename Gmap::Dart_handle d1, d2;
typename Gmap::Dart_handle dg1=amap.null_handle, dg2=amap.null_handle;
int mark = amap.get_new_mark();
int mark_modified_darts = amap.get_new_mark();
// First we store and mark all the darts of the i-cell to contract.
std::deque<typename Gmap::Dart_handle> to_erase;
for ( CGAL::GMap_dart_iterator_basic_of_cell<Gmap,i> it(amap,adart,mark);
it.cont(); ++it )
{
to_erase.push_back(it);
if ( !amap.template is_free<i-1>(it) && dg1==amap.null_handle )
{ dg1=it; dg2=amap.template alpha<i-1>(it); }
amap.mark(it, mark);
++res;
}
// We group the two (i-1)-cells incident if they exist.
if ( dg1!=amap.null_handle )
CGAL::internal::Group_attribute_functor_run<Gmap,i-1>::
run(&amap, dg1, dg2);
// During the operation, we store in modified_darts the darts modified
// to test after the loop the non void attributes that are split.
std::deque<typename Gmap::Dart_handle> modified_darts;
// For each dart of the i-cell, we modify i-links of neighbors.
typename std::deque<typename Gmap::Dart_handle>::iterator it =
to_erase.begin();
for ( ; it!=to_erase.end(); ++it )
{
d1 = amap.template alpha<i>(*it);
if ( !amap.is_marked(d1, mark) )
{
d2 = amap.template alpha<i-1,i>(*it);
while ( amap.is_marked(d2, mark) )
{ d2 = amap.template alpha<i-1,i>(d2); }
if ( !amap.is_marked(d1, mark_modified_darts) )
{
CGAL_assertion( !amap.is_marked(d2, mark_modified_darts) );
amap.template basic_link_alpha<i>(d1, d2);
amap.mark(d1, mark_modified_darts);
modified_darts.push_back(d1);
// TODO push only one out of two dart ?
if ( d1!=d2 )
{
amap.mark(d2, mark_modified_darts);
modified_darts.push_back(d2);
}
}
}
}
// We test the split of all the incident cells for all the non
// void attributes.
Gmap::Helper::template Foreach_enabled_attributes_except
<CGAL::internal::Test_split_attribute_functor<Gmap,i>, i>::
run(&amap, modified_darts, mark_modified_darts);
// We remove all the darts of the i-cell.
for ( it=to_erase.begin(); it!=to_erase.end(); ++it )
{ amap.erase_dart(*it); }
CGAL_assertion( amap.is_whole_map_unmarked(mark) );
amap.free_mark(mark);
// If no attribute is enabled (or if only i-attributes are enabled),
// the darts are not unmark by Foreach_enabled_attributes_except.
// Thus we unmark them now.
if ( !amap.is_whole_map_unmarked(mark_modified_darts) )
{
for ( it=modified_darts.begin(); it!=modified_darts.end(); ++it )
amap.unmark(*it, mark_modified_darts);
}
CGAL_assertion ( amap.is_whole_map_unmarked(mark_modified_darts) );
amap.free_mark(mark_modified_darts);
#ifdef CGAL_GMAP_TEST_VALID_CONTRACTIONS
CGAL_assertion( amap.is_valid() );
#endif
return res;
}
};
/** Contract an i-cell, 1<=i<=dimension.
* @param amap the used generalized map.
* @param adart a dart of the i-cell to remove.
* @return the number of deleted darts.
*/
template < class Gmap, unsigned int i >
size_t contract_cell(Gmap& amap, typename Gmap::Dart_handle adart)
{ return CGAL::Contract_cell_functor<Gmap,i>::run(amap,adart); }
} // namespace CGAL
#endif // CGAL_GENERALIZED_MAP_OPERATIONS_H //
// EOF //

View File

@ -0,0 +1,359 @@
// Copyright (c) 2014 CNRS and LIRIS' Establishments (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 3 of the License,
// or (at your option) any later version.
//
// 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#ifndef CGAL_GENERALIZED_MAP_STORAGES_H
#define CGAL_GENERALIZED_MAP_STORAGES_H 1
#include <CGAL/Combinatorial_map_storages.h>
namespace CGAL {
/** @file Generalized_map_storages.h
* Definition of storages for dD Generalized map.
*/
// Storage of darts with compact container, alpha with handles
template<unsigned int d_, class Items_, class Alloc_ >
class Generalized_map_storage_1
{
public:
typedef Generalized_map_storage_1<d_, Items_, Alloc_> Self;
typedef CGAL::Tag_false Use_index;
typedef internal::Combinatorial_map_helper<Self> Helper;
typedef typename Items_::template Dart_wrapper<Self> Dart_wrapper;
typedef typename Dart_wrapper::Dart Dart;
typedef typename Alloc_::template rebind<Dart>::other Dart_allocator;
typedef Compact_container<Dart,Dart_allocator> Dart_container;
typedef typename Dart_container::iterator Dart_handle;
typedef typename Dart_container::const_iterator Dart_const_handle;
typedef typename Dart_container::size_type size_type;
typedef CGAL::Void* Null_handle_type;
static Null_handle_type null_handle;
typedef Items_ Items;
typedef Alloc_ Alloc;
template <typename T>
struct Container_for_attributes :
public Compact_container<T, typename Alloc_::template rebind<T>::other>
{};
/// Typedef for attributes
typedef typename Dart_wrapper::Attributes Attributes;
template<int i>
struct Attribute_type: public Helper::template Attribute_type<i>
{};
template<int i>
struct Attribute_handle: public Helper::template Attribute_handle<i>
{};
template<int i>
struct Attribute_const_handle:
public Helper::template Attribute_const_handle<i>
{};
template<int i>
struct Attribute_range: public Helper::template Attribute_range<i>
{};
template<int i>
struct Attribute_const_range:
public Helper::template Attribute_const_range<i>
{};
/// Number of marks
static const size_type NB_MARKS = 32;
/// The dimension of the generalized map.
static const unsigned int dimension = d_;
typedef Handle_hash_function Hash_function;
// Init
void init_storage()
{}
/** Return if this dart is free for adimension.
* @param dh a dart handle
* @param i the dimension.
* @return true iff dh is linked with NULL for \em adimension.
*/
template<unsigned int i>
bool is_free(Dart_const_handle dh) const
{
CGAL_assertion( dh!=NULL );
CGAL_assertion(i <= dimension);
return dh->malpha[i]==dh;
}
bool is_free(Dart_const_handle dh, unsigned int i) const
{
CGAL_assertion( dh!=NULL );
CGAL_assertion(i <= dimension);
return dh->malpha[i]==dh;
}
/// Set simultaneously all the marks of this dart to a given value.
void set_dart_marks(Dart_const_handle ADart,
const std::bitset<NB_MARKS>& amarks) const
{
CGAL_assertion( ADart!=NULL );
ADart->set_marks(amarks);
}
/// Return all the marks of a dart.
std::bitset<NB_MARKS> get_dart_marks(Dart_const_handle ADart) const
{
CGAL_assertion( ADart!=NULL );
return ADart->get_marks();
}
/// Return the mark value of dart a given mark number.
bool get_dart_mark(Dart_const_handle ADart, int amark) const
{
CGAL_assertion( ADart!=NULL );
return ADart->get_mark(amark);
}
/// Set the mark of a given mark number to a given value.
void set_dart_mark(Dart_const_handle ADart, int amark, bool avalue) const
{
CGAL_assertion( ADart!=NULL );
ADart->set_mark(amark, avalue);
}
/// Flip the mark of a given mark number to a given value.
void flip_dart_mark(Dart_const_handle ADart, int amark) const
{
CGAL_assertion( ADart!=NULL );
ADart->flip_mark(amark);
}
// Access to alpha maps
Dart_handle get_alpha(Dart_handle ADart, int B1)
{
CGAL_assertion(ADart!=NULL && B1>=0 && B1<=(int)dimension);
return ADart->malpha[B1];
}
Dart_const_handle get_alpha(Dart_const_handle ADart, int B1) const
{
CGAL_assertion(ADart!=NULL && B1>=0 && B1<=(int)dimension);
return ADart->malpha[B1];
}
template<int B1>
Dart_handle get_alpha(Dart_handle ADart)
{
CGAL_assertion(ADart!=NULL && B1>=0 && B1<=(int)dimension);
return ADart->malpha[B1];
}
template<int B1>
Dart_const_handle get_alpha(Dart_const_handle ADart) const
{
CGAL_assertion(ADart!=NULL && B1>=0 && B1<=(int)dimension);
return ADart->malpha[B1];
}
// return a handle on the i-attribute
template<unsigned int i>
typename Attribute_handle<i>::type attribute(Dart_handle ADart)
{
CGAL_static_assertion_msg(Helper::template Dimension_index<i>::value>=0,
"attribute<i> called but i-attributes are disabled.");
return CGAL::cpp11::get<Helper::template Dimension_index<i>::value>
(ADart->mattribute_handles);
}
template<unsigned int i>
typename Attribute_const_handle<i>::type
attribute(Dart_const_handle ADart) const
{
CGAL_static_assertion_msg(Helper::template Dimension_index<i>::value>=0,
"attribute<i> called but i-attributes are disabled.");
return CGAL::cpp11::get<Helper::template Dimension_index<i>::value>
(ADart->mattribute_handles);
}
// get the attribute given its handle
template<unsigned int i>
typename Attribute_type<i>::type&
get_attribute(typename Attribute_handle<i>::type ah)
{
CGAL_assertion( ah!=NULL );
return *ah;
}
template<unsigned int i>
const typename Attribute_type<i>::type&
get_attribute(typename Attribute_const_handle<i>::type ah) const
{
CGAL_assertion( ah!=NULL );
return *ah;
}
Dart & get_dart(Dart_handle ah)
{
CGAL_assertion( ah!=NULL );
return *ah;
}
const Dart & get_dart(Dart_const_handle ah) const
{
CGAL_assertion( ah!=NULL );
return *ah;
}
// Get the dart of the given attribute
template<unsigned int i>
Dart_handle dart_of_attribute(typename Attribute_handle<i>::type ah)
{
CGAL_assertion( ah!=NULL );
return ah->dart();
}
template<unsigned int i>
Dart_const_handle
dart_of_attribute(typename Attribute_const_handle<i>::type ah) const
{
CGAL_assertion( ah!=NULL );
return ah->dart();
}
// Set the dart of the given attribute
template<unsigned int i>
void set_dart_of_attribute(typename Attribute_handle<i>::type ah,
Dart_handle adart)
{
CGAL_assertion( ah!=NULL );
ah->set_dart(adart);
}
// Get the info of the given attribute
template<unsigned int i>
typename Attribute_type<i>::type::Info &
info_of_attribute(typename Attribute_handle<i>::type ah)
{
CGAL_assertion( ah!=NULL );
return ah->info();
}
template<unsigned int i>
const typename Attribute_type<i>::type::Info &
info_of_attribute(typename Attribute_const_handle<i>::type ah) const
{
CGAL_assertion( ah!=NULL );
return ah->info();
}
// Get the info of the i-cell attribute associated with the given dart
template<unsigned int i>
typename Attribute_type<i>::type::Info & info(Dart_handle adart)
{
CGAL_assertion( adart!=NULL );
CGAL_assertion( attribute<i>(adart)!=NULL );
return info_of_attribute<i>(attribute<i>(adart));
}
template<unsigned int i>
const typename Attribute_type<i>::type::Info &
info(Dart_const_handle adart) const
{
CGAL_assertion( adart!=NULL );
CGAL_assertion( attribute<i>(adart)!=NULL );
return info_of_attribute<i>(attribute<i>(adart));
}
// Get the dart of the i-cell attribute associated with the given dart
template<unsigned int i>
Dart_handle & dart(Dart_handle adart)
{
CGAL_assertion( adart!=NULL );
CGAL_assertion( attribute<i>(adart)!=NULL );
return dart_of_attribute<i>(attribute<i>(adart));
}
template<unsigned int i>
Dart_const_handle dart(Dart_const_handle adart) const
{
CGAL_assertion( adart!=NULL );
CGAL_assertion( attribute<i>(adart)!=NULL );
return dart_of_attribute<i>(attribute<i>(adart));
}
void display_dart(Dart_const_handle ADart) const
{ std::cout<<&*ADart; }
template<unsigned int i>
void display_attribute(typename Attribute_const_handle<i>::type ah) const
{ std::cout<<&*ah; }
protected:
// Set the handle on the i th attribute
template<unsigned int i>
void basic_set_dart_attribute(Dart_handle dh,
typename Attribute_handle<i>::type ah)
{
CGAL::cpp11::get<Helper::template Dimension_index<i>::value>
(dh->mattribute_handles) = ah;
}
/** Link a dart with a given dart for a given dimension.
* @param adart the dart to link.
* @param adart2 the dart to link with.
* @param i the dimension.
*/
template<unsigned int i>
void dart_link_alpha(Dart_handle adart, Dart_handle adart2)
{
CGAL_assertion(i <= dimension);
CGAL_assertion(adart!=NULL && adart2!=NULL);
adart->malpha[i] = adart2;
}
void dart_link_alpha(Dart_handle adart, Dart_handle adart2, unsigned int i)
{
CGAL_assertion(i <= dimension);
CGAL_assertion(adart!=NULL && adart2!=NULL);
adart->malpha[i] = adart2;
}
/** Unlink a dart for a given dimension.
* @param adart a dart.
* @param i the dimension.
*/
template<unsigned int i>
void dart_unlink_alpha(Dart_handle adart)
{
CGAL_assertion(adart!=NULL && i <= dimension);
adart->malpha[i] = adart;
}
void dart_unlink_alpha(Dart_handle adart, unsigned int i)
{
CGAL_assertion(adart!=NULL && i <= dimension);
adart->malpha[i] = adart;
}
protected:
/// Dart container.
Dart_container mdarts;
/// Tuple of attributes containers
typename Helper::Attribute_containers mattribute_containers;
};
/// null_handle
template < unsigned int d_, class Items_, class Alloc_ >
typename Generalized_map_storage_1<d_, Items_, Alloc_>::Null_handle_type
Generalized_map_storage_1<d_, Items_, Alloc_>::null_handle = NULL;
} // namespace CGAL
#endif // CGAL_GENERALIZED_MAP_STORAGES_H //
// EOF //

View File

@ -0,0 +1,426 @@
// Copyright (c) 2014 CNRS and LIRIS' Establishments (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 3 of the License,
// or (at your option) any later version.
//
// 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#ifndef CGAL_GENERALIZED_MAP_GROUP_FUNCTORS_H
#define CGAL_GENERALIZED_MAP_GROUP_FUNCTORS_H 1
#include <CGAL/Unique_hash_map.h>
#include <CGAL/internal/Generalized_map_internal_functors.h>
#include <CGAL/GMap_dart_iterators.h>
#include <CGAL/Combinatorial_map_functors.h>
/* Definition of functors used to group/ungroup attributes (we need functors
* as attributes are stored in tuple, thus all the access must be done at
* compiling time). Some of these functors are used with
* Foreach_enabled_attributes to iterate through all the non void attribs.
* These functors used other functors defined in Combinatorial_map_functors.h
*
* Group_attribute_functor_of_dart<CMap> to group the <i>-attributes of two
* given darts (except for j-dim). Only the attributes of the two given
* darts are possibly modified.
*
* Group_attribute_functor_of_dart_run<CMap,i> same than
* Group_attribute_functor_of_dart<CMap>::run<i>, with i template argument
* given in the struct to enable specialization.
*
* Group_attribute_functor<CMap> to group the <i>-attributes of two
* given i-cells (except for j-adim). If one i-attribute is NULL, we set the
* darts of its i-cell to the second attribute. If both i-attributes are
* non NULL, we overide all the i-attribute of the second i-cell to the
* first i-attribute.
*
* Degroup_attribute_functor_run<CMap> to degroup one i-attributes in two
* (except for j-adim).
*
* Test_split_attribute_functor<CMap,i> to test if there is some i-attributes
* that are split after an operation. Modified darts are given in a
* std::deque.
*/
namespace CGAL
{
namespace internal
{
// ************************************************************************
/// Functor used for link_beta to update the i-attributes of
/// dh2 on the attributes of dh1 dart, except if i=j.
/// (j is the dimension of the beta modified between dh1 and dh2,
/// so that after the modification we will have beta_j(dh1)==dh2)
/// Only attributes of dh1 or dh2 can be modified. If one dart as its
/// attribute equal to null, it takes the attributes of the second dart.
/// If both attributes are non null, dh2 takes the attribute of dh1.
template<typename CMap, unsigned int i, unsigned int j=CMap::dimension+1,
typename T=typename CMap::template Attribute_type<i>::type>
struct Group_attribute_functor_of_dart_run
{
/// Group the i-attribute of dh1 and dh2.
static void run(CMap* amap,
typename CMap::Dart_handle dh1,
typename CMap::Dart_handle dh2)
{
CGAL_static_assertion( i<=CMap::dimension );
CGAL_static_assertion( i!=j );
CGAL_static_assertion_msg(CMap::Helper::template
Dimension_index<i>::value>=0,
"Group_attribute_functor_of_dart_run<i> but "
"i-attributes are disabled");
typename CMap::template Attribute_handle<i>::type
a1=amap->template attribute<i>(dh1);
typename CMap::template Attribute_handle<i>::type
a2=amap->template attribute<i>(dh2);
// If the two attributes are equal, nothing to do.
if ( a1==a2 ) return;
if ( a1==CMap::null_handle ) amap->template set_dart_attribute<i>(dh1, a2);
else amap->template set_dart_attribute<i>(dh2, a1);
}
};
// Specialization for i=j. Do nothing as j is the dimension to not consider.
template<typename CMap, unsigned int i, typename T>
struct Group_attribute_functor_of_dart_run<CMap,i,i,T>
{
static void run(CMap*,
typename CMap::Dart_handle,
typename CMap::Dart_handle)
{}
};
// ************************************************************************
/// Functor used for link_beta to update the attributes of
/// adart2 on the attributes of this dart, except for j-attributes.
/// (j is the dimension of the beta modified between adart1 and adart2,
/// so that after the modification we will have beta_j(adart1)==adart2)
/// We define run<i> to allows to use this functor with
/// Foreach_enabled_attributes.
/// If you know i at compiling time, use directly
/// Group_attribute_functor_of_dart_run.
template<typename CMap, unsigned int j=CMap::dimension+1>
struct Group_attribute_functor_of_dart
{
template <unsigned int i>
static void run(CMap* amap,
typename CMap::Dart_handle adart1,
typename CMap::Dart_handle adart2)
{
CGAL::internal::Group_attribute_functor_of_dart_run<CMap,i,j>::
run(amap,adart1,adart2);
}
};
// ************************************************************************
// Functor used to group the two i-attributes of the two i-cells, except
// the attribute of j
// (j is the dimension of the beta modified between adart1 and adart2).
template<typename CMap, unsigned int i, unsigned int j=CMap::dimension+1,
typename T=typename CMap::template Attribute_type<i>::type>
struct Group_attribute_functor_run
{
static void run(CMap* amap,
typename CMap::Dart_handle adart1,
typename CMap::Dart_handle adart2)
{
CGAL_static_assertion( i<=CMap::dimension );
CGAL_static_assertion( i!=j );
CGAL_static_assertion_msg
( CMap::Helper::template Dimension_index<i>::value>=0,
"Group_attribute_functor_run<i> but i-attributes are disabled" );
typename CMap::template Attribute_handle<i>::type
a1=amap->template attribute<i>(adart1);
typename CMap::template Attribute_handle<i>::type
a2=amap->template attribute<i>(adart2);
// If the two attributes are equal, nothing to do.
if ( a1 == a2 ) return;
typename CMap::Dart_handle toSet = amap->null_handle;
// If the attribute associated to adart1 is NULL, set it with
// the attribute associated to adart2 (necessarily != NULL)
if (a1 == CMap::null_handle)
{ toSet = adart1; a1 = a2; }
else
{
toSet = adart2;
if (a2 != CMap::null_handle)
{
CGAL::internal::Call_merge_functor<CMap, i>::run(amap, a1, a2);
}
}
amap->template set_attribute<i>(toSet, a1);
}
};
// Specialization for void attributes.
template<typename CMap, unsigned int i, unsigned int j>
struct Group_attribute_functor_run<CMap, i, j, CGAL::Void>
{
static void run( CMap*,
typename CMap::Dart_handle,
typename CMap::Dart_handle )
{}
};
// Specialization for i=j. Do nothing as j is the dimension to not consider.
template<typename CMap, unsigned int i, typename T>
struct Group_attribute_functor_run<CMap,i,i,T>
{
static void run(CMap*,
typename CMap::Dart_handle,
typename CMap::Dart_handle)
{}
};
// ************************************************************************
/// Functor used for sew to update the attributes of
/// adart2 on the attributes of this dart, except for j-attributes.
/// (j is the dimension of the beta modified between adart1 and adart2,
/// so that after the modification we will have beta_j(adart1)==adart2)
/// We define run<i> to allows to use this functor with
/// Foreach_enabled_attributes.
/// If you know i at compiling time, use directly
/// Group_attribute_functor_run.
template<typename CMap, unsigned int j=CMap::dimension+1>
struct Group_attribute_functor
{
template <unsigned int i>
static void run(CMap* amap,
typename CMap::Dart_handle adart1,
typename CMap::Dart_handle adart2)
{ CGAL::internal::Group_attribute_functor_run<CMap,i,j>::
run(amap,adart1,adart2); }
};
// ************************************************************************
// Functor used to degroup one i-attribute of one i-cell in two, except the
// attribute of j.
template<typename CMap, unsigned int i, unsigned int j=CMap::dimension+1,
typename T=typename CMap::template Attribute_type<i>::type>
struct Degroup_attribute_functor_run
{
static void run(CMap* amap,
typename CMap::Dart_handle adart1,
typename CMap::Dart_handle adart2)
{
CGAL_static_assertion( i<=CMap::dimension );
CGAL_static_assertion( i!=j );
CGAL_static_assertion_msg
( CMap::Helper::template Dimension_index<i>::value>=0,
"Degroup_attribute_functor_run<i> but i-attributes are disabled" );
typename CMap::template Attribute_handle<i>::type
a1=amap->template attribute<i>(adart1);
// If there is no first attribute, nothing to degroup.
if ( a1==CMap::null_handle ) return;
// If the second attribute is non null and already different from a1,
// nothing to do.
if ( a1!=amap->template attribute<i>(adart2) &&
amap->template attribute<i>(adart2)!=CMap::null_handle ) return;
CGAL_assertion( (!CGAL::belong_to_same_cell<CMap,i>
(*amap, adart1, adart2)) );
// As we split, we set the dart of the first attribute to adart1 for which
// we are sure it belongs to the first i-cell.
amap->template get_attribute<i>(a1).set_dart(adart1);
typename CMap::template Attribute_handle<i>::type
a2 = amap->template
create_attribute<i>(amap->template get_attribute<i>(a1));
amap->template set_attribute<i>(adart2, a2);
CGAL::internal::Call_split_functor<CMap, i>::run(amap, a1, a2);
}
};
// Specialization for void attributes.
template<typename CMap, unsigned int i, unsigned int j>
struct Degroup_attribute_functor_run<CMap, i, j, CGAL::Void>
{
static void run(CMap*,
typename CMap::Dart_handle,
typename CMap::Dart_handle)
{}
};
// Specialization for i==j.
template<typename CMap, unsigned int i, typename T>
struct Degroup_attribute_functor_run<CMap, i, i, T>
{
static void run(CMap*,
typename CMap::Dart_handle,
typename CMap::Dart_handle)
{}
};
// ************************************************************************
// Function used by Test_split_attribute_functor_run to process one dart.
// Test the split of the i-cell containing the given dart adart.
// When we process a dart, we search in the Unique_hash_map if its
// i-attribute was already found. If yes, it means that we already
// found an i-cell with this attribute, thus this attribute is split.
// We mark (with mark) all the darts of the i-cell containing adart to
// process them exactly once.
template<typename CMap, unsigned int i>
void test_split_attribute_functor_one_dart
( CMap* amap, typename CMap::Dart_handle adart,
CGAL::Unique_hash_map<typename CMap::template Attribute_handle<i>::type,
unsigned int, typename CMap::Hash_function> &
found_attributes, int mark )
{
CGAL_assertion( amap!=NULL );
CGAL_static_assertion_msg(CMap::Helper::template
Dimension_index<i>::value>=0,
"Test_split_attribute_functor_one_dart<i> but "
"i-attributes are disabled");
typedef typename CMap::template Attribute_handle<i>::type
Attribute_handle_i;
// If the current dart has no attribute, or if it is aldready marked,
// nothing to do.
if ( amap->template attribute<i>(adart)==CMap::null_handle ||
amap->is_marked(adart, mark) )
return;
Attribute_handle_i a1 = amap->template attribute<i>(adart);
if ( found_attributes.is_defined(a1) )
{ // Here the attribute was already present in the hash_map
Attribute_handle_i a2 = amap->template
create_attribute<i>(amap->template get_attribute<i>(a1));
for ( CGAL::GMap_dart_iterator_basic_of_cell<CMap, i>
itj(*amap, adart, mark); itj.cont(); ++itj )
{
amap->template set_dart_attribute<i>(itj, a2);
amap->mark(itj, mark);
}
CGAL::internal::Call_split_functor<CMap, i>::run(amap, a1, a2);
}
else
{
// Here the attribute was not in the hash_map.
found_attributes[a1]=1;
amap->template set_dart_of_attribute<i>(a1, adart);
for ( CGAL::GMap_dart_iterator_basic_of_cell<CMap, i>
itj(*amap, adart, mark); itj.cont(); ++itj )
{
CGAL_assertion( amap->template attribute<i>(itj)==a1 );
amap->mark(itj, mark);
}
}
}
// ************************************************************************
/// Functor used for unsew to test if i-attributes are split after an
/// operation, except for j-attributes.
/// (j is the dimension of the beta modified for darts in modified_darts,
/// if j==0 modified_darts2 are the darts modified for beta_1).
template<typename CMap, unsigned int i, unsigned int j=CMap::dimension+1,
typename T=typename CMap::template Attribute_type<i>::type>
struct Test_split_attribute_functor_run
{
// modified_darts is the set of modified darts for beta_j
static void run( CMap* amap,
const std::deque<typename CMap::Dart_handle>
&modified_darts,
int mark_modified_darts=-1)
{
CGAL_static_assertion( i<=CMap::dimension );
CGAL_assertion( i!=j );
CGAL_assertion( amap!=NULL );
CGAL_static_assertion_msg(CMap::Helper::template
Dimension_index<i>::value>=0,
"Test_split_attribute_functor_run<i> but "
"i-attributes are disabled");
typedef typename CMap::template Attribute_handle<i>::type
Attribute_handle_i;
CGAL::Unique_hash_map<Attribute_handle_i, unsigned int,
typename CMap::Hash_function> found_attributes;
int mark = amap->get_new_mark(); // to mark incident cells.
typename std::deque<typename CMap::Dart_handle>::const_iterator
it=modified_darts.begin();
for ( ; it!=modified_darts.end(); ++it )
{
CGAL::internal::test_split_attribute_functor_one_dart<CMap,i>
(amap, *it, found_attributes, mark);
}
// Now we unmark all the marked darts.
amap->negate_mark(mark);
for ( it=modified_darts.begin(); it!=modified_darts.end(); ++it )
{
if ( mark_modified_darts!=-1 )
amap->unmark(*it, mark_modified_darts);
if ( !amap->is_marked(*it, mark) )
CGAL::mark_cell<CMap, i>(*amap, *it, mark);
}
CGAL_assertion( amap->is_whole_map_marked(mark) );
amap->free_mark(mark);
}
};
// Specialization for void attributes.
template<typename CMap, unsigned int i, unsigned int j>
struct Test_split_attribute_functor_run<CMap, i, j, CGAL::Void>
{
static void run( CMap*, const std::deque<typename CMap::Dart_handle>&,
int=-1)
{}
};
// Specialization for i=j.
template<typename CMap, unsigned int i, typename T>
struct Test_split_attribute_functor_run<CMap, i, i, T>
{
static void run( CMap*, const std::deque<typename CMap::Dart_handle>&,
int=-1)
{}
};
// Specialization for i=1 and j=0 (edge attributes are not modified
// when we modify beta_0).
template<typename CMap, typename T>
struct Test_split_attribute_functor_run<CMap, 1, 0, T>
{
static void run( CMap*, const std::deque<typename CMap::Dart_handle>&,
int=-1)
{}
};
// ************************************************************************
/// Functor used for unsew to test if i-attributes are split after an
/// operation, except for j-attributes.
/// We define run<i> to allows to use this functor with
/// Foreach_enabled_attributes.
template<typename CMap, unsigned int j=CMap::dimension+1>
struct Test_split_attribute_functor
{
// Test the split of i-attributes, for all modified darts given in
// modified_darts, and marked with mark_modified_darts.
// For each split attribute, create a new i-attribute, associate
// it with the new i-cell and call onsplit functors.
template <unsigned int i>
static void run( CMap* amap,
const std::deque<typename CMap::Dart_handle>
&modified_darts,
int mark_modified_darts=-1)
{
CGAL::internal::Test_split_attribute_functor_run<CMap, i, j>::
run(amap, modified_darts, mark_modified_darts);
}
};
// ************************************************************************
} // namespace internal
} // namespace CGAL
#endif // CGAL_GENERALIZED_MAP_GROUP_FUNCTORS_H

View File

@ -0,0 +1,99 @@
// Copyright (c) 2014 CNRS and LIRIS' Establishments (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 3 of the License,
// or (at your option) any later version.
//
// 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#ifndef CGAL_GENERALIZED_MAP_INTERNAL_FUNCTORS_H
#define CGAL_GENERALIZED_MAP_INTERNAL_FUNCTORS_H
/* Definition of functors used internally for generalized maps.
*
* internal::Alpha_functor<Dart, i...> to call several beta on the given dart.
* Indices are given as parameter of the run function.
*
* internal::Alpha_functor_static<Dart, i...> to call several beta on the given
* dart. Indices are given as template arguments.
*
*/
#include <CGAL/internal/Combinatorial_map_internal_functors.h>
namespace CGAL
{
// ****************************************************************************
namespace internal
{
// ****************************************************************************
// Alpha functor, used to combine several alpha.
#ifndef CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES
template<typename CMap, typename Dart_handle, typename ... Alphas>
struct Alpha_functor;
template<typename CMap, typename Dart_handle>
struct Alpha_functor<CMap, Dart_handle, int>
{
static Dart_handle run(CMap* AMap, Dart_handle ADart, int B)
{ return AMap->get_alpha(ADart, B); }
};
template<typename CMap, typename Dart_handle>
struct Alpha_functor<CMap, Dart_handle, unsigned int>
{
static Dart_handle run(CMap* AMap, Dart_handle ADart, unsigned int B)
{ return AMap->get_alpha(ADart, B); }
};
template<typename CMap, typename Dart_handle, typename ... Alphas>
struct Alpha_functor<CMap, Dart_handle, int, Alphas...>
{
static Dart_handle run(CMap* AMap, Dart_handle ADart, int B, Alphas... alphas)
{ return Alpha_functor<CMap, Dart_handle, Alphas...>::
run(AMap, AMap->get_alpha(ADart, B), alphas...); }
};
template<typename CMap, typename Dart_handle, typename ... Alphas>
struct Alpha_functor<CMap, Dart_handle, unsigned int, Alphas...>
{
static Dart_handle run(CMap* AMap, Dart_handle ADart, unsigned int B,
Alphas... alphas)
{ return Alpha_functor<CMap, Dart_handle, Alphas...>::
run(AMap, AMap->get_alpha(ADart, B), alphas...); }
};
// ****************************************************************************
template<typename CMap, typename Dart_handle, int ... Alphas>
struct Alpha_functor_static;
template<typename CMap, typename Dart_handle, int B>
struct Alpha_functor_static<CMap, Dart_handle, B>
{
static Dart_handle run(CMap* AMap, Dart_handle ADart)
{ return AMap->template get_alpha<B>(ADart); }
};
template<typename CMap, typename Dart_handle, int B, int ... Alphas>
struct Alpha_functor_static<CMap, Dart_handle, B, Alphas...>
{
static Dart_handle run(CMap* AMap, Dart_handle ADart)
{ return Alpha_functor_static<CMap, Dart_handle, Alphas...>::
run(AMap, AMap->template get_alpha<B>(ADart)); }
};
#endif //CGAL_CFG_NO_CPP0X_VARIADIC_TEMPLATES
// ****************************************************************************
} // namespace internal
} // namespace CGAL
#endif // CGAL_GENERALIZED_MAP_INTERNAL_FUNCTORS_H

View File

@ -0,0 +1,129 @@
// Copyright (c) 2014 CNRS and LIRIS' Establishments (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 3 of the License,
// or (at your option) any later version.
//
// 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#ifndef CGAL_GENERALIZED_MAP_SEWABLE_H
#define CGAL_GENERALIZED_MAP_SEWABLE_H
#include <CGAL/GMap_dart_const_iterators.h>
#include <CGAL/Unique_hash_map.h>
/* Definition of functor used to test if two darts are i-sewable
* (we use functors as there are different specializations).
* @todo Specializations ?
*/
namespace CGAL
{
namespace internal
{
// Generic case (and for the moment the only one).
template<typename CMap, unsigned int i, unsigned int dim=CMap::dimension>
struct GMap_is_sewable_functor
{
static bool run( const CMap* amap,
typename CMap::Dart_const_handle adart1,
typename CMap::Dart_const_handle adart2 )
{
CGAL_assertion( i<=CMap::dimension );
if ( !amap->template is_free<i>(adart1) ||
!amap->template is_free<i>(adart2) )
return false;
if ( adart1==adart2 )
{
if ( i==1 ) return true;
return false;
}
// hash map to build the isomorphism between the two i-cells.
CGAL::Unique_hash_map<typename CMap::Dart_const_handle,
typename CMap::Dart_const_handle,
typename CMap::Hash_function> bijection;
int m1 = amap->get_new_mark();
int m2 = amap->get_new_mark();
CGAL::GMap_dart_const_iterator_basic_of_involution<CMap,i>
I1(*amap, adart1, m1);
CGAL::GMap_dart_const_iterator_basic_of_involution<CMap,i>
I2(*amap, adart2, m2);
bool res = true;
int mbijection = amap->get_new_mark();
while ( res && I1.cont() && I2.cont() )
{
amap->mark(I1, mbijection);
bijection[I1]=I2;
CGAL_assertion( amap->template is_free<i>(I1) );
CGAL_assertion( amap->template is_free<i>(I2) );
// We can remove this constraint which is not required for
// combinatorial map definition, but which is quite "normal"
// Indeed in this case we try to i-sew an i-cell with itself (case
// of folded cells).
if ( I1==adart2 || I2==adart1 ) res=false;
for ( unsigned int j=0; res && j<=CMap::dimension; ++j )
{
if ( j+1!=i && j!=i && j!=i+1 )
{
if ( amap->is_free(I1,j) )
{
if ( !amap->is_free(I2,j) ) res=false;
}
else
{
if ( amap->is_free(I2,j) ) res=false;
else if ( amap->is_marked(amap->alpha(I1,j), mbijection) )
{
if ( bijection[amap->alpha(I1,j)]!=amap->alpha(I2,j) ) res=false;
}
}
}
}
++I1; ++I2;
}
if ( I1.cont()!=I2.cont() )
res = false;
amap->negate_mark(m1);
amap->negate_mark(m2);
I1.rewind(); I2.rewind();
while ( amap->number_of_marked_darts(mbijection)>0 )
{
amap->unmark(I1, mbijection);
++I1; ++I2;
}
CGAL_assertion( amap->is_whole_map_marked(m1) );
CGAL_assertion( amap->is_whole_map_marked(m2) );
CGAL_assertion( amap->is_whole_map_unmarked(mbijection) );
amap->free_mark(m1);
amap->free_mark(m2);
amap->free_mark(mbijection);
return res;
}
};
} //namespace internal
} //namespace CGAL
#endif // CGAL_COMBINATORIAL_MAP_SEWABLE_H
//******************************************************************************

View File

@ -0,0 +1 @@
Generalized map in d-dimension

View File

@ -0,0 +1,8 @@
Implementation of generalized maps.
A generalized map is a mathematical model allowing to represent an
object in any dimension by describing the subdivision of the object in
vertices, edges, faces, volumes, ... and the incidence relationships
on them. Generalized maps allow to describe non orientable object,
contrary to combinatorial maps. However, their main interest is their
homogeneity in any dimension which simplify the algorithms.

View File

@ -0,0 +1 @@
Guillaume Damiand

View File

@ -0,0 +1,53 @@
# cd debug; cmake .. -DCMAKE_BUILD_TYPE=Debug
# cd release; cmake .. -DCMAKE_BUILD_TYPE=Release
project( Generalized_map_test )
CMAKE_MINIMUM_REQUIRED(VERSION 2.4.5)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
if ( COMMAND cmake_policy )
cmake_policy( SET CMP0003 NEW )
endif()
####################################################################################
OPTION(BUILD_TESTS "Build tests." ON)
if (BUILD_TESTS)
ENABLE_TESTING()
INCLUDE(CTest)
if (CMAKE_COMPILER_IS_GNUCXX)
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0 -Wall -W -Wshadow -Wunused-variable -Wunused-parameter -Wunused-function -Wunused -Wno-system-headers -Wno-deprecated -Woverloaded-virtual -Wwrite-strings -fprofile-arcs -ftest-coverage -frounding-math")
endif (CMAKE_COMPILER_IS_GNUCXX)
if (CMAKE_COMPILER_IS_GNUCC)
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g -O0 -Wall -W -fprofile-arcs -ftest-coverage -frounding-math")
endif (CMAKE_COMPILER_IS_GNUCC)
endif (BUILD_TESTS)
####################################################################################
find_package(CGAL QUIET COMPONENTS Core )
if ( NOT CGAL_FOUND )
message(FATAL_ERROR "This program requires the CGAL library, and will not be compiled.")
endif ( NOT CGAL_FOUND )
include( ${CGAL_USE_FILE} )
# Try to use gcov but does not work... TODO
#set(CMAKE_CXX_FLAGS "-g -frounding-math")
#set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS})
#add_definitions(-fprofile-arcs -ftest-coverage)
#include( CGAL_CreateSingleSourceCGALProgram )
include_directories(BEFORE ../../include)
add_executable(Generalized_map_test Generalized_map_test.cpp)
#create_single_source_cgal_program( "Generalized_map_test.cpp" )
target_link_libraries(Generalized_map_test ${CGAL_LIBRARIES}
${CGAL_3RD_PARTY_LIBRARIES} )
if (BUILD_TESTS)
ADD_TEST(Generalized_map_test "./Generalized_map_test")
endif (BUILD_TESTS)

View File

@ -0,0 +1,187 @@
// Copyright (c) 2014 CNRS and LIRIS' Establishments (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 3 of the License,
// or (at your option) any later version.
//
// 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#ifndef CGAL_GENERALIZED_MAP_2_TEST
#define CGAL_GENERALIZED_MAP_2_TEST 1
#include <CGAL/Generalized_map_constructors.h>
#include <CGAL/Generalized_map_operations.h>
#include <CGAL/IO/Polyhedron_iostream.h>
#include <iostream>
#include <fstream>
using namespace std;
// #define GMAP_TRACE_TEST_BEGIN 1
void trace_test_begin()
{
#ifdef GMAP_TRACE_TEST_BEGIN
static unsigned int nbtest = 0;
std::cout<<"Test "<<nbtest++<<" ..."<<std::flush;
#endif
}
void trace_test_end()
{
#ifdef GMAP_TRACE_TEST_BEGIN
std::cout<<"Ok."<<std::endl;
#endif
}
void trace_display_msg(const char*
#ifdef GMAP_TRACE_TEST_BEGIN
msg
#endif
)
{
#ifdef GMAP_TRACE_TEST_BEGIN
std::cout<<"***************** "<<msg<<"***************** "<<std::endl;
#endif
}
template<typename GMAP>
bool check_number_of_cells_2(GMAP& gmap, unsigned int nbv, unsigned int nbe,
unsigned int nbf, unsigned int nbcc)
{
if ( !gmap.is_valid() )
{
std::cout<<"ERROR: the gmap is not valid."<<std::endl;
assert(false);
return false;
}
std::vector<unsigned int> nbc;
nbc=gmap.count_all_cells();
if (nbv!=nbc[0] || nbe!=nbc[1] || nbf!=nbc[2] || nbcc!=nbc[3])
{
std::cout<<"ERROR: the number of cells is not correct. We must have "
<<" ("<<nbv<<", "<<nbe<<", "<<nbf<<", "<<nbcc<<") and we have"
<<" ("<<nbc[0]<<", "<<nbc[1]<<", "<<nbc[2]<<", "<<nbc[3]<<")."
<<std::endl;
assert(false);
return false;
}
trace_test_end();
return true;
}
template<class Gmap>
bool test_GMAP_2()
{
Gmap gmap;
typedef typename Gmap::Dart_handle Dart_handle;
// Construction operations
trace_test_begin();
Dart_handle dh1=CGAL::make_edge(gmap);
Dart_handle dh2=CGAL::make_edge(gmap);
Dart_handle dh3=CGAL::make_edge(gmap);
if ( !check_number_of_cells_2(gmap, 6, 3, 3, 3) )
return false;
trace_test_begin();
gmap.template sew<1>(dh1,dh2);
gmap.template sew<1>(gmap.alpha(dh2, 0),dh3);
if ( !check_number_of_cells_2(gmap, 4, 3, 1, 1) )
return false;
trace_test_begin();
Dart_handle dh5=CGAL::make_combinatorial_polygon(gmap, 3);
Dart_handle dh6=CGAL::make_combinatorial_polygon(gmap, 3);
if ( !check_number_of_cells_2(gmap, 10, 9, 3, 3) )
return false;
trace_test_begin();
gmap.template sew<2>(dh5,dh6);
if ( !check_number_of_cells_2(gmap, 8, 8, 3, 2) )
return false;
trace_test_begin();
dh5=gmap.template alpha<1>(dh5);
dh6=gmap.template alpha<1>(dh6);
CGAL::contract_cell<Gmap, 1>(gmap, gmap.template alpha<1>(dh5));
if ( !check_number_of_cells_2(gmap, 8, 7, 3, 3) )
return false;
trace_test_begin();
CGAL::contract_cell<Gmap, 2>(gmap, dh6);
if ( !check_number_of_cells_2(gmap, 6, 5, 2, 2) )
return false;
trace_test_begin();
CGAL::contract_cell<Gmap, 1>(gmap, gmap.template alpha<1>(dh5));
if ( !check_number_of_cells_2(gmap, 5, 4, 2, 2) )
return false;
trace_test_begin();
CGAL::contract_cell<Gmap, 1>(gmap, dh5);
if ( !check_number_of_cells_2(gmap, 4, 3, 1, 1) )
return false;
trace_test_begin();
CGAL::contract_cell<Gmap, 1>(gmap, dh2);
if ( !check_number_of_cells_2(gmap, 3, 2, 1, 1) )
return false;
trace_test_begin();
CGAL::contract_cell<Gmap, 1>(gmap, dh1);
if ( !check_number_of_cells_2(gmap, 2, 1, 1, 1) )
return false;
trace_test_begin();
CGAL::contract_cell<Gmap, 1>(gmap, dh3);
if ( !check_number_of_cells_2(gmap, 0, 0, 0, 0) )
return false;
trace_test_begin();
Dart_handle dh7=CGAL::make_combinatorial_hexahedron(gmap); // f1
Dart_handle dh8=gmap.template alpha<2,1,0,1,2>(dh7); // f2 opposite to f1
Dart_handle dh9=gmap.template alpha<2>(dh7); // face incident to f1 and d2
CGAL::remove_cell<Gmap,2>(gmap, dh7);
if ( !check_number_of_cells_2(gmap, 8, 12, 5, 1) )
return false;
trace_test_begin();
CGAL::remove_cell<Gmap,2>(gmap, dh8);
if ( !check_number_of_cells_2(gmap, 8, 12, 4, 1) )
return false;
trace_test_begin();
gmap.template close<2>();
if ( !check_number_of_cells_2(gmap, 8, 12, 6, 1) )
return false;
if ( !CGAL::is_volume_combinatorial_hexahedron(gmap, dh9) )
{
std::cout<<"Error: the closed volume is not a combinatorial hexahedron.\n";
assert(false);
return false;
}
return true;
}
#endif // CGAL_GENERALIZED_MAP_2_TEST

View File

@ -0,0 +1,165 @@
// Copyright (c) 2011 CNRS and LIRIS' Establishments (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 3 of the License,
// or (at your option) any later version.
//
// 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#ifndef CGAL_GMAP_3_TEST_H
#define CGAL_GMAP_3_TEST_H
#include "Generalized_map_2_test.h"
#include <iostream>
#include <fstream>
using namespace std;
template<typename GMAP>
bool check_number_of_cells_3(GMAP& gmap, unsigned int nbv, unsigned int nbe,
unsigned int nbf, unsigned int nbvol,
unsigned int nbcc)
{
if ( !gmap.is_valid() )
{
std::cout<<"ERROR: the gmap is not valid."<<std::endl;
assert(false);
return false;
}
std::vector<unsigned int> nbc;
nbc=gmap.count_all_cells();
if (nbv!=nbc[0] || nbe!=nbc[1] || nbf!=nbc[2] || nbvol!=nbc[3] ||
nbcc!=nbc[4])
{
std::cout<<"ERROR: the number of cells is not correct. We must have "
<<" ("<<nbv<<", "<<nbe<<", "<<nbf<<", "<<nbvol<<", "<<nbcc
<<") and we have"<<" ("<<nbc[0]<<", "<<nbc[1]<<", "<<nbc[2]<<", "
<<nbc[3]<<", "<<nbc[4]<<")."
<<std::endl;
assert(false);
return false;
}
trace_test_end();
return true;
}
template<typename GMAP>
bool test_GMAP_3()
{
GMAP gmap;
typedef typename GMAP::Dart_handle Dart_handle;
// Construction operations
trace_test_begin();
Dart_handle dh1=CGAL::make_edge(gmap);
Dart_handle dh2=CGAL::make_edge(gmap);
Dart_handle dh3=CGAL::make_edge(gmap);
if ( !check_number_of_cells_3(gmap, 6, 3, 3, 3, 3) )
return false;
trace_test_begin();
gmap.template sew<1>(dh1,dh2);
gmap.template sew<1>(gmap.alpha(dh2,0),dh3);
if ( !check_number_of_cells_3(gmap, 4, 3, 1, 1, 1) )
return false;
trace_test_begin();
Dart_handle dh5=CGAL::make_combinatorial_polygon(gmap, 3);
Dart_handle dh6=CGAL::make_combinatorial_polygon(gmap, 3);
if ( !check_number_of_cells_3(gmap, 10, 9, 3, 3, 3) )
return false;
trace_test_begin();
gmap.template sew<2>(dh5,dh6);
if ( !check_number_of_cells_3(gmap, 8, 8, 3, 2, 2) )
return false;
trace_test_begin();
gmap.clear();
Dart_handle dh7=CGAL::make_combinatorial_hexahedron(gmap); // f1
Dart_handle dh8=gmap.template alpha<2,1,0,1,2>(dh7); // f2 opposite to f1
Dart_handle dh9=gmap.template alpha<2>(dh7); // face incident to f1 and d2
CGAL::remove_cell<GMAP,2>(gmap, dh7);
if ( !check_number_of_cells_3(gmap, 8, 12, 5, 1, 1) )
return false;
trace_test_begin();
CGAL::remove_cell<GMAP,2>(gmap, dh8);
if ( !check_number_of_cells_3(gmap, 8, 12, 4, 1, 1) )
return false;
trace_test_begin();
Dart_handle dh10=CGAL::make_combinatorial_hexahedron(gmap);
gmap.template sew<3>(dh9,dh10);
if ( !check_number_of_cells_3(gmap, 12, 20, 9, 2, 1) )
return false;
trace_test_begin();
GMAP gmap2(gmap);
if ( !check_number_of_cells_3(gmap2, 12, 20, 9, 2, 1) )
return false;
if ( !gmap.is_isomorphic_to(gmap2) )
{
std::cout<<"Error: gmap and gmap2 are not isomorphic (after copy).\n";
assert(false);
return false;
}
trace_test_begin();
gmap.template close<2>();
if ( !check_number_of_cells_3(gmap, 12, 20, 11, 2, 1) )
return false;
if ( !CGAL::is_volume_combinatorial_hexahedron(gmap, dh9) )
{
std::cout<<"Error: the closed volume is not a combinatorial hexahedron.\n";
assert(false);
return false;
}
trace_test_begin();
gmap.template close<3>();
if ( !check_number_of_cells_3(gmap, 12, 20, 11, 3, 1) )
return false;
trace_test_begin();
CGAL::remove_cell<GMAP,3>(gmap, gmap.alpha(dh9, 2, 3));
if ( !check_number_of_cells_3(gmap, 12, 20, 11, 2, 1) )
return false;
trace_test_begin();
CGAL::remove_cell<GMAP,2>(gmap, gmap.alpha(dh9, 2));
CGAL::remove_cell<GMAP,2>(gmap, gmap.alpha(dh9, 1, 0, 1, 2));
if ( !check_number_of_cells_3(gmap, 12, 20, 9, 2, 1) )
return false;
if ( !gmap.is_isomorphic_to(gmap2) )
{
std::cout<<"Error: gmap and gmap2 are not isomorphic (after close and removals).\n";
assert(false);
return false;
}
return true;
}
#endif // CGAL_GMAP_3_TEST_H

View File

@ -0,0 +1,450 @@
// Copyright (c) 2014 CNRS and LIRIS' Establishments (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 3 of the License,
// or (at your option) any later version.
//
// 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$
// $Id$
//
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
//
#ifndef CGAL_GMAP_4_TEST_H
#define CGAL_GMAP_4_TEST_H
#include <CGAL/Generalized_map_operations.h>
#include "Generalized_map_2_test.h"
template<typename GMAP>
bool check_number_of_cells_4(GMAP& gmap, unsigned int nbv, unsigned int nbe,
unsigned int nbf, unsigned int nbvol,
unsigned int nbhvol, unsigned int nbcc)
{
if ( !gmap.is_valid() )
{
std::cout<<"ERROR: the gmap is not valid."<<std::endl;
assert(false);
return false;
}
std::vector<unsigned int> nbc;
nbc=gmap.count_all_cells();
if (nbv!=nbc[0] || nbe!=nbc[1] || nbf!=nbc[2] || nbvol!=nbc[3] ||
nbhvol!=nbc[4] || nbcc!=nbc[5])
{
std::cout<<"ERROR: the number of cells is not correct. We must have "
<<" ("<<nbv<<", "<<nbe<<", "<<nbf<<", "<<nbvol<<", "<<nbhvol
<<", "<<nbcc<<") and we have"<<" ("<<nbc[0]<<", "<<nbc[1]<<", "
<<nbc[2]<<", "<<nbc[3]<<", "<<nbc[4]<<", "<<nbc[5]<<")."
<<std::endl;
assert(false);
return false;
}
trace_test_end();
return true;
}
template<typename GMAP>
bool test_GMAP_4()
{
GMAP gmap;
typedef typename GMAP::Dart_handle Dart_handle;
// Construction operations
trace_test_begin();
Dart_handle dh1=CGAL::make_edge(gmap);
Dart_handle dh2=CGAL::make_edge(gmap);
Dart_handle dh3=CGAL::make_edge(gmap);
if ( !check_number_of_cells_4(gmap, 6, 3, 3, 3, 3, 3) )
return false;
trace_test_begin();
gmap.template sew<1>(dh1,dh2);
gmap.template sew<1>(gmap.alpha(dh2,0),dh3);
if ( !check_number_of_cells_4(gmap, 4, 3, 1, 1, 1, 1) )
return false;
trace_test_begin();
Dart_handle dh5=CGAL::make_combinatorial_polygon(gmap, 3);
Dart_handle dh6=CGAL::make_combinatorial_polygon(gmap, 3);
if ( !check_number_of_cells_4(gmap, 10, 9, 3, 3, 3, 3) )
return false;
trace_test_begin();
gmap.template sew<2>(dh5,dh6);
if ( !check_number_of_cells_4(gmap, 8, 8, 3, 2, 2, 2) )
return false;
trace_test_begin();
gmap.clear();
Dart_handle dh7=CGAL::make_combinatorial_hexahedron(gmap); // f1
Dart_handle dh8=gmap.template alpha<2,1,0,1,2>(dh7); // f2 opposite to f1
Dart_handle dh9=gmap.template alpha<2>(dh7); // face incident to f1 and d2
CGAL::remove_cell<GMAP,2>(gmap, dh7);
if ( !check_number_of_cells_4(gmap, 8, 12, 5, 1, 1, 1) )
return false;
trace_test_begin();
CGAL::remove_cell<GMAP,2>(gmap, dh8);
if ( !check_number_of_cells_4(gmap, 8, 12, 4, 1, 1, 1) )
return false;
trace_test_begin();
Dart_handle dh10=CGAL::make_combinatorial_hexahedron(gmap);
gmap.template sew<3>(dh9,dh10);
if ( !check_number_of_cells_4(gmap, 12, 20, 9, 2, 1, 1) )
return false;
trace_test_begin();
Dart_handle dh11=CGAL::make_combinatorial_hexahedron(gmap);
gmap.template sew<4>(dh10,dh11);
if ( !check_number_of_cells_4(gmap, 12, 20, 9, 2, 2, 1) )
return false;
trace_test_begin();
GMAP gmap2(gmap);
if ( !check_number_of_cells_4(gmap2, 12, 20, 9, 2, 2, 1) )
return false;
if ( !gmap.is_isomorphic_to(gmap2) )
{
std::cout<<"Error: gmap and gmap2 are not isomorphic (after copy).\n";
assert(false);
return false;
}
trace_test_begin();
gmap.template close<2>();
if ( !check_number_of_cells_4(gmap, 12, 20, 11, 2, 2, 1) )
return false;
if ( !CGAL::is_volume_combinatorial_hexahedron(gmap, dh9) )
{
std::cout<<"Error: the closed volume is not a combinatorial hexahedron.\n";
assert(false);
return false;
}
trace_test_begin();
gmap.template close<3>();
if ( !check_number_of_cells_4(gmap, 12, 20, 11, 4, 2, 1) )
return false;
trace_test_begin();
gmap.template close<4>();
if ( !check_number_of_cells_4(gmap, 12, 20, 11, 4, 3, 1) )
return false;
trace_test_begin();
CGAL::remove_cell<GMAP,4>(gmap, gmap.alpha(dh9, 2, 3, 4));
if ( !check_number_of_cells_4(gmap, 12, 20, 11, 4, 2, 1) )
return false;
trace_test_begin();
CGAL::remove_cell<GMAP,3>(gmap, gmap.alpha(dh9, 2, 3));
CGAL::remove_cell<GMAP,3>(gmap, gmap.alpha(dh10, 2, 4, 3));
if ( !check_number_of_cells_4(gmap, 12, 20, 11, 2, 2, 1) )
return false;
trace_test_begin();
CGAL::remove_cell<GMAP,2>(gmap, gmap.alpha(dh9, 2));
CGAL::remove_cell<GMAP,2>(gmap, gmap.alpha(dh9, 1, 0, 1, 2));
if ( !check_number_of_cells_4(gmap, 12, 20, 9, 2, 2, 1) )
return false;
if ( !gmap.is_isomorphic_to(gmap2) )
{
std::cout<<"Error: gmap and gmap2 are not isomorphic (after close and removals).\n";
assert(false);
return false;
}
/* trace_test_begin();
Dart_handle dh7=gmap.template insert_barycenter_in_cell<1>(dh1);
if ( !check_number_of_cells_4(gmap, 9, 9, 6, 2, 2, 2) )
return false;
trace_test_begin();
Dart_handle dh8=gmap.template insert_barycenter_in_cell<2>(dh5);
if ( !check_number_of_cells_4(gmap, 10, 12, 8, 2, 2, 2) )
return false;
trace_test_begin();
Dart_handle dh9=gmap.template insert_point_in_cell<1>(dh2,apoint<GMAP>(1,0,3,0));
if ( !check_number_of_cells_4(gmap, 11, 13, 8, 2, 2, 2) )
return false;
trace_test_begin();
Dart_handle dh10=gmap.template insert_point_in_cell<2>(dh6,apoint<GMAP>(6,5,3,0));
if ( !check_number_of_cells_4(gmap, 12, 16, 10, 2, 2, 2) )
return false;
trace_test_begin();
Dart_handle dh11=gmap.insert_dangling_cell_1_in_cell_2(dh8,apoint<GMAP>(6,5.2,3,0));
if ( !check_number_of_cells_4(gmap, 13, 17, 10, 2, 2, 2) )
return false;
trace_test_begin();
Dart_handle dh12 = gmap.make_tetrahedron(apoint<GMAP>(-1, 0, 0,0),apoint<GMAP>(0, 2, 0,0),
apoint<GMAP>(1, 0, 0,0),apoint<GMAP>(1, 1, 2,0));
Dart_handle dh13 = gmap.make_tetrahedron(apoint<GMAP>(0, 2, -1,0),apoint<GMAP>(-1, 0, -1,0),
apoint<GMAP>(1, 0, -1,0),apoint<GMAP>(1, 1, -3,0));
if ( !check_number_of_cells_4(gmap, 21, 29, 18, 4, 4, 4) )
return false;
trace_test_begin();
gmap.template sew<3>(dh12, dh13);
if ( !check_number_of_cells_4(gmap, 18, 26, 17, 4, 3, 3) )
return false;
trace_test_begin();
Dart_handle dh14=gmap.template insert_barycenter_in_cell<2>(dh12);
if ( !check_number_of_cells_4(gmap, 19, 29, 19, 4, 3, 3) )
return false;
trace_test_begin();
Dart_handle dh15=gmap.template insert_barycenter_in_cell<1>(dh14);
if ( !check_number_of_cells_4(gmap, 20, 30, 19, 4, 3, 3) )
return false;
trace_test_begin();
gmap.template sew<4>(dh12, dh13);
if ( !check_number_of_cells_4(gmap, 19, 27, 16, 3, 3, 3) )
return false;
trace_test_begin();
Dart_handle dh16=gmap.template insert_barycenter_in_cell<1>(dh15);
if ( !check_number_of_cells_4(gmap, 20, 28, 16, 3, 3, 3) )
return false;
trace_test_begin();
Dart_handle dh17=gmap.template insert_barycenter_in_cell<2>(dh16);
if ( !check_number_of_cells_4(gmap, 21, 33, 20, 3, 3, 3) )
return false;
// Removal operations
trace_test_begin();
std::stack<Dart_handle> toremove;
for ( typename GMAP::template Dart_of_cell_range<0,2>::iterator
it=gmap.template darts_of_cell<0,2>(dh17).begin(),
itend=gmap.template darts_of_cell<0,2>(dh17).end();
it!=itend; ++it )
toremove.push( it );
while ( !toremove.empty() )
{
CGAL::remove_cell<GMAP,1>(gmap, toremove.top());
toremove.pop();
}
if ( !check_number_of_cells_4(gmap, 20, 28, 16, 3, 3, 3) )
return false;
trace_test_begin();
CGAL::remove_cell<GMAP,0>(gmap, dh16);
if ( !check_number_of_cells_4(gmap, 19, 27, 16, 3, 3, 3) )
return false;
trace_test_begin();
gmap.template unsew<4>(dh12);
if ( !check_number_of_cells_4(gmap, 20, 30, 19, 4, 3, 3) )
return false;
trace_test_begin();
CGAL::remove_cell<GMAP,0>(gmap, dh15);
if ( !check_number_of_cells_4(gmap, 19, 29, 19, 4, 3, 3) )
return false;
trace_test_begin();
CGAL::remove_cell<GMAP,1>(gmap, gmap.beta(dh14,2,1));
CGAL::remove_cell<GMAP,1>(gmap, gmap.beta(dh14,0));
CGAL::remove_cell<GMAP,1>(gmap, dh14);
if ( !check_number_of_cells_4(gmap, 18, 26, 17, 4, 3, 3) )
return false;
trace_test_begin();
gmap.template unsew<3>(dh12);
if ( !check_number_of_cells_4(gmap, 21, 29, 18, 4, 4, 4) )
return false;
trace_test_begin();
CGAL::remove_cell<GMAP,3>(gmap, dh13);
CGAL::remove_cell<GMAP,3>(gmap, dh12);
if ( !check_number_of_cells_4(gmap, 13, 17, 10, 2, 2, 2) )
return false;
trace_test_begin();
CGAL::remove_cell<GMAP,1>(gmap, dh11);
if ( !check_number_of_cells_4(gmap, 12, 16, 10, 2, 2, 2) )
return false;
trace_test_begin();
for ( typename GMAP::template Dart_of_cell_range<0,2>::iterator
it=gmap.template darts_of_cell<0,2>(dh10).begin(),
itend=gmap.template darts_of_cell<0,2>(dh10).end();
it!=itend; ++it )
toremove.push( it );
while ( !toremove.empty() )
{
CGAL::remove_cell<GMAP,1>(gmap, toremove.top());
toremove.pop();
}
if ( !check_number_of_cells_4(gmap, 11, 13, 8, 2, 2, 2) )
return false;
trace_test_begin();
CGAL::remove_cell<GMAP,0>(gmap, dh9);
if ( !check_number_of_cells_4(gmap, 10, 12, 8, 2, 2, 2) )
return false;
trace_test_begin();
for ( typename GMAP::template Dart_of_cell_range<0,2>::iterator
it=gmap.template darts_of_cell<0,2>(dh8).begin(),
itend=gmap.template darts_of_cell<0,2>(dh8).end();
it!=itend; ++it )
toremove.push( it );
while ( !toremove.empty() )
{
CGAL::remove_cell<GMAP,1>(gmap, toremove.top());
toremove.pop();
}
if ( !check_number_of_cells_4(gmap, 9, 9, 6, 2, 2, 2) )
return false;
trace_test_begin();
CGAL::remove_cell<GMAP,0>(gmap, dh7);
if ( !check_number_of_cells_4(gmap, 8, 8, 6, 2, 2, 2) )
return false;
trace_test_begin();
gmap.template unsew<2>(dh5);
if ( !check_number_of_cells_4(gmap, 10, 9, 6, 3, 3, 3) )
return false;
trace_test_begin();
CGAL::remove_cell<GMAP,2>(gmap, dh6);
CGAL::remove_cell<GMAP,2>(gmap, dh5);
if ( !check_number_of_cells_4(gmap, 4, 3, 4, 1, 1, 1) )
return false;
trace_test_begin();
gmap.template unsew<1>(dh2);
if ( !check_number_of_cells_4(gmap, 5, 3, 5, 2, 2, 2) )
return false;
trace_test_begin();
gmap.template unsew<0>(dh2);
if ( !check_number_of_cells_4(gmap, 6, 3, 6, 3, 3, 3) )
return false;
trace_test_begin();
CGAL::remove_cell<GMAP,1>(gmap, dh1);
CGAL::remove_cell<GMAP,1>(gmap, dh2);
CGAL::remove_cell<GMAP,1>(gmap, dh3);
if ( !check_number_of_cells_4(gmap, 0, 0, 0, 0, 0, 0) )
return false;
trace_test_begin();
dh1 = gmap.make_tetrahedron(apoint<GMAP>(-1, 0, 0,0),apoint<GMAP>(0, 2, 0,0),
apoint<GMAP>(1, 0, 0,0),apoint<GMAP>(1, 1, 2,0));
dh2 = gmap.make_tetrahedron(apoint<GMAP>(0, 2, -1,0),apoint<GMAP>(-1, 0, -1,0),
apoint<GMAP>(1, 0, -1,0),apoint<GMAP>(1, 1, -3,0));
if ( !gmap.template is_sewable<4>(dh1, dh2) )
{
std::cout<<"ERROR: the two 3-cells are not sewable."<<std::endl;
assert(false);
return false;
}
trace_test_end();
trace_test_begin();
dh3 = gmap.beta(dh1,2);
dh5 = gmap.template beta<1, 2>(dh1);
gmap.template unsew<2>(dh3);
gmap.template unsew<2>(dh5);
gmap.template sew<2>(dh1, dh5);
gmap.template sew<2>(gmap.beta(dh1,1), dh3);
if ( gmap.template is_sewable<4>(dh1, dh2) )
{
std::cout<<"ERROR: the two 3-cells are sewable."<<std::endl;
assert(false);
return false;
}
trace_test_end();
trace_test_begin();
gmap.clear();
dh1 = gmap.make_tetrahedron(apoint<GMAP>(-1, 0, 0,0),apoint<GMAP>(0, 2, 0,0),
apoint<GMAP>(1, 0, 0,0),apoint<GMAP>(1, 1, 2,0));
dh2 = gmap.make_tetrahedron(apoint<GMAP>(0, 2, -1,0),apoint<GMAP>(-1, 0, -1,0),
apoint<GMAP>(1, 0, -1,0),apoint<GMAP>(1, 1, -3,0));
dh3 = gmap.make_tetrahedron(apoint<GMAP>(0, 2, -4,0),apoint<GMAP>(-1, 0, -4,0),
apoint<GMAP>(1, 0, -4,0),apoint<GMAP>(1, 1, -5,0));
gmap.template sew<3>(dh1, dh2);
gmap.template sew<4>(dh1, dh3);
GMAP gmap2(gmap);
if ( !gmap.is_valid() ) { assert(false); return false; }
if ( !gmap2.is_isomorphic_to(gmap) )
{ assert(false); return false; }
trace_test_end();
trace_test_begin();
gmap.reverse_orientation();
if ( !gmap.is_valid() ) { assert(false); return false; }
if ( gmap2.is_isomorphic_to(gmap) )
{ assert(false); return false; }
if ( !gmap2.is_isomorphic_to(gmap, false) )
{ assert(false); return false; }
trace_test_end();
trace_test_begin();
gmap.reverse_orientation();
if ( !gmap.is_valid() ) { assert(false); return false; }
if ( !gmap2.is_isomorphic_to(gmap, false) )
{ assert(false); return false; }
if ( !gmap2.is_isomorphic_to(gmap) )
{ assert(false); return false; }
trace_test_end();
trace_test_begin();
gmap.reverse_orientation_connected_component(dh1);
if ( !gmap.is_valid() ) { assert(false); return false; }
if ( gmap2.is_isomorphic_to(gmap) )
{ assert(false); return false; }
if ( !gmap2.is_isomorphic_to(gmap, false) )
{ assert(false); return false; }
trace_test_end();
trace_test_begin();
gmap.reverse_orientation_connected_component(dh1);
if ( !gmap.is_valid() ) { assert(false); return false; }
if ( !gmap2.is_isomorphic_to(gmap) )
{ assert(false); return false; }
trace_test_end();
// import_from_polyhedron<GMAP>(gmap,ap);
gmap.clear();
// import_from_plane_graph<GMAP>(gmap,ais);
*/
gmap.clear();
return true;
}
#endif // CGAL_GMAP_4_TEST_H

View File

@ -0,0 +1,185 @@
#include <CGAL/Generalized_map.h>
#include <CGAL/Cell_attribute.h>
#include "Generalized_map_2_test.h"
#include "Generalized_map_3_test.h"
#include "Generalized_map_4_test.h"
struct Sum_functor
{
template<class Cell_attribute>
void operator()(Cell_attribute& ca1,Cell_attribute& ca2)
{ ca1.info()=ca1.info()+ca2.info(); }
};
struct Divide_by_two_functor
{
template<class Cell_attribute>
void operator()(Cell_attribute& ca1,Cell_attribute& ca2)
{
ca1.info()=(ca1.info()/2);
ca2.info()=(ca1.info());
}
};
struct Myitems_2
{
template <class GMAP>
struct Dart_wrapper
{
typedef CGAL::GMap_dart<2, GMAP> Dart;
typedef CGAL::Cell_attribute<GMAP,int,CGAL::Tag_true,Sum_functor,
Divide_by_two_functor> myattrib;
typedef CGAL::cpp11::tuple<myattrib, myattrib, myattrib>
Attributes;
};
};
struct Myitems_2c
{
template <class GMAP>
struct Dart_wrapper
{
typedef CGAL::GMap_dart<2, GMAP> Dart;
typedef CGAL::Cell_attribute<GMAP,int,CGAL::Tag_false,Sum_functor,
Divide_by_two_functor> myattrib;
typedef CGAL::cpp11::tuple<myattrib, myattrib, myattrib>
Attributes;
};
};
struct Myitems_3
{
template <class GMAP>
struct Dart_wrapper
{
typedef CGAL::GMap_dart<3, GMAP> Dart;
typedef CGAL::Cell_attribute<GMAP,int,CGAL::Tag_true,Sum_functor,
Divide_by_two_functor> myattrib;
typedef CGAL::cpp11::tuple<myattrib, myattrib, myattrib, myattrib>
Attributes;
};
};
struct Myitems_3c
{
template <class GMAP>
struct Dart_wrapper
{
typedef CGAL::GMap_dart<3, GMAP> Dart;
typedef CGAL::Cell_attribute<GMAP,int,CGAL::Tag_false,Sum_functor,
Divide_by_two_functor> myattrib;
typedef CGAL::cpp11::tuple<myattrib, myattrib, myattrib, myattrib>
Attributes;
};
};
struct Myitems_4
{
template <class GMAP>
struct Dart_wrapper
{
typedef CGAL::GMap_dart<4, GMAP> Dart;
typedef CGAL::Cell_attribute<GMAP,int,CGAL::Tag_true,Sum_functor,
Divide_by_two_functor> myattrib;
typedef CGAL::cpp11::tuple<myattrib, myattrib, myattrib, myattrib,myattrib>
Attributes;
};
};
struct Myitems_4c
{
template <class GMAP>
struct Dart_wrapper
{
typedef CGAL::GMap_dart<4, GMAP> Dart;
typedef CGAL::Cell_attribute<GMAP,int,CGAL::Tag_false,Sum_functor,
Divide_by_two_functor> myattrib;
typedef CGAL::cpp11::tuple<myattrib, myattrib, myattrib, myattrib,myattrib>
Attributes;
};
};
int main()
{
std::cout<<"Generalized_map start test (v1)."<<std::flush;
trace_display_msg("\ntest_GMAP_2<GMAP2>");
typedef CGAL::Generalized_map<2> GMAP2;
if ( !test_GMAP_2<GMAP2>() )
{
std::cout<<" Error during Test_GMAP_2<GMAP2>."<<std::endl;
return EXIT_FAILURE;
}
trace_display_msg("test_GMAP_3<GMAP3>");
typedef CGAL::Generalized_map<3> GMAP3;
if ( !test_GMAP_3<GMAP3>() )
{
std::cout<<" Error during Test_GMAP_3<GMAP3>."<<std::endl;
return EXIT_FAILURE;
}
trace_display_msg("test_GMAP_4<GMAP4>");
typedef CGAL::Generalized_map<4> GMAP4;
if ( !test_GMAP_4<GMAP4>() )
{
std::cout<<" Error during Test_GMAP_4<GMAP4>."<<std::endl;
return EXIT_FAILURE;
}
trace_display_msg("test_GMAP_2<GMAP2b>");
typedef CGAL::Generalized_map<2,Myitems_2> GMAP2b;
if ( !test_GMAP_2<GMAP2b>() )
{
std::cout<<" Error during Test_GMAP_2<GMAP2b>."<<std::endl;
return EXIT_FAILURE;
}
trace_display_msg("test_GMAP_2<GMAP2c>");
typedef CGAL::Generalized_map<2,Myitems_2c> GMAP2c;
if ( !test_GMAP_2<GMAP2c>() )
{
std::cout<<" Error during Test_GMAP_2<GMAP2c>."<<std::endl;
return EXIT_FAILURE;
}
trace_display_msg("test_GMAP_3<GMAP3b>");
typedef CGAL::Generalized_map<3,Myitems_3> GMAP3b;
if ( !test_GMAP_3<GMAP3b>() )
{
std::cout<<" Error during Test_GMAP_3<GMAP3b>."<<std::endl;
return EXIT_FAILURE;
}
trace_display_msg("test_GMAP_3<GMAP3c>");
typedef CGAL::Generalized_map<3,Myitems_3c> GMAP3c;
if ( !test_GMAP_3<GMAP3c>() )
{
std::cout<<" Error during Test_GMAP_3<GMAP3c>."<<std::endl;
return EXIT_FAILURE;
}
trace_display_msg("test_GMAP_4<GMAP4b>");
typedef CGAL::Generalized_map<4,Myitems_4> GMAP4b;
if ( !test_GMAP_4<GMAP4b>() )
{
std::cout<<" Error during Test_GMAP_4<GMAP4b>."<<std::endl;
return EXIT_FAILURE;
}
trace_display_msg("test_GMAP_4<GMAP4c>");
typedef CGAL::Generalized_map<4,Myitems_4c> GMAP4c;
if ( !test_GMAP_4<GMAP4c>() )
{
std::cout<<" Error during Test_GMAP_4<GMAP4c>."<<std::endl;
return EXIT_FAILURE;
}
std::cout<<" Success."<<std::endl;
return EXIT_SUCCESS;
}

View File

@ -0,0 +1,317 @@
OFF
154 161 313
-0.000357203 -0.235365 -0.160125
-0.000357203 -0.201317 -0.488359
-0.000357203 -0.292821 0.0217439
0.190729 -0.13758 0.378379
0.13019 -0.267236 0.298845
0.190729 0.0100846 0.378379
0.0215368 0.217461 -0.51172
0.0299628 0.207248 -0.0999594
0.0292682 0.222545 -0.275104
0.0768803 0.121009 -0.13791
0.0359848 0.17055 -0.040928
0.0299468 -0.152925 -0.34216
0.025316 0.0079986 -0.671613
0.112137 0.0486489 -0.334468
0.17708 0.0141305 -0.001149
0.11094 0.149864 0.298845
0.0221919 -0.110187 -0.590456
0.0936803 -0.22453 0.026899
0.113404 -0.0498528 -0.316654
0.0652844 0.112329 -0.345801
0.17708 -0.120885 0.017739
0.0936803 0.144433 -0.0331753
-0.000357203 -0.335018 0.298845
-0.000357203 0.158995 -0.742002
-0.000357203 0.00799863 -0.742002
-0.000357203 0.231668 -0.508839
-0.000357203 -0.150077 -0.732558
-0.000357203 0.183546 0.298845
-0.000357203 0.232012 -0.275104
0.190729 0.0489168 0.495135
0.11094 0.149864 0.495135
0.13019 -0.267236 0.495135
0.190729 -0.0987481 0.495135
0.165251 0.0336246 0.567519
0.0961008 0.121112 0.567519
-0.000357203 0.150303 0.567519
-0.000357203 -0.299119 0.567519
0.112784 -0.240374 0.567519
0.165251 -0.0943517 0.567519
0.158169 0.0203713 0.567519
0.0832397 0.0961934 0.567519
-0.000357203 0.121493 0.567519
-0.000357203 -0.268007 0.567519
0.0976983 -0.217095 0.567519
0.158169 -0.0905415 0.567519
0.158169 0.0203713 0.484629
0.0832397 0.0961934 0.484629
-0.000357203 0.121493 0.484629
0.0976983 -0.217095 0.484629
0.158169 -0.0905415 0.484629
0.232021 -0.0969884 0.147736
0.222564 -0.0120031 0.135774
0.241484 -0.0124758 0.32577
0.251828 -0.105423 0.32577
0.221675 -0.0537317 -0.14475
0.547234 0.011391 0.135774
0.566079 0.0115894 0.32577
0.573698 -0.0568671 0.32577
0.545139 -0.0195028 -0.0723815
0.5542 -0.0512014 0.147736
0.873235 0.0322361 0.18891
0.883911 0.0323485 0.29654
0.888226 -0.00643099 0.29654
0.872049 0.0147353 0.0957062
0.877181 -0.00322145 0.195687
0.956323 0.0235341 0.192298
0.963222 0.0286616 0.264585
0.143323 0.0162689 -0.433251
0.0684487 0.00718598 -0.642478
0.142247 0.0417387 -0.448393
0.379652 0.0694599 -0.566806
0.37455 0.0944136 -0.566806
0.405166 0.0746761 -0.587722
0.343995 0.0918102 -0.908647
0.400064 0.0996298 -0.587722
0.420699 -0.131311 -0.566806
0.39516 -0.100331 -0.908647
0.446883 -0.129375 -0.587722
0.3308 0.214471 -0.908647
0.344344 0.242162 -0.566806
0.369364 0.249793 -0.587722
0.349639 0.09078 -0.834104
-0.0943947 0.144433 -0.0331752
-0.177794 0.0141305 -0.001149
-0.112851 0.0486489 -0.334468
-0.0659988 0.112329 -0.345801
-0.0775947 0.121009 -0.13791
-0.0260305 0.0079986 -0.671613
-0.0222512 0.217461 -0.51172
-0.0943947 -0.22453 0.026899
-0.130905 -0.267236 0.298845
-0.000357203 0.173965 -0.0160962
-0.111655 0.149864 0.298845
-0.0366992 0.17055 -0.040928
-0.0306611 -0.152925 -0.34216
-0.114118 -0.0498528 -0.316654
-0.177794 -0.120885 0.0177391
-0.0299827 0.222544 -0.275104
-0.0229063 -0.110187 -0.590456
-0.0306772 0.207248 -0.0999594
-0.000357203 0.216146 -0.0919062
-0.191443 0.0100846 0.378379
-0.191443 -0.13758 0.378379
-0.87395 0.0322361 0.18891
-0.957037 0.0235341 0.192298
-0.884625 0.0323485 0.29654
-0.963936 0.0286615 0.264585
-0.346372 0.0918103 -0.905359
-0.40588 0.0746761 -0.587722
-0.400779 0.0996299 -0.602235
-0.222389 -0.0537316 -0.14475
-0.111655 0.149864 0.495135
-0.191443 0.0489168 0.495135
-0.000357203 0.183546 0.495135
-0.130905 -0.267236 0.495135
-0.000357203 -0.335018 0.495135
-0.191443 -0.0987481 0.495135
-0.0968152 0.121112 0.567519
-0.165965 0.0336246 0.567519
-0.113498 -0.240374 0.567519
-0.165965 -0.0943517 0.567519
-0.0839541 0.0961934 0.567519
-0.143884 0.0203713 0.567519
-0.0984127 -0.217095 0.567519
-0.143884 -0.0905415 0.567519
-0.0839541 0.0961934 0.484629
-0.143884 0.0203713 0.484629
-0.0984127 -0.217095 0.484629
-0.000357203 -0.268007 0.484629
-0.143884 -0.0905415 0.484629
-0.223278 -0.0120031 0.135774
-0.242198 -0.0124758 0.32577
-0.252542 -0.105423 0.32577
-0.232736 -0.0969883 0.147736
-0.872763 0.0147353 0.0957062
-0.566794 0.0115894 0.32577
-0.547948 0.011391 0.135774
-0.574412 -0.0568671 0.32577
-0.554914 -0.0512014 0.147736
-0.545854 -0.0195028 -0.0723815
-0.888941 -0.00643099 0.29654
-0.877895 -0.00322148 0.195687
-0.069163 0.00718598 -0.642478
-0.144038 0.0162689 -0.433251
-0.142961 0.0417387 -0.448393
-0.375265 0.0944137 -0.58132
-0.350353 0.0907801 -0.834105
-0.380366 0.0694599 -0.566806
-0.421413 -0.131311 -0.658428
-0.397537 -0.100331 -0.882239
-0.447598 -0.129375 -0.691307
-0.333177 0.214471 -0.877766
-0.345058 0.242162 -0.663246
-0.370078 0.249793 -0.695961
5 14 13 19 9 21
3 24 6 19
4 2 17 4 22
5 27 15 21 10 91
4 18 20 17 11
4 18 11 24 12
3 6 24 23
4 28 8 6 25
3 25 6 23
3 16 1 26
4 17 2 0 11
4 11 0 1 16
3 10 21 9
3 8 19 6
4 7 100 91 10
3 7 10 9
4 21 15 5 14
4 20 3 4 17
4 60 61 66 65
3 73 74 72
5 14 54 20 18 13
4 15 30 29 5
4 27 113 30 15
4 4 31 115 22
4 3 32 31 4
4 5 29 32 3
4 30 34 33 29
4 113 35 34 30
4 31 37 36 115
4 32 38 37 31
4 29 33 38 32
4 34 40 39 33
4 35 41 40 34
4 37 43 42 36
4 38 44 43 37
4 33 39 44 38
4 40 46 45 39
4 41 47 46 40
4 43 48 128 42
4 44 49 48 43
4 39 45 49 44
4 7 8 28 100
4 7 9 19 8
3 14 51 54
4 5 52 51 14
4 3 53 52 5
4 20 50 53 3
3 50 20 54
3 60 65 63
4 52 56 55 51
4 53 57 56 52
4 50 59 57 53
4 51 55 58 54
4 54 58 59 50
4 56 61 60 55
4 57 62 61 56
4 59 64 62 57
4 55 60 63 58
4 58 63 64 59
4 66 62 64 65
3 65 64 63
3 66 61 62
4 12 68 67 18
4 13 69 68 12
4 18 67 69 13
4 69 71 81 68
4 67 70 71 69
3 76 77 75
3 79 80 78
4 70 72 74 71
5 73 76 75 70 81
4 72 77 76 73
4 70 75 77 72
5 71 79 78 73 81
4 74 80 79 71
4 73 78 80 74
4 81 70 67 68
5 86 85 84 83 82
4 24 87 84 85
4 90 89 2 22
5 93 82 92 27 91
4 89 96 95 94
3 94 95 87
4 88 97 28 25
3 88 25 23
3 1 98 26
4 0 2 89 94
4 1 0 94 98
4 24 98 94 87
3 82 93 86
3 85 97 88
4 91 100 99 93
3 93 99 86
4 101 92 82 83
4 90 102 96 89
4 106 105 103 104
3 26 98 24
3 109 107 108
5 95 96 110 83 84
4 112 111 92 101
4 111 113 27 92
4 115 114 90 22
4 114 116 102 90
4 116 112 101 102
4 118 117 111 112
4 117 35 113 111
4 36 119 114 115
4 119 120 116 114
4 120 118 112 116
4 122 121 117 118
4 121 41 35 117
4 42 123 119 36
4 123 124 120 119
4 124 122 118 120
4 126 125 121 122
4 125 47 41 121
4 128 127 123 42
4 127 129 124 123
4 129 126 122 124
4 28 97 99 100
4 85 86 99 97
3 130 83 110
4 130 131 101 83
4 131 132 102 101
4 132 133 96 102
3 96 133 110
3 104 103 134
4 136 135 131 130
4 135 137 132 131
4 137 138 133 132
4 139 136 130 110
4 138 139 110 133
4 103 105 135 136
4 105 140 137 135
4 140 141 138 137
4 134 103 136 139
4 141 134 139 138
4 141 140 106 104
3 141 104 134
3 105 106 140
4 143 142 87 95
4 142 144 84 87
4 144 143 95 84
4 146 145 144 142
4 145 147 143 144
3 150 149 148
3 153 152 151
4 109 108 147 145
5 147 148 149 107 146
4 149 150 108 107
4 150 148 147 108
5 107 151 152 145 146
4 152 153 109 145
4 153 151 107 109
4 143 147 146 142
10 128 48 49 45 46 47 125 126 129 127
3 88 23 24
4 19 13 12 24
3 16 26 24
3 11 16 24
3 85 88 24

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,6 @@
0 0 0
1 0 0
0 1 0
0 0 1
2 2 2
-1 0 1

View File

@ -0,0 +1,5 @@
0 0 0
1 0 0
0 1 0
0 0 1
2 2 2