Merge pull request #4042 from gdamiand/Surface_mesh_topology-gdamiand
Surface mesh topology (new package)
10
.travis.yml
|
|
@ -47,11 +47,11 @@ env:
|
|||
- PACKAGE='Stream_support Subdivision_method_3 Surface_mesh '
|
||||
- PACKAGE='Surface_mesh_approximation Surface_mesh_deformation Surface_mesh_parameterization '
|
||||
- PACKAGE='Surface_mesh_segmentation Surface_mesh_shortest_path Surface_mesh_simplification '
|
||||
- PACKAGE='Surface_mesh_skeletonization Surface_mesher Surface_sweep_2 '
|
||||
- PACKAGE='TDS_2 TDS_3 Testsuite '
|
||||
- PACKAGE='Three Triangulation Triangulation_2 '
|
||||
- PACKAGE='Triangulation_3 Union_find Visibility_2 '
|
||||
- PACKAGE='Voronoi_diagram_2 wininst '
|
||||
- PACKAGE='Surface_mesh_skeletonization Surface_mesh_topology Surface_mesher '
|
||||
- PACKAGE='Surface_sweep_2 TDS_2 TDS_3 '
|
||||
- PACKAGE='Testsuite Three Triangulation '
|
||||
- PACKAGE='Triangulation_2 Triangulation_3 Union_find '
|
||||
- PACKAGE='Visibility_2 Voronoi_diagram_2 wininst '
|
||||
compiler: clang
|
||||
install:
|
||||
- echo "$PWD"
|
||||
|
|
|
|||
|
|
@ -122,6 +122,7 @@ Surface_mesh_segmentation
|
|||
Surface_mesh_shortest_path
|
||||
Surface_mesh_simplification
|
||||
Surface_mesh_skeletonization
|
||||
Surface_mesh_topology
|
||||
Surface_mesher
|
||||
Surface_sweep_2
|
||||
TDS_2
|
||||
|
|
|
|||
|
|
@ -41,6 +41,9 @@
|
|||
#include <deque>
|
||||
#include <boost/type_traits/is_same.hpp>
|
||||
#include <boost/unordered_map.hpp>
|
||||
#include <boost/graph/graph_traits.hpp>
|
||||
#include <CGAL/boost/graph/helpers.h>
|
||||
|
||||
#include <CGAL/config.h>
|
||||
|
||||
#if defined( __INTEL_COMPILER )
|
||||
|
|
@ -55,6 +58,16 @@ _Pragma("GCC diagnostic ignored \"-Warray-bounds\"")
|
|||
#endif
|
||||
|
||||
namespace CGAL {
|
||||
// functions to allow the call to next/opposite by ADL
|
||||
template <typename G, typename Desc>
|
||||
auto CM_ADL_next(Desc&& d, G&& g) {
|
||||
return next(std::forward<Desc>(d), std::forward<G>(g));
|
||||
}
|
||||
|
||||
template <typename G, typename Desc>
|
||||
auto CM_ADL_opposite(Desc&& d, G&& g) {
|
||||
return opposite(std::forward<Desc>(d), std::forward<G>(g));
|
||||
}
|
||||
|
||||
/** @file Combinatorial_map.h
|
||||
* Definition of generic dD Combinatorial map.
|
||||
|
|
@ -199,18 +212,27 @@ namespace CGAL {
|
|||
CGAL_assertion(number_of_darts()==0);
|
||||
}
|
||||
|
||||
/** Copy the given combinatorial map into *this.
|
||||
/** Copy the given combinatorial map 'amap' into *this.
|
||||
* Note that both CMap can have different dimensions and/or non void attributes.
|
||||
* @param amap the combinatorial map to copy.
|
||||
* @post *this is valid.
|
||||
*/
|
||||
template <typename CMap2, typename Converters, typename DartInfoConverter,
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2,
|
||||
typename Converters, typename DartInfoConverter,
|
||||
typename PointConverter>
|
||||
void copy(const CMap2& amap, const Converters& converters,
|
||||
void copy(const Combinatorial_map_base<d2, Refs2, Items2, Alloc2, Storage2>& amap,
|
||||
const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter,
|
||||
const PointConverter& pointconverter,
|
||||
boost::unordered_map<typename CMap2::Dart_const_handle, Dart_handle>* dart_mapping=nullptr)
|
||||
boost::unordered_map
|
||||
<typename Combinatorial_map_base<d2, Refs2, Items2, Alloc2, Storage2>::
|
||||
Dart_const_handle, Dart_handle>* origin_to_copy=NULL,
|
||||
boost::unordered_map
|
||||
<Dart_handle, typename Combinatorial_map_base<d2, Refs2, Items2,
|
||||
Alloc2, Storage2>::Dart_const_handle>* copy_to_origin=NULL)
|
||||
{
|
||||
typedef Combinatorial_map_base<d2, Refs2, Items2, Alloc2, Storage2> CMap2;
|
||||
this->clear();
|
||||
|
||||
this->mnb_used_marks = amap.mnb_used_marks;
|
||||
|
|
@ -232,81 +254,113 @@ namespace CGAL {
|
|||
// Create an mapping between darts of the two maps (originals->copies).
|
||||
// (here we cannot use CGAL::Unique_hash_map because it does not provide
|
||||
// iterators...
|
||||
boost::unordered_map<typename CMap2::Dart_const_handle, Dart_handle> local_dartmap;
|
||||
if (dart_mapping==nullptr)
|
||||
{ dart_mapping=&local_dartmap; }
|
||||
boost::unordered_map<typename CMap2::Dart_const_handle, Dart_handle>
|
||||
local_dartmap;
|
||||
if (origin_to_copy==NULL) // Used local_dartmap if user does not provides its own unordered_map
|
||||
{ origin_to_copy=&local_dartmap; }
|
||||
|
||||
Dart_handle new_dart;
|
||||
for (typename CMap2::Dart_const_range::const_iterator
|
||||
it=amap.darts().begin(), itend=amap.darts().end();
|
||||
it!=itend; ++it)
|
||||
{
|
||||
(*dart_mapping)[it]=mdarts.emplace();
|
||||
init_dart((*dart_mapping)[it], amap.get_marks(it));
|
||||
internal::Copy_dart_info_functor<CMap2, Refs, DartInfoConverter>::run
|
||||
(amap, static_cast<Refs&>(*this), it, (*dart_mapping)[it],
|
||||
dartinfoconverter);
|
||||
new_dart=mdarts.emplace();
|
||||
init_dart(new_dart, amap.get_marks(it));
|
||||
|
||||
(*origin_to_copy)[it]=new_dart;
|
||||
if (copy_to_origin!=NULL) { (*copy_to_origin)[new_dart]=it; }
|
||||
|
||||
internal::Copy_dart_info_functor<Refs2, Refs, DartInfoConverter>::run
|
||||
(static_cast<const Refs2&>(amap), static_cast<Refs&>(*this),
|
||||
it, new_dart, dartinfoconverter);
|
||||
}
|
||||
|
||||
unsigned int min_dim=(dimension<amap.dimension?dimension:amap.dimension);
|
||||
|
||||
typename boost::unordered_map<typename CMap2::Dart_const_handle,Dart_handle>
|
||||
::iterator dartmap_iter, dartmap_iter_end=dart_mapping->end();
|
||||
for (dartmap_iter=dart_mapping->begin(); dartmap_iter!=dartmap_iter_end;
|
||||
::iterator dartmap_iter, dartmap_iter_end=origin_to_copy->end();
|
||||
for (dartmap_iter=origin_to_copy->begin(); dartmap_iter!=dartmap_iter_end;
|
||||
++dartmap_iter)
|
||||
{
|
||||
for (unsigned int i=0; i<=min_dim; i++)
|
||||
{
|
||||
if (!amap.is_free(dartmap_iter->first,i) &&
|
||||
(dartmap_iter->first)<(amap.beta(dartmap_iter->first,i)))
|
||||
is_free(dartmap_iter->second,i))
|
||||
{
|
||||
basic_link_beta(dartmap_iter->second,
|
||||
(*dart_mapping)[amap.beta(dartmap_iter->first,i)], i);
|
||||
(*origin_to_copy)[amap.beta(dartmap_iter->first,i)], i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Copy attributes */
|
||||
for (dartmap_iter=dart_mapping->begin(); dartmap_iter!=dartmap_iter_end;
|
||||
for (dartmap_iter=origin_to_copy->begin(); dartmap_iter!=dartmap_iter_end;
|
||||
++dartmap_iter)
|
||||
{
|
||||
Helper::template Foreach_enabled_attributes
|
||||
< internal::Copy_attributes_functor <CMap2, Refs, Converters,
|
||||
< internal::Copy_attributes_functor <Refs2, Refs, Converters,
|
||||
PointConverter> >::
|
||||
run(amap, static_cast<Refs&>(*this),
|
||||
run(static_cast<const Refs2&>(amap), static_cast<Refs&>(*this),
|
||||
dartmap_iter->first, dartmap_iter->second,
|
||||
converters, pointconverter);
|
||||
}
|
||||
|
||||
CGAL_assertion (is_valid () == 1);
|
||||
CGAL_assertion (is_valid());
|
||||
}
|
||||
|
||||
template <typename CMap2>
|
||||
void copy(const CMap2& amap,
|
||||
boost::unordered_map<typename CMap2::Dart_const_handle, Dart_handle>* dart_mapping=nullptr)
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2>
|
||||
void copy(const Combinatorial_map_base<d2, Refs2, Items2, Alloc2, Storage2>& amap,
|
||||
boost::unordered_map
|
||||
<typename Combinatorial_map_base<d2, Refs2, Items2, Alloc2,
|
||||
Storage2>::Dart_const_handle, Dart_handle>* origin_to_copy=NULL,
|
||||
boost::unordered_map
|
||||
<Dart_handle, typename Combinatorial_map_base<d2, Refs2, Items2,
|
||||
Alloc2, Storage2>::Dart_const_handle>* copy_to_origin=NULL)
|
||||
|
||||
{
|
||||
std::tuple<> converters;
|
||||
Default_converter_dart_info<CMap2, Refs> dartinfoconverter;
|
||||
Default_converter_cmap_0attributes_with_point<CMap2, Refs> pointconverter;
|
||||
copy(amap, converters, dartinfoconverter, pointconverter, dart_mapping);
|
||||
CGAL::cpp11::tuple<> converters;
|
||||
Default_converter_dart_info<Refs2, Refs> dartinfoconverter;
|
||||
Default_converter_cmap_0attributes_with_point<Refs2, Refs> pointconverter;
|
||||
copy(amap, converters, dartinfoconverter, pointconverter,
|
||||
origin_to_copy, copy_to_origin);
|
||||
}
|
||||
|
||||
template <typename CMap2, typename Converters>
|
||||
void copy(const CMap2& amap, const Converters& converters,
|
||||
boost::unordered_map<typename CMap2::Dart_const_handle, Dart_handle>* dart_mapping=nullptr)
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2, typename Converters>
|
||||
void copy(const Combinatorial_map_base<d2, Refs2, Items2,
|
||||
Alloc2, Storage2>& amap,
|
||||
const Converters& converters,
|
||||
boost::unordered_map
|
||||
<typename Combinatorial_map_base<d2, Refs2, Items2, Alloc2,
|
||||
Storage2>::Dart_const_handle, Dart_handle>* origin_to_copy=NULL,
|
||||
boost::unordered_map
|
||||
<Dart_handle, typename Combinatorial_map_base<d2, Refs2, Items2,
|
||||
Alloc2, Storage2>::Dart_const_handle>* copy_to_origin=NULL)
|
||||
{
|
||||
Default_converter_cmap_0attributes_with_point<CMap2, Refs> pointconverter;
|
||||
Default_converter_dart_info<CMap2, Refs> dartinfoconverter;
|
||||
copy(amap, converters, dartinfoconverter, pointconverter, dart_mapping);
|
||||
Default_converter_cmap_0attributes_with_point<Refs2, Refs> pointconverter;
|
||||
Default_converter_dart_info<Refs2, Refs> dartinfoconverter;
|
||||
copy(amap, converters, dartinfoconverter, pointconverter,
|
||||
origin_to_copy, copy_to_origin);
|
||||
}
|
||||
|
||||
template <typename CMap2, typename Converters, typename DartInfoConverter>
|
||||
void copy(const CMap2& amap, const Converters& converters,
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2,
|
||||
typename Converters, typename DartInfoConverter>
|
||||
void copy(const Combinatorial_map_base<d2, Refs2, Items2,
|
||||
Alloc2, Storage2>& amap,
|
||||
const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter,
|
||||
boost::unordered_map<typename CMap2::Dart_const_handle, Dart_handle>* dart_mapping=nullptr)
|
||||
boost::unordered_map
|
||||
<typename Combinatorial_map_base<d2, Refs2, Items2, Alloc2,
|
||||
Storage2>::Dart_const_handle, Dart_handle>* origin_to_copy=NULL,
|
||||
boost::unordered_map
|
||||
<Dart_handle, typename Combinatorial_map_base<d2, Refs2, Items2,
|
||||
Alloc2, Storage2>::Dart_const_handle>* copy_to_origin=NULL)
|
||||
{
|
||||
Default_converter_cmap_0attributes_with_point<CMap2, Refs> pointconverter;
|
||||
copy(amap, converters, dartinfoconverter, pointconverter, dart_mapping);
|
||||
Default_converter_cmap_0attributes_with_point<Refs2, Refs> pointconverter;
|
||||
copy(amap, converters, dartinfoconverter, pointconverter,
|
||||
origin_to_copy, copy_to_origin);
|
||||
}
|
||||
|
||||
// Copy constructor from a map having exactly the same type.
|
||||
|
|
@ -314,25 +368,37 @@ namespace CGAL {
|
|||
{ copy(amap); }
|
||||
|
||||
// "Copy constructor" from a map having different type.
|
||||
template <typename CMap2>
|
||||
Combinatorial_map_base(const CMap2& amap)
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2>
|
||||
Combinatorial_map_base(const Combinatorial_map_base<d2, Refs2, Items2,
|
||||
Alloc2, Storage2>& amap)
|
||||
{ copy(amap); }
|
||||
|
||||
// "Copy constructor" from a map having different type.
|
||||
template <typename CMap2, typename Converters>
|
||||
Combinatorial_map_base(const CMap2& amap, Converters& converters)
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2, typename Converters>
|
||||
Combinatorial_map_base(const Combinatorial_map_base<d2, Refs2, Items2,
|
||||
Alloc2, Storage2>& amap,
|
||||
const Converters& converters)
|
||||
{ copy(amap, converters); }
|
||||
|
||||
// "Copy constructor" from a map having different type.
|
||||
template <typename CMap2, typename Converters, typename DartInfoConverter>
|
||||
Combinatorial_map_base(const CMap2& amap, Converters& converters,
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2, typename Converters, typename DartInfoConverter>
|
||||
Combinatorial_map_base(const Combinatorial_map_base<d2, Refs2, Items2,
|
||||
Alloc2, Storage2>& amap,
|
||||
const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter)
|
||||
{ copy(amap, converters, dartinfoconverter); }
|
||||
|
||||
// "Copy constructor" from a map having different type.
|
||||
template <typename CMap2, typename Converters, typename DartInfoConverter,
|
||||
typename PointConverter>
|
||||
Combinatorial_map_base(const CMap2& amap, Converters& converters,
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2,
|
||||
typename Converters, typename DartInfoConverter,
|
||||
typename PointConverter>
|
||||
Combinatorial_map_base(const Combinatorial_map_base<d2, Refs2, Items2,
|
||||
Alloc2, Storage2>& amap,
|
||||
const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter,
|
||||
const PointConverter& pointconverter)
|
||||
{ copy(amap, converters, dartinfoconverter, pointconverter); }
|
||||
|
|
@ -385,6 +451,62 @@ namespace CGAL {
|
|||
}
|
||||
}
|
||||
|
||||
/** Import the given hds which should be a model of an halfedge graph. */
|
||||
template<class HEG>
|
||||
void import_from_halfedge_graph(const HEG& heg,
|
||||
boost::unordered_map
|
||||
<typename boost::graph_traits<HEG>::halfedge_descriptor,
|
||||
Dart_handle>* origin_to_copy=NULL,
|
||||
boost::unordered_map
|
||||
<Dart_handle,
|
||||
typename boost::graph_traits<HEG>::halfedge_descriptor>*
|
||||
copy_to_origin=NULL)
|
||||
|
||||
{
|
||||
// Create an mapping between darts of the two maps (originals->copies).
|
||||
// (here we cannot use CGAL::Unique_hash_map because it does not provide
|
||||
// iterators...
|
||||
boost::unordered_map
|
||||
<typename boost::graph_traits<HEG>::halfedge_descriptor,
|
||||
Dart_handle> local_dartmap;
|
||||
if (origin_to_copy==NULL) // Used local_dartmap if user does not provides its own unordered_map
|
||||
{ origin_to_copy=&local_dartmap; }
|
||||
|
||||
Dart_handle new_dart;
|
||||
for (typename boost::graph_traits<HEG>::halfedge_iterator
|
||||
it=halfedges(heg).begin(), itend=halfedges(heg).end();
|
||||
it!=itend; ++it)
|
||||
{
|
||||
if (!CGAL::is_border(*it, heg))
|
||||
{
|
||||
new_dart=mdarts.emplace();
|
||||
(*origin_to_copy)[*it]=new_dart;
|
||||
if (copy_to_origin!=NULL) { (*copy_to_origin)[new_dart]=*it; }
|
||||
}
|
||||
}
|
||||
|
||||
typename boost::unordered_map
|
||||
<typename boost::graph_traits<HEG>::halfedge_descriptor,
|
||||
Dart_handle>::iterator dartmap_iter, dartmap_iter_end=origin_to_copy->end();
|
||||
for (dartmap_iter=origin_to_copy->begin(); dartmap_iter!=dartmap_iter_end;
|
||||
++dartmap_iter)
|
||||
{
|
||||
basic_link_beta(dartmap_iter->second,
|
||||
(*origin_to_copy)[CM_ADL_next(dartmap_iter->first, heg)],
|
||||
1);
|
||||
|
||||
if (!CGAL::is_border(CM_ADL_opposite(dartmap_iter->first, heg), heg) &&
|
||||
(dartmap_iter->first)<CM_ADL_opposite(dartmap_iter->first, heg))
|
||||
{
|
||||
basic_link_beta(dartmap_iter->second,
|
||||
(*origin_to_copy)
|
||||
[CM_ADL_opposite(dartmap_iter->first, heg)], 2);
|
||||
}
|
||||
}
|
||||
|
||||
CGAL_assertion (is_valid());
|
||||
}
|
||||
|
||||
/** Clear the combinatorial map. Remove all darts and all attributes.
|
||||
* Note that reserved marks are not free.
|
||||
*/
|
||||
|
|
@ -498,6 +620,16 @@ namespace CGAL {
|
|||
{ return mdarts.iterator_to(adart); }
|
||||
Dart_const_handle dart_handle(const Dart& adart) const
|
||||
{ return mdarts.iterator_to(adart); }
|
||||
Dart_handle dart_handle(size_type i)
|
||||
{
|
||||
CGAL_assertion(darts().is_used(i));
|
||||
return mdarts.iterator_to(darts()[i]);
|
||||
}
|
||||
Dart_const_handle dart_handle(size_type i) const
|
||||
{
|
||||
CGAL_assertion(darts().is_used(i));
|
||||
return mdarts.iterator_to(darts()[i]);
|
||||
}
|
||||
|
||||
/** Return the highest dimension for which dh is not free.
|
||||
* @param dh a dart handle
|
||||
|
|
@ -673,6 +805,11 @@ namespace CGAL {
|
|||
Dart_const_handle next(Dart_const_handle ADart) const
|
||||
{ return this->template beta<1>(ADart); }
|
||||
|
||||
Dart_handle opposite2(Dart_handle ADart)
|
||||
{ return this->template beta<2>(ADart); }
|
||||
Dart_const_handle opposite2(Dart_const_handle ADart) const
|
||||
{ return this->template beta<2>(ADart); }
|
||||
|
||||
template<unsigned int dim>
|
||||
Dart_handle opposite(Dart_handle ADart)
|
||||
{ return this->template beta<dim>(ADart); }
|
||||
|
|
@ -950,6 +1087,27 @@ namespace CGAL {
|
|||
mnb_times_reserved_marks[amark]=0;
|
||||
}
|
||||
|
||||
template <unsigned int i, unsigned int d=dimension>
|
||||
bool belong_to_same_cell(Dart_const_handle adart1,
|
||||
Dart_const_handle adart2) const
|
||||
{ return CGAL::belong_to_same_cell<Self, i, d>(*this, adart1, adart2); }
|
||||
|
||||
template <unsigned int i, unsigned int d=dimension>
|
||||
bool is_whole_cell_unmarked(Dart_const_handle adart, size_type amark) const
|
||||
{ return CGAL::is_whole_cell_unmarked<Self, i, d>(*this, adart, amark); }
|
||||
|
||||
template <unsigned int i, unsigned int d=dimension>
|
||||
bool is_whole_cell_marked(Dart_const_handle adart, size_type amark) const
|
||||
{ return CGAL::is_whole_cell_marked<Self, i, d>(*this, adart, amark); }
|
||||
|
||||
template <unsigned int i, unsigned int d=dimension>
|
||||
size_type mark_cell(Dart_const_handle adart, size_type amark) const
|
||||
{ return CGAL::mark_cell<Self, i, d>(*this, adart, amark); }
|
||||
|
||||
template <unsigned int i, unsigned int d=dimension>
|
||||
size_type unmark_cell(Dart_const_handle adart, size_type amark) const
|
||||
{ return CGAL::unmark_cell<Self, i, d>(*this, adart, amark); }
|
||||
|
||||
/** Test if this map is without boundary for a given dimension.
|
||||
* @param i the dimension.
|
||||
* @return true iff all the darts are not i-free.
|
||||
|
|
@ -2300,6 +2458,30 @@ namespace CGAL {
|
|||
run(*this, adart, amark);
|
||||
}
|
||||
|
||||
/// Keep the biggest connected component.
|
||||
/// @return the size (in number of darts) of the biggest cc.
|
||||
std::size_t keep_biggest_connected_component()
|
||||
{
|
||||
std::map<std::size_t, Dart_handle> ccs;
|
||||
|
||||
size_type treated=get_new_mark();
|
||||
for (auto it=darts().begin(), itend=darts().end(); it!=itend; ++it)
|
||||
{
|
||||
if (!is_marked(it, treated))
|
||||
{ ccs[mark_cell<dimension+1>(it, treated)]=it; }
|
||||
}
|
||||
|
||||
if (ccs.size()>1)
|
||||
{ // Here all darts are marked
|
||||
this->template unmark_cell<dimension+1>(ccs.rbegin()->second, treated); // Unmark the biggest cc
|
||||
erase_marked_darts(treated);
|
||||
}
|
||||
|
||||
free_mark(treated);
|
||||
|
||||
return ccs.rbegin()->first;
|
||||
}
|
||||
|
||||
/** Count the marked cells (at least one marked dart).
|
||||
* @param amark the mark to consider.
|
||||
* @param avector containing the dimensions of the cells to count.
|
||||
|
|
@ -2433,6 +2615,64 @@ namespace CGAL {
|
|||
}
|
||||
|
||||
public:
|
||||
|
||||
/// @return the positive turn between the two given darts.
|
||||
// @pre beta1(d1) and d2 must belong to the same vertex.
|
||||
std::size_t positive_turn(Dart_const_handle d1, Dart_const_handle d2) const
|
||||
{
|
||||
CGAL_assertion((!this->template is_free<1>(d1)));
|
||||
/* CGAL_assertion((belong_to_same_cell<0>(this->template beta<1>(d1),
|
||||
d2))); */
|
||||
|
||||
if (d2==beta<2>(d1)) { return 0; }
|
||||
|
||||
Dart_const_handle dd1=d1;
|
||||
std::size_t res=1;
|
||||
while (beta<1>(dd1)!=d2)
|
||||
{
|
||||
if (this->template is_free<2>(beta<1>(dd1)))
|
||||
{ return std::numeric_limits<std::size_t>::max(); }
|
||||
|
||||
++res;
|
||||
dd1=beta<1, 2>(dd1);
|
||||
|
||||
CGAL_assertion(!this->template is_free<1>(dd1));
|
||||
CGAL_assertion(beta<1>(dd1)==d2 || dd1!=d1);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/// @return the negative turn between the two given darts.
|
||||
// @pre beta1(d1) and d2 must belong to the same vertex.
|
||||
std::size_t negative_turn(Dart_const_handle d1, Dart_const_handle d2) const
|
||||
{
|
||||
CGAL_assertion((!this->template is_free<1>(d1)));
|
||||
/* CGAL_assertion((belong_to_same_cell<0>(this->template beta<1>(d1),
|
||||
d2))); */
|
||||
|
||||
if (d2==beta<2>(d1)) { return 0; }
|
||||
|
||||
if (this->template is_free<2>(d1) || this->template is_free<2>(d2))
|
||||
{ return std::numeric_limits<std::size_t>::max(); }
|
||||
|
||||
d1=beta<2>(d1);
|
||||
d2=beta<2>(d2);
|
||||
Dart_const_handle dd1=d1;
|
||||
std::size_t res=1;
|
||||
while (beta<0>(dd1)!=d2)
|
||||
{
|
||||
if (this->template is_free<2>(beta<0>(dd1)))
|
||||
{ return std::numeric_limits<std::size_t>::max(); }
|
||||
|
||||
++res;
|
||||
dd1=beta<0, 2>(dd1);
|
||||
|
||||
CGAL_assertion(!this->template is_free<0>(dd1));
|
||||
CGAL_assertion(beta<0>(dd1)==d2 || dd1!=d1);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/** Erase marked darts from the map.
|
||||
* Marked darts are unlinked before to be removed, thus surviving darts
|
||||
* are correctly linked, but the map is not necessarily valid depending
|
||||
|
|
@ -3513,12 +3753,12 @@ namespace CGAL {
|
|||
!is_face_combinatorial_polygon(d4, 3) ) return false;
|
||||
|
||||
// TODO do better with marks (?).
|
||||
if ( belong_to_same_cell<Self,2,1>(*this, d1, d2) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d1, d3) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d1, d4) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d2, d3) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d2, d4) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d3, d4) ) return false;
|
||||
if ( belong_to_same_cell<2,1>(d1, d2) ||
|
||||
belong_to_same_cell<2,1>(d1, d3) ||
|
||||
belong_to_same_cell<2,1>(d1, d4) ||
|
||||
belong_to_same_cell<2,1>(d2, d3) ||
|
||||
belong_to_same_cell<2,1>(d2, d4) ||
|
||||
belong_to_same_cell<2,1>(d3, d4) ) return false;
|
||||
|
||||
if ( beta(d1,1,2)!=beta(d3,0) ||
|
||||
beta(d4,0,2)!=beta(d3,1) ||
|
||||
|
|
@ -3611,21 +3851,21 @@ namespace CGAL {
|
|||
!is_face_combinatorial_polygon(d6, 4) ) return false;
|
||||
|
||||
// TODO do better with marks.
|
||||
if ( belong_to_same_cell<Self,2,1>(*this, d1, d2) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d1, d3) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d1, d4) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d1, d5) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d1, d6) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d2, d3) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d2, d4) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d2, d5) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d2, d6) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d3, d4) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d3, d5) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d3, d6) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d4, d5) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d4, d6) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d5, d6) )
|
||||
if ( belong_to_same_cell<2,1>(d1, d2) ||
|
||||
belong_to_same_cell<2,1>(d1, d3) ||
|
||||
belong_to_same_cell<2,1>(d1, d4) ||
|
||||
belong_to_same_cell<2,1>(d1, d5) ||
|
||||
belong_to_same_cell<2,1>(d1, d6) ||
|
||||
belong_to_same_cell<2,1>(d2, d3) ||
|
||||
belong_to_same_cell<2,1>(d2, d4) ||
|
||||
belong_to_same_cell<2,1>(d2, d5) ||
|
||||
belong_to_same_cell<2,1>(d2, d6) ||
|
||||
belong_to_same_cell<2,1>(d3, d4) ||
|
||||
belong_to_same_cell<2,1>(d3, d5) ||
|
||||
belong_to_same_cell<2,1>(d3, d6) ||
|
||||
belong_to_same_cell<2,1>(d4, d5) ||
|
||||
belong_to_same_cell<2,1>(d4, d6) ||
|
||||
belong_to_same_cell<2,1>(d5, d6) )
|
||||
return false;
|
||||
|
||||
if ( beta(d1,2) !=beta(d4,1,1) ||
|
||||
|
|
@ -4213,7 +4453,7 @@ namespace CGAL {
|
|||
if ( od==null_handle ) return false;
|
||||
|
||||
// of and *it must belong to the same vertex of the same volume
|
||||
if ( !belong_to_same_cell<Self, 0, 2>(*this, od, *it) )
|
||||
if ( !belong_to_same_cell<0, 2>(od, *it) )
|
||||
return false;
|
||||
}
|
||||
prec = *it;
|
||||
|
|
@ -4223,7 +4463,7 @@ namespace CGAL {
|
|||
od = other_extremity(prec);
|
||||
if ( od==null_handle ) return false;
|
||||
|
||||
if (!belong_to_same_cell<Self, 0, 2>(*this, od, *afirst))
|
||||
if (!belong_to_same_cell<0, 2>(od, *afirst))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
|
@ -4437,24 +4677,33 @@ namespace CGAL {
|
|||
Combinatorial_map(const Self & amap) : Base(amap)
|
||||
{}
|
||||
|
||||
template < class CMap >
|
||||
Combinatorial_map(const CMap & amap) : Base(amap)
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2>
|
||||
Combinatorial_map(const Combinatorial_map_base<d2, Refs2, Items2, Alloc2, Storage2>&
|
||||
amap) : Base(amap)
|
||||
{}
|
||||
|
||||
template < class CMap, typename Converters >
|
||||
Combinatorial_map(const CMap & amap, const Converters& converters) :
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2, typename Converters>
|
||||
Combinatorial_map(const Combinatorial_map_base<d2, Refs2, Items2, Alloc2, Storage2>&
|
||||
amap, const Converters& converters) :
|
||||
Base(amap, converters)
|
||||
{}
|
||||
|
||||
template < class CMap, typename Converters, typename DartInfoConverter >
|
||||
Combinatorial_map(const CMap & amap, const Converters& converters,
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2, typename Converters,
|
||||
typename DartInfoConverter>
|
||||
Combinatorial_map(const Combinatorial_map_base<d2, Refs2, Items2, Alloc2, Storage2>&
|
||||
amap, const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter) :
|
||||
Base(amap, converters, dartinfoconverter)
|
||||
{}
|
||||
|
||||
template < class CMap, typename Converters, typename DartInfoConverter,
|
||||
typename PointConverter >
|
||||
Combinatorial_map(const CMap & amap, const Converters& converters,
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2, typename Converters,
|
||||
typename DartInfoConverter, typename PointConverter >
|
||||
Combinatorial_map(const Combinatorial_map_base<d2, Refs2, Items2, Alloc2, Storage2>&
|
||||
amap, const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter,
|
||||
const PointConverter& pointconverter) :
|
||||
Base(amap, converters, dartinfoconverter, pointconverter)
|
||||
|
|
|
|||
|
|
@ -194,7 +194,7 @@ namespace CGAL
|
|||
typename Map::size_type amark)
|
||||
{
|
||||
return CGAL::is_whole_orbit_unmarked<Map,
|
||||
typename Map::template Dart_of_cell_range<i,d>::iterator>
|
||||
typename Map::template Dart_of_cell_range<i,d>::const_iterator>
|
||||
(amap, adart, amark);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ namespace CGAL {
|
|||
{
|
||||
return ( ((*this==mmap->null_handle) && (aiterator==mmap->null_handle)) ||
|
||||
(mfirst_dart == aiterator.mfirst_dart &&
|
||||
static_cast<const Base&>(*this)==
|
||||
static_cast<const Base&>(*this)==
|
||||
static_cast<const Base&>(aiterator)) );
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -127,6 +127,8 @@ namespace CGAL {
|
|||
CGAL_assertion(i <= dimension);
|
||||
return dh->mf[i]==null_dart_handle;
|
||||
}
|
||||
bool is_perforated(Dart_const_handle /*dh*/) const
|
||||
{ return false; }
|
||||
|
||||
/// Set simultaneously all the marks of this dart to a given value.
|
||||
void set_dart_marks(Dart_const_handle ADart,
|
||||
|
|
|
|||
|
|
@ -0,0 +1,941 @@
|
|||
// Copyright (c) 2019 CNRS and LIRIS' Establishments (France).
|
||||
// All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org)
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
|
||||
//
|
||||
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
|
||||
//
|
||||
#ifndef CGAL_FACE_GRAPH_WRAPPER_H
|
||||
#define CGAL_FACE_GRAPH_WRAPPER_H 1
|
||||
|
||||
#include <CGAL/Functors_for_face_graph_wrapper.h>
|
||||
#include <CGAL/Iterators_for_face_graph_wrapper.h>
|
||||
#include <CGAL/internal/Combinatorial_map_internal_functors.h>
|
||||
#include <CGAL/Polyhedron_3_fwd.h>
|
||||
#include <CGAL/Surface_mesh/Surface_mesh_fwd.h>
|
||||
#include <bitset>
|
||||
|
||||
namespace CGAL
|
||||
{
|
||||
// Forward declarations of all classes model of Face_graph
|
||||
template <unsigned int d, typename Refs, typename Items, typename Alloc,
|
||||
typename Storage>
|
||||
class Combinatorial_map_base;
|
||||
|
||||
template <unsigned int d, typename Refs, typename Items, typename Alloc,
|
||||
typename Storage>
|
||||
class Generalized_map_base;
|
||||
|
||||
template <unsigned int d, unsigned int d2, typename Traits, typename Items,
|
||||
typename Alloc,
|
||||
template<unsigned int,class,class,class,class>
|
||||
class Map, typename Refs, typename Storage>
|
||||
class Linear_cell_complex_base;
|
||||
|
||||
template <unsigned int d, typename Items, typename Alloc,
|
||||
typename Storage>
|
||||
class Combinatorial_map;
|
||||
|
||||
template <unsigned int d, typename Items, typename Alloc,
|
||||
typename Storage>
|
||||
class Generalized_map;
|
||||
|
||||
template <unsigned int d, unsigned int d2, typename Traits, typename Items,
|
||||
typename Alloc,
|
||||
template<unsigned int,class,class,class,class>
|
||||
class Map, typename Storage>
|
||||
class Linear_cell_complex_for_combinatorial_map;
|
||||
|
||||
template <unsigned int d, unsigned int d2, typename Traits, typename Items,
|
||||
typename Alloc,
|
||||
template<unsigned int,class,class,class,class>
|
||||
class Map, typename Storage>
|
||||
class Linear_cell_complex_for_generalized_map;
|
||||
|
||||
namespace Surface_mesh_topology
|
||||
{
|
||||
template <typename Items, typename Alloc, typename Storage>
|
||||
class Polygonal_schema_with_combinatorial_map;
|
||||
|
||||
template <typename Items, typename Alloc, typename Storage>
|
||||
class Polygonal_schema_with_generalized_map;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/** Class Face_graph_wrapper: to wrap any model of FaceGraph into a
|
||||
* Combinatorial map. For now, only for const models, i.e. does not support
|
||||
* modification operators.
|
||||
*/
|
||||
template<typename HEG_>
|
||||
class Face_graph_wrapper
|
||||
{
|
||||
public:
|
||||
typedef HEG_ HEG;
|
||||
typedef Face_graph_wrapper<HEG> Self;
|
||||
typedef std::size_t size_type;
|
||||
|
||||
struct Dart_container
|
||||
{
|
||||
typedef typename boost::graph_traits<HEG>::halfedge_iterator iterator;
|
||||
typedef typename boost::graph_traits<HEG>::halfedge_iterator const_iterator; // TODO ?
|
||||
// typedef My_halfedge_iterator<HEG> iterator;
|
||||
// typedef My_halfedge_iterator<HEG> const_iterator; // TODO ?
|
||||
};
|
||||
|
||||
typedef typename boost::graph_traits<HEG>::halfedge_descriptor Dart_handle;
|
||||
typedef typename boost::graph_traits<HEG>::halfedge_descriptor Dart_const_handle;
|
||||
|
||||
typedef Dart_handle Null_handle_type;
|
||||
// typedef CGAL::Void* Null_handle_type;
|
||||
static const Null_handle_type null_handle; //=Dart_handle();
|
||||
static const Null_handle_type null_dart_handle; //=Dart_handle();
|
||||
|
||||
/// Number of marks
|
||||
static const size_type NB_MARKS = 32;
|
||||
static const size_type INVALID_MARK = NB_MARKS;
|
||||
|
||||
/// The dimension of the combinatorial map.
|
||||
static const unsigned int dimension=2;
|
||||
static const unsigned int ambient_dimension=3;
|
||||
|
||||
typedef typename boost::graph_traits<HEG>::vertex_descriptor vertex_descriptor;
|
||||
typedef typename boost::graph_traits<HEG>::edge_descriptor edge_descriptor;
|
||||
typedef typename boost::graph_traits<HEG>::face_descriptor face_descriptor;
|
||||
typedef boost::undirected_tag directed_category;
|
||||
typedef boost::disallow_parallel_edge_tag edge_parallel_category;
|
||||
|
||||
struct SM_graph_traversal_category : public virtual boost::bidirectional_graph_tag,
|
||||
public virtual boost::vertex_list_graph_tag,
|
||||
public virtual boost::edge_list_graph_tag
|
||||
{};
|
||||
typedef SM_graph_traversal_category traversal_category;
|
||||
|
||||
|
||||
Face_graph_wrapper(const HEG& f) : m_fg(f),
|
||||
mdarts(*this),
|
||||
m_nb_darts(0),
|
||||
mnb_used_marks(0)
|
||||
|
||||
{
|
||||
mmask_marks.reset();
|
||||
|
||||
for (size_type i=0; i<NB_MARKS; ++i)
|
||||
{
|
||||
mfree_marks_stack[i] =i;
|
||||
mindex_marks[i] =i;
|
||||
mnb_marked_darts[i] =0;
|
||||
mnb_times_reserved_marks[i]=0;
|
||||
}
|
||||
|
||||
// Store locally the number of darts: the HEG must not be modified
|
||||
m_nb_darts=darts().size();
|
||||
|
||||
m_all_marks=get(CGAL::dynamic_halfedge_property_t<std::bitset<NB_MARKS> >(), m_fg);
|
||||
for (typename Dart_range::const_iterator it(darts().begin()),
|
||||
itend(darts().end()); it!=itend; ++it)
|
||||
{ put(m_all_marks, it, std::bitset<NB_MARKS>()); }
|
||||
}
|
||||
|
||||
const HEG& get_fg() const
|
||||
{ return m_fg; }
|
||||
|
||||
template<unsigned int i>
|
||||
bool is_free(Dart_const_handle /* dh */) const
|
||||
{ return false; } // Not possible to have a free dart with an HEG.
|
||||
bool is_free(Dart_const_handle /*dh*/, unsigned int /*i*/) const
|
||||
{ return false; } // Not possible to have a free dart with an HEG.
|
||||
|
||||
bool is_perforated(Dart_const_handle dh) const
|
||||
{ return is_border(dh, m_fg); }
|
||||
|
||||
Dart_const_handle get_beta(Dart_const_handle ADart, int B1) const
|
||||
{
|
||||
CGAL_assertion(B1>=0 && B1<=static_cast<int>(dimension));
|
||||
if (B1==1) return Get_beta<HEG, 1>::value(m_fg, ADart);
|
||||
if (B1==2) return Get_beta<HEG, 2>::value(m_fg, ADart);
|
||||
return Get_beta<HEG, 0>::value(m_fg, ADart);
|
||||
}
|
||||
template<int B1>
|
||||
Dart_const_handle get_beta(Dart_const_handle ADart) const
|
||||
{
|
||||
CGAL_assertion(B1>=0 && B1<=static_cast<int>(dimension));
|
||||
return Get_beta<HEG, B1>::value(m_fg, ADart);
|
||||
}
|
||||
|
||||
bool is_empty() const
|
||||
{ return number_of_darts()==0; }
|
||||
|
||||
/* ?? bool is_dart_used(Dart_const_handle dh) const
|
||||
{ return true; ?? } */
|
||||
|
||||
int highest_nonfree_dimension(Dart_const_handle /* dh */) const
|
||||
{ return 2; }
|
||||
|
||||
Dart_const_handle previous(Dart_const_handle ADart) const
|
||||
{ return get_beta<0>(ADart); }
|
||||
Dart_const_handle next(Dart_const_handle ADart) const
|
||||
{ return get_beta<1>(ADart); }
|
||||
Dart_const_handle opposite(Dart_const_handle dh) const
|
||||
{ return get_beta<2>(dh); }
|
||||
Dart_const_handle opposite2(Dart_const_handle dh) const
|
||||
{ return get_beta<2>(dh); }
|
||||
Dart_const_handle other_extremity(Dart_const_handle dh) const
|
||||
{ return get_beta<1>(dh); }
|
||||
|
||||
template<unsigned int dim>
|
||||
Dart_const_handle opposite(Dart_const_handle ADart) const
|
||||
{ return this->template get_beta<dim>(ADart); }
|
||||
Dart_const_handle other_orientation(Dart_const_handle ADart) const
|
||||
{ return ADart; }
|
||||
|
||||
bool is_previous_exist(Dart_const_handle) const
|
||||
{ return true; }
|
||||
bool is_next_exist(Dart_const_handle) const
|
||||
{ return true; }
|
||||
template<unsigned int dim>
|
||||
bool is_opposite_exist(Dart_const_handle /* ADart */) const
|
||||
{ return true; }
|
||||
|
||||
template<typename ...Betas>
|
||||
Dart_handle beta(Dart_handle ADart, Betas... betas)
|
||||
{ return CGAL::internal::Beta_functor<Self, Dart_handle, Betas...>::
|
||||
run(*this, ADart, betas...); }
|
||||
template<typename ...Betas>
|
||||
Dart_const_handle beta(Dart_const_handle ADart, Betas... betas) const
|
||||
{ return CGAL::internal::Beta_functor<const Self, Dart_const_handle, Betas...>::
|
||||
run(*this, ADart, betas...); }
|
||||
template<int... Betas>
|
||||
Dart_handle beta(Dart_handle ADart)
|
||||
{ return CGAL::internal::Beta_functor_static<Self, Dart_handle, Betas...>::
|
||||
run(*this, ADart); }
|
||||
template<int... Betas>
|
||||
Dart_const_handle beta(Dart_const_handle ADart) const
|
||||
{ return CGAL::internal::Beta_functor_static<const Self, Dart_const_handle, Betas...>::
|
||||
run(*this, ADart); }
|
||||
|
||||
size_type number_of_darts() const
|
||||
{ return m_nb_darts; }
|
||||
|
||||
size_type number_of_halfedges() const
|
||||
{ return number_of_darts(); }
|
||||
|
||||
size_type number_of_used_marks() const
|
||||
{ return mnb_used_marks; }
|
||||
|
||||
bool is_reserved(size_type amark) const
|
||||
{
|
||||
CGAL_assertion(amark<NB_MARKS);
|
||||
return (mnb_times_reserved_marks[amark]!=0);
|
||||
}
|
||||
|
||||
size_type number_of_marked_darts(size_type amark) const
|
||||
{
|
||||
CGAL_assertion( is_reserved(amark) );
|
||||
return mnb_marked_darts[amark];
|
||||
}
|
||||
|
||||
size_type number_of_unmarked_darts(size_type amark) const
|
||||
{
|
||||
CGAL_assertion( is_reserved(amark) );
|
||||
return number_of_darts() - number_of_marked_darts(amark);
|
||||
}
|
||||
|
||||
bool is_whole_map_unmarked(size_type amark) const
|
||||
{ return number_of_marked_darts(amark)==0; }
|
||||
|
||||
bool is_whole_map_marked(size_type amark) const
|
||||
{ return number_of_marked_darts(amark)==number_of_darts(); }
|
||||
|
||||
class Exception_no_more_available_mark {};
|
||||
|
||||
size_type get_new_mark() const
|
||||
{
|
||||
if (mnb_used_marks==NB_MARKS)
|
||||
{
|
||||
std::cerr << "Not enough Boolean marks: "
|
||||
"increase NB_MARKS in item class." << std::endl;
|
||||
std::cerr << " (exception launched)" << std::endl;
|
||||
throw Exception_no_more_available_mark();
|
||||
}
|
||||
|
||||
size_type m=mfree_marks_stack[mnb_used_marks];
|
||||
mused_marks_stack[mnb_used_marks]=m;
|
||||
|
||||
mindex_marks[m]=mnb_used_marks;
|
||||
mnb_times_reserved_marks[m]=1;
|
||||
|
||||
++mnb_used_marks;
|
||||
CGAL_assertion(is_whole_map_unmarked(m));
|
||||
|
||||
return m;
|
||||
}
|
||||
|
||||
void share_a_mark(size_type amark) const
|
||||
{
|
||||
CGAL_assertion( is_reserved(amark) );
|
||||
++mnb_times_reserved_marks[amark];
|
||||
}
|
||||
|
||||
size_type get_number_of_times_mark_reserved(size_type amark) const
|
||||
{
|
||||
CGAL_assertion( amark<NB_MARKS );
|
||||
return mnb_times_reserved_marks[amark];
|
||||
}
|
||||
|
||||
void negate_mark(size_type amark) const
|
||||
{
|
||||
CGAL_assertion(is_reserved(amark));
|
||||
|
||||
mnb_marked_darts[amark]=number_of_darts()-mnb_marked_darts[amark];
|
||||
mmask_marks.flip(amark);
|
||||
}
|
||||
|
||||
void mark_null_dart( size_type /*amark*/) const
|
||||
{}
|
||||
|
||||
bool get_dart_mark(Dart_const_handle ADart, size_type amark) const
|
||||
{
|
||||
return get(m_all_marks, ADart)[amark];
|
||||
}
|
||||
void set_dart_mark(Dart_const_handle ADart, size_type amark, bool avalue) const
|
||||
{
|
||||
const_cast<std::bitset<NB_MARKS>& >(get(m_all_marks, ADart)).set(amark, avalue);
|
||||
}
|
||||
|
||||
void flip_dart_mark(Dart_const_handle ADart, size_type amark) const
|
||||
{ set_dart_mark(ADart, amark, !get_dart_mark(ADart, amark)); }
|
||||
|
||||
bool is_marked(Dart_const_handle adart, size_type amark) const
|
||||
{
|
||||
CGAL_assertion(is_reserved(amark));
|
||||
return get_dart_mark(adart, amark)!=mmask_marks[amark];
|
||||
}
|
||||
|
||||
void set_mark_to(Dart_const_handle adart, size_type amark,
|
||||
bool astate) const
|
||||
{
|
||||
CGAL_assertion(is_reserved(amark));
|
||||
|
||||
if (is_marked(adart, amark)!=astate)
|
||||
{
|
||||
if (astate) ++mnb_marked_darts[amark];
|
||||
else --mnb_marked_darts[amark];
|
||||
|
||||
flip_dart_mark(adart, amark);
|
||||
}
|
||||
}
|
||||
|
||||
void mark(Dart_const_handle adart, size_type amark) const
|
||||
{
|
||||
CGAL_assertion(is_reserved(amark));
|
||||
|
||||
if (is_marked(adart, amark)) return;
|
||||
|
||||
++mnb_marked_darts[amark];
|
||||
flip_dart_mark(adart, amark);
|
||||
}
|
||||
|
||||
void unmark(Dart_const_handle adart, size_type amark) const
|
||||
{
|
||||
CGAL_assertion( adart!=this->null_dart_handle );
|
||||
CGAL_assertion( is_reserved(amark) );
|
||||
|
||||
if (!is_marked(adart, amark)) return;
|
||||
|
||||
--mnb_marked_darts[amark];
|
||||
flip_dart_mark(adart, amark);
|
||||
}
|
||||
|
||||
void unmark_all(size_type amark) const
|
||||
{
|
||||
CGAL_assertion( is_reserved(amark) );
|
||||
|
||||
if ( is_whole_map_marked(amark) )
|
||||
{
|
||||
negate_mark(amark);
|
||||
}
|
||||
else if ( !is_whole_map_unmarked(amark) )
|
||||
{
|
||||
for (typename Dart_range::const_iterator it(darts().begin()),
|
||||
itend(darts().end()); it!=itend; ++it)
|
||||
unmark(*it, amark);
|
||||
}
|
||||
CGAL_assertion(is_whole_map_unmarked(amark));
|
||||
}
|
||||
|
||||
void free_mark(size_type amark) const
|
||||
{
|
||||
CGAL_assertion( is_reserved(amark) );
|
||||
|
||||
if ( mnb_times_reserved_marks[amark]>1 )
|
||||
{
|
||||
--mnb_times_reserved_marks[amark];
|
||||
return;
|
||||
}
|
||||
|
||||
unmark_all(amark);
|
||||
|
||||
// 1) We remove amark from the array mused_marks_stack by
|
||||
// replacing it with the last mark in this array.
|
||||
mused_marks_stack[mindex_marks[amark]] =
|
||||
mused_marks_stack[--mnb_used_marks];
|
||||
mindex_marks[mused_marks_stack[mnb_used_marks]] =
|
||||
mindex_marks[amark];
|
||||
|
||||
// 2) We add amark in the array mfree_marks_stack and update its index.
|
||||
mfree_marks_stack[ mnb_used_marks ]=amark;
|
||||
mindex_marks[amark] = mnb_used_marks;
|
||||
|
||||
mnb_times_reserved_marks[amark]=0;
|
||||
}
|
||||
|
||||
bool is_without_boundary(unsigned int i) const
|
||||
{
|
||||
CGAL_assertion(1<=i && i<=dimension);
|
||||
if (i==1) return true;
|
||||
|
||||
for ( typename Dart_range::const_iterator it(darts().begin()),
|
||||
itend(darts().end()); it!=itend; ++it)
|
||||
{ if (is_perforated(it)) return false; }
|
||||
return true;
|
||||
}
|
||||
|
||||
bool is_without_boundary() const
|
||||
{ return is_without_boundary(2); }
|
||||
|
||||
//**************************************************************************
|
||||
// Dart_of_cell_range
|
||||
template<unsigned int i>
|
||||
struct Dart_of_cell_range
|
||||
{
|
||||
typedef CGAL::FGW_cell_iterator<Self, i> iterator;
|
||||
typedef CGAL::FGW_cell_iterator<Self, i> const_iterator;
|
||||
Dart_of_cell_range(const Self &amap, Dart_handle adart) : mmap(amap),
|
||||
m_initdart(adart),
|
||||
msize(0)
|
||||
{}
|
||||
const_iterator begin() const { return const_iterator(mmap, m_initdart); }
|
||||
const_iterator end() const { return const_iterator(mmap, m_initdart, mmap.null_handle); }
|
||||
size_type size() const
|
||||
{
|
||||
if (msize==0)
|
||||
{
|
||||
for (const_iterator it=begin(), itend=end(); it!=itend; ++it)
|
||||
{ ++msize; }
|
||||
}
|
||||
return msize;
|
||||
}
|
||||
|
||||
bool empty() const
|
||||
{ return mmap.is_empty(); }
|
||||
private:
|
||||
const Self & mmap;
|
||||
Dart_handle m_initdart;
|
||||
mutable typename Self::size_type msize;
|
||||
};
|
||||
//**************************************************************************
|
||||
// Dart_of_cell_const_range
|
||||
/* template<unsigned int i,int dim=Self::dimension>
|
||||
struct Dart_of_cell_const_range // TODO REMOVE ??
|
||||
{}; */
|
||||
//--------------------------------------------------------------------------
|
||||
template<unsigned int i>
|
||||
Dart_of_cell_range<i> darts_of_cell(Dart_handle adart)
|
||||
{ return Dart_of_cell_range<i>(*this,adart); }
|
||||
//--------------------------------------------------------------------------
|
||||
template<unsigned int i>
|
||||
Dart_of_cell_range<i> darts_of_cell(Dart_const_handle adart) const
|
||||
{ return Dart_of_cell_range<i>(*this,adart); } // Before it was Dart_of_cell_const_range<i>
|
||||
//**************************************************************************
|
||||
// Dart_range
|
||||
struct Dart_range {
|
||||
typedef CGAL::FGW_dart_iterator_basic_of_all<Self> iterator;
|
||||
typedef CGAL::FGW_dart_iterator_basic_of_all<Self> const_iterator;
|
||||
Dart_range(const Self &amap) : mmap(amap), msize(0)
|
||||
{}
|
||||
iterator begin() { return iterator(mmap); }
|
||||
iterator end() { return iterator(mmap,mmap.null_handle); }
|
||||
const_iterator begin() const { return const_iterator(mmap); }
|
||||
const_iterator end() const { return const_iterator(mmap,mmap.null_handle); }
|
||||
size_type size() const
|
||||
{
|
||||
if (msize==0)
|
||||
{ msize=halfedges(mmap.get_fg()).size(); }
|
||||
return msize;
|
||||
}
|
||||
bool empty() const
|
||||
{ return mmap.is_empty(); }
|
||||
|
||||
size_type capacity() const
|
||||
{ return num_halfedges(mmap.get_fg()); }
|
||||
|
||||
bool is_used(size_type i) const
|
||||
{
|
||||
for (typename boost::template graph_traits<typename Self::HEG>::halfedge_iterator
|
||||
it=halfedges(mmap.get_fg()).begin(),
|
||||
itend=halfedges(mmap.get_fg()).end(); it!=itend; ++it)
|
||||
{
|
||||
if (i==0) { return !is_border(*it, mmap.get_fg()); }
|
||||
--i;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private:
|
||||
const Self & mmap;
|
||||
mutable typename Self::size_type msize;
|
||||
};
|
||||
//**************************************************************************
|
||||
// Dart_const_range // TODO REMOVE ?
|
||||
/* struct Dart_const_range {
|
||||
typedef CGAL::FGW_dart_iterator_basic_of_all<Self, true> const_iterator;
|
||||
Dart_const_range(const Self &amap) : mmap(amap), msize(0)
|
||||
{}
|
||||
const_iterator begin() const { return const_iterator(mmap); }
|
||||
const_iterator end() const { return const_iterator(mmap,mmap.null_handle); }
|
||||
size_type size() const
|
||||
{
|
||||
if (msize==0)
|
||||
{
|
||||
for (const_iterator it=begin(), itend=end(); it!=itend; ++it)
|
||||
{ ++msize; }
|
||||
}
|
||||
return msize;
|
||||
}
|
||||
|
||||
bool empty() const
|
||||
{ return mmap.is_empty(); }
|
||||
private:
|
||||
const Self & mmap;
|
||||
mutable typename Self::size_type msize;
|
||||
};*/
|
||||
//**************************************************************************
|
||||
Dart_range& darts()
|
||||
{ return mdarts; }
|
||||
//--------------------------------------------------------------------------
|
||||
const Dart_range& darts() const
|
||||
{ return mdarts; } // Before it was Dart_const_range(*this)
|
||||
//**************************************************************************
|
||||
Dart_handle dart_handle(size_type i)
|
||||
{
|
||||
CGAL_assertion(darts().is_used(i));
|
||||
for (typename boost::template graph_traits<typename Self::HEG>::halfedge_iterator
|
||||
it=halfedges(get_fg()).begin(),
|
||||
itend=halfedges(get_fg()).end(); it!=itend; ++it)
|
||||
{
|
||||
if (i==0) { return *it; }
|
||||
--i;
|
||||
}
|
||||
CGAL_assertion(false);
|
||||
return Dart_handle();
|
||||
}
|
||||
Dart_const_handle dart_handle(size_type i) const
|
||||
{
|
||||
CGAL_assertion(darts().is_used(i));
|
||||
for (typename boost::template graph_traits<typename Self::HEG>::halfedge_iterator
|
||||
it=halfedges(get_fg()).begin(),
|
||||
itend=halfedges(get_fg()).end(); it!=itend; ++it)
|
||||
{
|
||||
if (i==0) { return *it; }
|
||||
--i;
|
||||
}
|
||||
CGAL_assertion(false);
|
||||
return Dart_const_handle();
|
||||
}
|
||||
|
||||
template <unsigned int i>
|
||||
bool belong_to_same_cell(Dart_const_handle adart1,
|
||||
Dart_const_handle adart2) const
|
||||
{
|
||||
for (typename Dart_of_cell_range<i>::iterator it=darts_of_cell<i>(adart1).begin(),
|
||||
itend=darts_of_cell<i>(adart1).end(); it!=itend; ++it)
|
||||
{ if (*it==adart2) { return true; } }
|
||||
return false;
|
||||
}
|
||||
|
||||
template <unsigned int i>
|
||||
bool is_whole_cell_unmarked(Dart_const_handle adart, size_type amark) const
|
||||
{
|
||||
for (typename Dart_of_cell_range<i>::iterator it=darts_of_cell<i>(adart).begin(),
|
||||
itend=darts_of_cell<i>(adart).end(); it!=itend; ++it)
|
||||
{ if (is_marked(*it, amark)) { return false; } }
|
||||
return true;
|
||||
}
|
||||
|
||||
template <unsigned int i>
|
||||
bool is_whole_cell_marked(Dart_const_handle adart, size_type amark) const
|
||||
{
|
||||
for (typename Dart_of_cell_range<i>::iterator it=darts_of_cell<i>(adart).begin(),
|
||||
itend=darts_of_cell<i>(adart).end(); it!=itend; ++it)
|
||||
{ if (!is_marked(*it, amark)) { return false; } }
|
||||
return true;
|
||||
}
|
||||
|
||||
template <unsigned int i>
|
||||
size_type mark_cell(Dart_const_handle adart, size_type amark) const
|
||||
{
|
||||
size_type res=0;
|
||||
for (typename Dart_of_cell_range<i>::iterator it=darts_of_cell<i>(adart).begin(),
|
||||
itend=darts_of_cell<i>(adart).end(); it!=itend; ++it)
|
||||
{ mark(*it, amark); ++res; }
|
||||
return res;
|
||||
}
|
||||
|
||||
size_type mark_cell(Dart_const_handle adart, unsigned int i, size_type amark) const
|
||||
{
|
||||
if (i==0) { return mark_cell<0>(adart, amark); }
|
||||
else if (i==1) { return mark_cell<1>(adart, amark); }
|
||||
else if (i==2) { return mark_cell<2>(adart, amark); }
|
||||
return mark_cell<3>(adart, amark);
|
||||
}
|
||||
|
||||
template <unsigned int i>
|
||||
size_type unmark_cell(Dart_const_handle adart, size_type amark) const
|
||||
{
|
||||
size_type res=0;
|
||||
for (typename Dart_of_cell_range<i>::iterator it=darts_of_cell<i>(adart).begin(),
|
||||
itend=darts_of_cell<i>(adart).end(); it!=itend; ++it)
|
||||
{ unmark(*it, amark); ++res; }
|
||||
return res;
|
||||
}
|
||||
|
||||
std::vector<unsigned int>
|
||||
count_marked_cells(size_type amark, const std::vector<unsigned int>& acells) const
|
||||
{
|
||||
std::vector<unsigned int> res(dimension+2);
|
||||
std::vector<size_type> marks(dimension+2);
|
||||
|
||||
// Initialization of the result
|
||||
for (unsigned int i=0; i<dimension+2; ++i)
|
||||
{
|
||||
res[i]=0;
|
||||
marks[i]=INVALID_MARK;
|
||||
}
|
||||
|
||||
// Mark reservation
|
||||
for (unsigned int i=0; i<acells.size(); ++i)
|
||||
{
|
||||
CGAL_assertion(acells[i]<=dimension+1);
|
||||
if (marks[acells[i]]==INVALID_MARK )
|
||||
{
|
||||
marks[acells[i]]=get_new_mark();
|
||||
assert(is_whole_map_unmarked(marks[acells[i]]));
|
||||
}
|
||||
}
|
||||
|
||||
// Counting and marking cells
|
||||
for (typename Dart_range::const_iterator it(darts().begin()),
|
||||
itend(darts().end()); it!=itend; ++it)
|
||||
{
|
||||
if (is_marked(*it, amark))
|
||||
{
|
||||
for (unsigned int i=0; i<acells.size(); ++i)
|
||||
{
|
||||
if (!is_marked(*it, marks[acells[i]]))
|
||||
{
|
||||
mark_cell(*it, acells[i], marks[acells[i]]);
|
||||
++res[acells[i]];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Unmarking darts
|
||||
std::vector<size_type> tounmark;
|
||||
for (unsigned int i=0; i<acells.size(); ++i)
|
||||
{
|
||||
if (is_whole_map_marked(marks[acells[i]]) ||
|
||||
is_whole_map_unmarked(marks[acells[i]]))
|
||||
{ free_mark(marks[acells[i]]); }
|
||||
else
|
||||
{ tounmark.push_back(marks[acells[i]]); }
|
||||
}
|
||||
|
||||
if (tounmark.size()>0)
|
||||
{
|
||||
for (typename Dart_range::const_iterator it(darts().begin()),
|
||||
itend(darts().end()); it!=itend; ++it)
|
||||
{
|
||||
for (unsigned int i=0; i<tounmark.size(); ++i)
|
||||
{ unmark(*it, tounmark[i]); }
|
||||
}
|
||||
for (unsigned int i=0; i<tounmark.size(); ++i)
|
||||
{
|
||||
CGAL_assertion(is_whole_map_unmarked(tounmark[i]));
|
||||
free_mark(tounmark[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
std::vector<unsigned int>
|
||||
count_cells(const std::vector<unsigned int>& acells) const
|
||||
{
|
||||
std::vector<unsigned int> res;
|
||||
size_type m=get_new_mark();
|
||||
negate_mark(m); // We mark all the cells.
|
||||
|
||||
res=count_marked_cells(m, acells);
|
||||
|
||||
negate_mark(m); // We unmark the cells
|
||||
free_mark(m);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
std::vector<unsigned int> count_all_cells() const
|
||||
{
|
||||
std::vector<unsigned int> dim(dimension+2);
|
||||
|
||||
for ( unsigned int i=0; i<=dimension+1; ++i)
|
||||
{ dim[i]=i; }
|
||||
|
||||
return count_cells(dim);
|
||||
}
|
||||
|
||||
std::ostream& display_characteristics(std::ostream & os) const
|
||||
{
|
||||
std::vector<unsigned int> cells(dimension+2);
|
||||
for ( unsigned int i=0; i<=dimension+1; ++i)
|
||||
{ cells[i]=i; }
|
||||
|
||||
std::vector<unsigned int> res=count_cells(cells);
|
||||
|
||||
os<<"#Darts="<<number_of_darts();
|
||||
for (unsigned int i=0; i<=dimension; ++i)
|
||||
os<<", #"<<i<<"-cells="<<res[i];
|
||||
os<<", #ccs="<<res[dimension+1];
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
protected:
|
||||
const HEG& m_fg;
|
||||
Dart_range mdarts;
|
||||
std::size_t m_nb_darts;
|
||||
|
||||
/// Number of times each mark is reserved. 0 if the mark is free.
|
||||
mutable size_type mnb_times_reserved_marks[NB_MARKS];
|
||||
|
||||
/// Mask marks to know the value of unmark dart, for each index i.
|
||||
mutable std::bitset<NB_MARKS> mmask_marks;
|
||||
|
||||
/// Number of used marks.
|
||||
mutable size_type mnb_used_marks;
|
||||
|
||||
/// Index of each mark, in mfree_marks_stack or in mfree_marks_stack.
|
||||
mutable size_type mindex_marks[NB_MARKS];
|
||||
|
||||
/// "Stack" of free marks.
|
||||
mutable size_type mfree_marks_stack[NB_MARKS];
|
||||
|
||||
/// "Stack" of used marks.
|
||||
mutable size_type mused_marks_stack[NB_MARKS];
|
||||
|
||||
/// Number of marked darts for each used marks.
|
||||
mutable size_type mnb_marked_darts[NB_MARKS];
|
||||
|
||||
/// Array of property maps; one for each reserved mark.
|
||||
typedef typename boost::property_map
|
||||
<HEG, CGAL::dynamic_halfedge_property_t<std::bitset<NB_MARKS> > >::const_type MarkPMap;
|
||||
mutable MarkPMap m_all_marks;
|
||||
};
|
||||
|
||||
/// null_handle
|
||||
// template <typename HEG>
|
||||
// const typename Face_graph_wrapper<HEG>::Null_handle_type
|
||||
// Face_graph_wrapper<HEG>::null_handle=nullptr;
|
||||
template <typename HEG>
|
||||
const typename Face_graph_wrapper<HEG>::Null_handle_type
|
||||
Face_graph_wrapper<HEG>::null_handle=typename Face_graph_wrapper<HEG>::Dart_handle();
|
||||
|
||||
/// null_dart_handle
|
||||
// template <typename HEG>
|
||||
// const typename Face_graph_wrapper<HEG>::Null_handle_type
|
||||
// Face_graph_wrapper<HEG>::null_dart_handle=nullptr;
|
||||
template <typename HEG>
|
||||
const typename Face_graph_wrapper<HEG>::Null_handle_type
|
||||
Face_graph_wrapper<HEG>::null_dart_handle=typename Face_graph_wrapper<HEG>::Dart_handle();
|
||||
|
||||
template<class Base, class HEG>
|
||||
struct Get_map
|
||||
{
|
||||
typedef Face_graph_wrapper<HEG> type;
|
||||
typedef const Face_graph_wrapper<HEG> storage_type;
|
||||
Get_map(const HEG& heg): m_map(heg) {}
|
||||
static const HEG& get_mesh(const storage_type& amap)
|
||||
{ return amap.get_fg(); }
|
||||
|
||||
storage_type m_map;
|
||||
};
|
||||
|
||||
template <unsigned int d, typename Refs, typename Items, typename Alloc,
|
||||
typename Storage, class Map>
|
||||
struct Get_map<CGAL::Combinatorial_map_base<d, Refs, Items, Alloc, Storage>, Map>
|
||||
{
|
||||
typedef Map type;
|
||||
typedef const Map& storage_type;
|
||||
Get_map(const Map& heg): m_map(heg) {}
|
||||
static const Map& get_mesh(storage_type& amap)
|
||||
{ return amap; }
|
||||
storage_type m_map;
|
||||
};
|
||||
|
||||
template <unsigned int d, typename Refs, typename Items, typename Alloc,
|
||||
typename Storage, class Map>
|
||||
struct Get_map<CGAL::Generalized_map_base<d, Refs, Items, Alloc, Storage>, Map>
|
||||
{
|
||||
typedef Map type;
|
||||
typedef const Map& storage_type;
|
||||
Get_map(const Map& heg): m_map(heg) {}
|
||||
static const Map& get_mesh(storage_type& amap)
|
||||
{ return amap; }
|
||||
storage_type m_map;
|
||||
};
|
||||
|
||||
template <unsigned int d, unsigned int d2, typename Traits, typename Items,
|
||||
typename Alloc,
|
||||
template<unsigned int,class,class,class,class>
|
||||
class Map, typename Refs, typename Storage, class LCC>
|
||||
struct Get_map<CGAL::Linear_cell_complex_base<d, d2, Traits, Items, Alloc,
|
||||
Map, Refs, Storage>, LCC>
|
||||
{
|
||||
typedef LCC type;
|
||||
typedef const LCC& storage_type;
|
||||
Get_map(const LCC& heg): m_map(heg) {}
|
||||
static const LCC& get_mesh(storage_type& amap)
|
||||
{ return amap; }
|
||||
storage_type m_map;
|
||||
};
|
||||
|
||||
template <unsigned int d, typename Items, typename Alloc,
|
||||
typename Storage, class Map>
|
||||
struct Get_map<CGAL::Combinatorial_map<d, Items, Alloc, Storage>, Map>
|
||||
{
|
||||
typedef Map type;
|
||||
typedef const Map& storage_type;
|
||||
Get_map(const Map& heg): m_map(heg) {}
|
||||
static const Map& get_mesh(storage_type& amap)
|
||||
{ return amap; }
|
||||
storage_type m_map;
|
||||
};
|
||||
|
||||
template <typename Items, typename Alloc, typename Storage, class Map>
|
||||
struct Get_map<CGAL::Surface_mesh_topology::
|
||||
Polygonal_schema_with_combinatorial_map<Items, Alloc, Storage>, Map>
|
||||
{
|
||||
typedef Map type;
|
||||
typedef const Map& storage_type;
|
||||
Get_map(const Map& heg): m_map(heg) {}
|
||||
static const Map& get_mesh(storage_type& amap)
|
||||
{ return amap; }
|
||||
storage_type m_map;
|
||||
};
|
||||
|
||||
template <unsigned int d, typename Items, typename Alloc,
|
||||
typename Storage, class Map>
|
||||
struct Get_map<CGAL::Generalized_map<d, Items, Alloc, Storage>, Map>
|
||||
{
|
||||
typedef Map type;
|
||||
typedef const Map& storage_type;
|
||||
Get_map(const Map& heg): m_map(heg) {}
|
||||
static const Map& get_mesh(storage_type& amap)
|
||||
{ return amap; }
|
||||
storage_type m_map;
|
||||
};
|
||||
|
||||
template <typename Items, typename Alloc, typename Storage, class Map>
|
||||
struct Get_map<CGAL::Surface_mesh_topology::
|
||||
Polygonal_schema_with_generalized_map<Items, Alloc, Storage>, Map>
|
||||
{
|
||||
typedef Map type;
|
||||
typedef const Map& storage_type;
|
||||
Get_map(const Map& heg): m_map(heg) {}
|
||||
static const Map& get_mesh(storage_type& amap)
|
||||
{ return amap; }
|
||||
storage_type m_map;
|
||||
};
|
||||
|
||||
template <unsigned int d, unsigned int d2, typename Traits, typename Items,
|
||||
typename Alloc,
|
||||
template<unsigned int,class,class,class,class>
|
||||
class Map, typename Storage, class LCC>
|
||||
struct Get_map<CGAL::Linear_cell_complex_for_combinatorial_map
|
||||
<d, d2, Traits, Items, Alloc, Map, Storage>, LCC>
|
||||
{
|
||||
typedef LCC type;
|
||||
typedef const LCC& storage_type;
|
||||
Get_map(const LCC& heg): m_map(heg) {}
|
||||
static const LCC& get_mesh(storage_type& amap)
|
||||
{ return amap; }
|
||||
storage_type m_map;
|
||||
};
|
||||
|
||||
template <unsigned int d, unsigned int d2, typename Traits, typename Items,
|
||||
typename Alloc,
|
||||
template<unsigned int,class,class,class,class>
|
||||
class Map, typename Storage, class LCC>
|
||||
struct Get_map<CGAL::Linear_cell_complex_for_generalized_map
|
||||
<d, d2, Traits, Items, Alloc, Map, Storage>, LCC>
|
||||
{
|
||||
typedef LCC type;
|
||||
typedef const LCC& storage_type;
|
||||
Get_map(const LCC& heg): m_map(heg) {}
|
||||
static const LCC& get_mesh(storage_type& amap)
|
||||
{ return amap; }
|
||||
storage_type m_map;
|
||||
};
|
||||
|
||||
template<class Mesh_>
|
||||
struct Get_traits
|
||||
{
|
||||
typedef Mesh_ Mesh;
|
||||
typedef typename Mesh::Traits Kernel;
|
||||
typedef typename Mesh::Point Point;
|
||||
typedef typename Mesh::Vector Vector;
|
||||
|
||||
template<class Dart_handle>
|
||||
static const Point& get_point(const Mesh& m, Dart_handle dh)
|
||||
{ return m.point(dh); }
|
||||
};
|
||||
|
||||
template<class P>
|
||||
struct Get_traits<CGAL::Surface_mesh<P> >
|
||||
{
|
||||
typedef CGAL::Surface_mesh<P> Mesh;
|
||||
typedef typename CGAL::Kernel_traits<P>::Kernel Kernel;
|
||||
typedef typename Kernel::Point_3 Point;
|
||||
typedef typename Kernel::Vector_3 Vector;
|
||||
|
||||
template<class Dart_handle>
|
||||
static const Point& get_point(const Mesh& m, Dart_handle dh)
|
||||
{ return m.point(m.source(dh)); }
|
||||
};
|
||||
|
||||
template<class PolyhedronTraits_3,
|
||||
class PolyhedronItems_3,
|
||||
template<class T, class I, class A> class T_HDS,
|
||||
class Alloc>
|
||||
struct Get_traits<CGAL::Polyhedron_3<PolyhedronTraits_3,
|
||||
PolyhedronItems_3, T_HDS, Alloc> >
|
||||
{
|
||||
typedef CGAL::Polyhedron_3<PolyhedronTraits_3, PolyhedronItems_3,
|
||||
T_HDS, Alloc> Mesh;
|
||||
typedef PolyhedronTraits_3 Kernel;
|
||||
typedef typename Kernel::Point_3 Point;
|
||||
typedef typename Kernel::Vector_3 Vector;
|
||||
|
||||
template<class Dart_handle>
|
||||
static const Point& get_point(const Mesh& /*m*/, Dart_handle dh)
|
||||
{ return dh->opposite()->vertex()->point(); }
|
||||
};
|
||||
|
||||
} // Namespace CGAL
|
||||
|
||||
#endif // CGAL_FACE_GRAPH_WRAPPER_H //
|
||||
// EOF //
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
// Copyright (c) 2019 CNRS and LIRIS' Establishments (France).
|
||||
// All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org)
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
|
||||
//
|
||||
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
|
||||
//
|
||||
#ifndef CGAL_FUNCTORS_FOR_FACE_GRAPH_WRAPPER_H
|
||||
#define CGAL_FUNCTORS_FOR_FACE_GRAPH_WRAPPER_H 1
|
||||
|
||||
#include <boost/graph/graph_traits.hpp>
|
||||
#include <CGAL/boost/graph/helpers.h>
|
||||
#include <CGAL/Iterators_for_face_graph_wrapper.h>
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/** This file contains the following functors for Face_graph_wrapper:
|
||||
* Is_free<typename HEG, unsigned int i>::
|
||||
operator() (const HEG& heg, Dart_const_handle dh)
|
||||
* Get_beta<typename HEG, unsigned int i>::
|
||||
operator() (const HEG& heg, Dart_const_handle dh)
|
||||
*/
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
namespace CGAL
|
||||
{
|
||||
/// Is_free
|
||||
//template<typename HEG, unsigned int i>
|
||||
//struct Is_free
|
||||
//{
|
||||
// typedef typename boost::graph_traits<HEG>::halfedge_descriptor Dart_const_handle;
|
||||
|
||||
// static bool value(const HEG& /*heg*/, Dart_const_handle /*dh*/)
|
||||
// { CGAL_static_assertion(i==0 || i==1); return false; }
|
||||
//};
|
||||
//template<typename HEG>
|
||||
//struct Is_free<HEG, 2>
|
||||
//{
|
||||
// typedef typename boost::graph_traits<HEG>::halfedge_descriptor Dart_const_handle;
|
||||
// static bool value(const HEG& heg, Dart_const_handle dh)
|
||||
// { return is_border(opposite(dh, heg), heg); }
|
||||
//};
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// Get_beta
|
||||
template<typename HEG, unsigned int i>
|
||||
struct Get_beta
|
||||
{
|
||||
typedef typename boost::graph_traits<HEG>::halfedge_descriptor Dart_const_handle;
|
||||
|
||||
static Dart_const_handle value(const HEG& /*heg*/, Dart_const_handle /*dh*/)
|
||||
{ /* CGAL_static_assertion(false);*/
|
||||
std::cout<<"ERROR Get_beta<HEG, "<<i<<">"<<std::endl;
|
||||
CGAL_assertion(false);
|
||||
return nullptr;
|
||||
}
|
||||
};
|
||||
template<typename HEG>
|
||||
struct Get_beta<HEG, 0>
|
||||
{
|
||||
typedef typename boost::graph_traits<HEG>::halfedge_descriptor Dart_const_handle;
|
||||
static Dart_const_handle value(const HEG& heg, Dart_const_handle dh)
|
||||
{ return prev(dh, heg); }
|
||||
};
|
||||
template<typename HEG>
|
||||
struct Get_beta<HEG, 1>
|
||||
{
|
||||
typedef typename boost::graph_traits<HEG>::halfedge_descriptor Dart_const_handle;
|
||||
static Dart_const_handle value(const HEG& heg, Dart_const_handle dh)
|
||||
{ return next(dh, heg); }
|
||||
};
|
||||
template<typename HEG>
|
||||
struct Get_beta<HEG, 2>
|
||||
{
|
||||
typedef typename boost::graph_traits<HEG>::halfedge_descriptor Dart_const_handle;
|
||||
static Dart_const_handle value(const HEG& heg, Dart_const_handle dh)
|
||||
{
|
||||
//if (Is_free<HEG, 2>::value(heg, dh)) return Dart_const_handle();
|
||||
return opposite(dh, heg);
|
||||
}
|
||||
};
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
} // namespace CGAL
|
||||
|
||||
#endif // CGAL_FUNCTORS_FOR_FACE_GRAPH_WRAPPER_H //
|
||||
// EOF //
|
||||
|
|
@ -0,0 +1,332 @@
|
|||
// Copyright (c) 2019 CNRS and LIRIS' Establishments (France).
|
||||
// All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org)
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
|
||||
//
|
||||
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
|
||||
//
|
||||
#ifndef CGAL_ITERATORS_FOR_FACE_GRAPH_WRAPPER_H
|
||||
#define CGAL_ITERATORS_FOR_FACE_GRAPH_WRAPPER_H 1
|
||||
|
||||
#include <boost/graph/graph_traits.hpp>
|
||||
#include <CGAL/boost/graph/helpers.h>
|
||||
#include <stack>
|
||||
|
||||
namespace CGAL
|
||||
{
|
||||
|
||||
//****************************************************************************
|
||||
/* Class CMap_dart_iterator_basic_of_all: to iterate onto all the
|
||||
* darts of the face graph.
|
||||
*/
|
||||
template <typename Map_,bool Const=false>
|
||||
class FGW_dart_iterator_basic_of_all
|
||||
{
|
||||
public:
|
||||
typedef FGW_dart_iterator_basic_of_all Self;
|
||||
|
||||
typedef Map_ Map;
|
||||
typedef typename Map::Dart_handle Dart_handle;
|
||||
typedef typename Map::size_type size_type;
|
||||
|
||||
public:
|
||||
/// Main constructor.
|
||||
FGW_dart_iterator_basic_of_all(const Map& amap):
|
||||
mmap(amap),
|
||||
m_it(halfedges(amap.get_fg()).begin())
|
||||
{
|
||||
/*if (m_it!=halfedges(amap.get_fg()).end() &&
|
||||
is_border(*m_it, amap.get_fg()))
|
||||
{ operator++(0); } */
|
||||
}
|
||||
|
||||
/// Constructor with a dart in parameter (for end iterator).
|
||||
FGW_dart_iterator_basic_of_all(const Map& amap, Dart_handle /*adart*/):
|
||||
mmap(amap),
|
||||
m_it(halfedges(amap.get_fg()).end())
|
||||
{}
|
||||
|
||||
FGW_dart_iterator_basic_of_all(const FGW_dart_iterator_basic_of_all& other):
|
||||
mmap(other.mmap),
|
||||
m_it(other.m_it)
|
||||
{}
|
||||
|
||||
operator Dart_handle() const
|
||||
{ return operator*(); }
|
||||
|
||||
bool operator==(const Self& other) const
|
||||
{ return &mmap==&(other.mmap) && m_it==other.m_it; }
|
||||
|
||||
bool operator!=(const Self& other) const
|
||||
{ return !(operator==(other)); }
|
||||
|
||||
/// Prefix ++ operator.
|
||||
Self& operator++()
|
||||
{
|
||||
CGAL_assertion(m_it!=halfedges(this->mmap.get_fg()).end());
|
||||
|
||||
//do
|
||||
{
|
||||
++m_it;
|
||||
}
|
||||
/*while(m_it!=halfedges(this->mmap.get_fg()).end() &&
|
||||
is_border(*m_it, this->mmap.get_fg())); */
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Postfix ++ operator.
|
||||
Self operator++(int)
|
||||
{ Self res=*this; operator ++(); return res; }
|
||||
|
||||
Dart_handle operator*() const
|
||||
{
|
||||
CGAL_assertion(m_it!=halfedges(this->mmap.get_fg()).end());
|
||||
return *m_it;
|
||||
}
|
||||
|
||||
protected:
|
||||
const Map& mmap;
|
||||
typename boost::graph_traits<typename Map_::HEG>::halfedge_iterator m_it;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
template <typename Map_>
|
||||
class FGW_basis_for_cell_iterator
|
||||
{
|
||||
public:
|
||||
typedef FGW_basis_for_cell_iterator Self;
|
||||
typedef Map_ Map;
|
||||
typedef typename Map::Dart_handle Dart_handle;
|
||||
typedef typename Map::size_type size_type;
|
||||
|
||||
/// Main constructor.
|
||||
FGW_basis_for_cell_iterator(const Map& amap, Dart_handle adart):
|
||||
mmap(amap),
|
||||
m_firstdart(adart),
|
||||
m_curdart(adart)
|
||||
{}
|
||||
|
||||
/// Constructor with two darts in parameter (for end iterator).
|
||||
FGW_basis_for_cell_iterator(const Map& amap, Dart_handle adart,
|
||||
Dart_handle /* d2 */):
|
||||
mmap(amap),
|
||||
m_firstdart(adart),
|
||||
m_curdart(Dart_handle())
|
||||
{}
|
||||
|
||||
bool operator==(const Self& other) const
|
||||
{ return &mmap==&(other.mmap) && m_firstdart==other.m_firstdart &&
|
||||
m_curdart==other.m_curdart; }
|
||||
|
||||
bool operator!=(const Self& other) const
|
||||
{ return !(this->operator==(other)); }
|
||||
|
||||
operator Dart_handle() const
|
||||
{ return operator*(); }
|
||||
|
||||
Dart_handle operator*() const
|
||||
{
|
||||
CGAL_assertion(m_curdart!=Dart_handle());
|
||||
return m_curdart;
|
||||
}
|
||||
|
||||
protected:
|
||||
const Map& mmap;
|
||||
Dart_handle m_firstdart, m_curdart;
|
||||
};
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
template<typename HEG, unsigned int i>
|
||||
class FGW_cell_iterator
|
||||
{};
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// Vertex iterator
|
||||
template<typename Map_>
|
||||
class FGW_cell_iterator<Map_, 0>: public FGW_basis_for_cell_iterator<Map_> // Vertex
|
||||
{
|
||||
public:
|
||||
typedef FGW_cell_iterator Self;
|
||||
typedef FGW_basis_for_cell_iterator<Map_> Base;
|
||||
typedef Map_ Map;
|
||||
typedef typename Map::Dart_handle Dart_handle;
|
||||
typedef typename Map::size_type size_type;
|
||||
|
||||
FGW_cell_iterator(const Map& amap, Dart_handle adart) : Base(amap, adart),
|
||||
m_second_way(false)
|
||||
{}
|
||||
|
||||
/// Constructor with two darts in parameter (for end iterator).
|
||||
FGW_cell_iterator(const Map& amap, Dart_handle adart,
|
||||
Dart_handle d2): Base(amap, adart, d2)
|
||||
{}
|
||||
|
||||
/// Prefix ++ operator.
|
||||
Self& operator++()
|
||||
{
|
||||
if (!m_second_way)
|
||||
{
|
||||
if (this->mmap.template is_free<2>(this->m_curdart))
|
||||
{
|
||||
m_second_way=true;
|
||||
this->m_curdart=this->mmap.template beta<0>(this->m_firstdart);
|
||||
if (this->mmap.template is_free<2>(this->m_curdart))
|
||||
{ this->m_curdart=Dart_handle(); }
|
||||
else { this->m_curdart=this->mmap.template beta<2>(this->m_curdart); }
|
||||
}
|
||||
else
|
||||
{
|
||||
this->m_curdart=this->mmap.template beta<2, 1>(this->m_curdart);
|
||||
if (this->m_curdart==this->m_firstdart)
|
||||
{ this->m_curdart=Dart_handle(); }
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
this->m_curdart=this->mmap.template beta<0>(this->m_curdart);
|
||||
if (this->mmap.template is_free<2>(this->m_curdart))
|
||||
{ this->m_curdart=Dart_handle(); }
|
||||
else { this->m_curdart=this->mmap.template beta<2>(this->m_curdart); }
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Postfix ++ operator.
|
||||
Self operator++(int)
|
||||
{ Self res=*this; operator ++(); return res; }
|
||||
|
||||
protected:
|
||||
/// True if we already found a border dart, and thus turn in the second way
|
||||
bool m_second_way;
|
||||
};
|
||||
template<typename Map_>
|
||||
class FGW_cell_iterator<Map_, 1>: public FGW_basis_for_cell_iterator<Map_> // Edge
|
||||
{
|
||||
public:
|
||||
typedef FGW_cell_iterator Self;
|
||||
typedef FGW_basis_for_cell_iterator<Map_> Base;
|
||||
typedef Map_ Map;
|
||||
typedef typename Map::Dart_handle Dart_handle;
|
||||
typedef typename Map::size_type size_type;
|
||||
|
||||
FGW_cell_iterator(const Map& amap, Dart_handle adart) : Base(amap, adart)
|
||||
{}
|
||||
|
||||
/// Constructor with two darts in parameter (for end iterator).
|
||||
FGW_cell_iterator(const Map& amap, Dart_handle adart,
|
||||
Dart_handle d2): Base(amap, adart, d2)
|
||||
{}
|
||||
|
||||
/// Prefix ++ operator.
|
||||
Self& operator++()
|
||||
{
|
||||
if (this->m_curdart==this->m_firstdart)
|
||||
{
|
||||
if (this->mmap.template is_free<2>(this->m_curdart))
|
||||
{ this->m_curdart=Dart_handle(); }
|
||||
else { this->m_curdart=this->mmap.template beta<2>(this->m_curdart); }
|
||||
}
|
||||
else
|
||||
{ this->m_curdart=Dart_handle(); }
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Postfix ++ operator.
|
||||
Self operator++(int)
|
||||
{ Self res=*this; operator ++(); return res; }
|
||||
};
|
||||
template<typename Map_>
|
||||
class FGW_cell_iterator<Map_, 2>: public FGW_basis_for_cell_iterator<Map_> // Face
|
||||
{
|
||||
public:
|
||||
typedef FGW_cell_iterator Self;
|
||||
typedef FGW_basis_for_cell_iterator<Map_> Base;
|
||||
typedef Map_ Map;
|
||||
typedef typename Map::Dart_handle Dart_handle;
|
||||
typedef typename Map::size_type size_type;
|
||||
|
||||
FGW_cell_iterator(const Map& amap, Dart_handle adart) : Base(amap, adart)
|
||||
{}
|
||||
|
||||
/// Constructor with two darts in parameter (for end iterator).
|
||||
FGW_cell_iterator(const Map& amap, Dart_handle adart,
|
||||
Dart_handle d2): Base(amap, adart, d2)
|
||||
{}
|
||||
|
||||
/// Prefix ++ operator.
|
||||
Self& operator++()
|
||||
{
|
||||
this->m_curdart=this->mmap.template beta<1>(this->m_curdart);
|
||||
if (this->m_curdart==this->m_firstdart)
|
||||
{ this->m_curdart=Dart_handle(); }
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Postfix ++ operator.
|
||||
Self operator++(int)
|
||||
{ Self res=*this; operator ++(); return res; }
|
||||
};
|
||||
template<typename Map_>
|
||||
class FGW_cell_iterator<Map_, 3>: public FGW_basis_for_cell_iterator<Map_> // CC
|
||||
{
|
||||
public:
|
||||
typedef FGW_cell_iterator Self;
|
||||
typedef FGW_basis_for_cell_iterator<Map_> Base;
|
||||
typedef Map_ Map;
|
||||
typedef typename Map::Dart_handle Dart_handle;
|
||||
typedef typename Map::size_type size_type;
|
||||
|
||||
FGW_cell_iterator(const Map& amap, Dart_handle adart) : Base(amap, adart)
|
||||
{ m_mark=this->mmap.get_new_mark(); }
|
||||
|
||||
/// Constructor with two darts in parameter (for end iterator).
|
||||
FGW_cell_iterator(const Map& amap, Dart_handle adart,
|
||||
Dart_handle d2): Base(amap, adart, d2)
|
||||
{ m_mark=this->mmap.get_new_mark(); }
|
||||
|
||||
~FGW_cell_iterator()
|
||||
{ this->mmap.free_mark(m_mark); }
|
||||
|
||||
/// Prefix ++ operator.
|
||||
Self& operator++()
|
||||
{
|
||||
if (!this->mmap.is_marked(this->mmap.template beta<1>(this->m_curdart), m_mark))
|
||||
{
|
||||
m_to_treat.push(this->mmap.template beta<1>(this->m_curdart));
|
||||
this->mmap.mark(this->mmap.template beta<1>(this->m_curdart), m_mark);
|
||||
}
|
||||
if (!this->mmap.template is_free<2>(this->m_curdart) &&
|
||||
!this->mmap.is_marked(this->mmap.template beta<2>(this->m_curdart), m_mark))
|
||||
{
|
||||
m_to_treat.push(this->mmap.template beta<2>(this->m_curdart));
|
||||
this->mmap.mark(this->mmap.template beta<2>(this->m_curdart), m_mark);
|
||||
}
|
||||
|
||||
if (m_to_treat.empty())
|
||||
{ this->m_curdart=Dart_handle(); }
|
||||
else
|
||||
{ this->m_curdart=m_to_treat.top(); m_to_treat.pop(); }
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Postfix ++ operator.
|
||||
Self operator++(int)
|
||||
{ Self res=*this; operator ++(); return res; }
|
||||
|
||||
protected:
|
||||
typename Map_::size_type m_mark;
|
||||
std::stack<Dart_handle> m_to_treat;
|
||||
};
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
} // namespace CGAL
|
||||
|
||||
#endif // CGAL_ITERATORS_FOR_FACE_GRAPH_WRAPPER_H //
|
||||
// EOF //
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
Algebraic_foundations
|
||||
Arithmetic_kernel
|
||||
BGL
|
||||
Cartesian_kernel
|
||||
Circulator
|
||||
Combinatorial_map
|
||||
|
|
@ -17,5 +18,7 @@ Kernel_d
|
|||
Modular_arithmetic
|
||||
Number_types
|
||||
Profiling_tools
|
||||
Property_map
|
||||
STL_Extension
|
||||
Stream_support
|
||||
Random_numbers
|
||||
|
|
|
|||
|
|
@ -16,6 +16,11 @@ if ( CGAL_FOUND )
|
|||
create_single_source_cgal_program( "${cppfile}" )
|
||||
endforeach()
|
||||
|
||||
find_package( OpenMesh QUIET )
|
||||
if (TARGET OpenMesh::OpenMesh)
|
||||
target_link_libraries(Combinatorial_map_copy_test PRIVATE OpenMesh::OpenMesh)
|
||||
endif()
|
||||
|
||||
else()
|
||||
|
||||
message(STATUS "This program requires the CGAL library, and will not be compiled.")
|
||||
|
|
|
|||
|
|
@ -1,6 +1,13 @@
|
|||
#include <CGAL/Combinatorial_map.h>
|
||||
#include <CGAL/Cell_attribute.h>
|
||||
#include "Combinatorial_map_test_iterators.h"
|
||||
#include <CGAL/HalfedgeDS_default.h>
|
||||
#if CGAL_USE_OPENMESH
|
||||
# include <OpenMesh/Core/IO/MeshIO.hh>
|
||||
# include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
|
||||
# include <CGAL/boost/graph/graph_traits_TriMesh_ArrayKernelT.h>
|
||||
typedef OpenMesh::TriMesh_ArrayKernelT</* MyTraits*/> OpenMesh_mesh;
|
||||
#endif // CGAL_USE_OPENMESH
|
||||
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
|
@ -152,6 +159,10 @@ typedef CGAL::Combinatorial_map<4, Map_dart_items_4> Map8;
|
|||
// info=char, int, int, int, int, double
|
||||
typedef CGAL::Combinatorial_map<4, Map_dart_max_items_4> Map9;
|
||||
|
||||
struct Traits { typedef int Point_2; typedef int Point_3; };
|
||||
typedef CGAL::HalfedgeDS_default<Traits> HDS;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
template<typename Map, unsigned int i, typename Attr=typename Map::
|
||||
template Attribute_type<i>::type>
|
||||
struct CreateAttributes
|
||||
|
|
@ -579,6 +590,31 @@ bool testCopy()
|
|||
return true;
|
||||
}
|
||||
|
||||
bool testImportFromHalfedge()
|
||||
{
|
||||
bool res=true;
|
||||
|
||||
HDS hds;
|
||||
CGAL::HalfedgeDS_decorator<HDS> decorator(hds);
|
||||
decorator.create_loop();
|
||||
decorator.create_segment();
|
||||
|
||||
Map1 map1; map1.import_from_halfedge_graph(hds);
|
||||
Map2 map2; map2.import_from_halfedge_graph(hds);
|
||||
Map3 map3; map3.import_from_halfedge_graph(hds);
|
||||
|
||||
#if CGAL_USE_OPENMESH
|
||||
{
|
||||
// test the compilation, with an empty mesh
|
||||
OpenMesh_mesh hds;
|
||||
Map1 map1; map1.import_from_halfedge_graph(hds);
|
||||
Map2 map2; map2.import_from_halfedge_graph(hds);
|
||||
Map3 map3; map3.import_from_halfedge_graph(hds);
|
||||
}
|
||||
#endif // CGAL_USE_OPENMESH
|
||||
return res; // TODO compare number of darts/cells
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
std::cout<<"Combinatorial map copy test (v1)."<<std::flush;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,10 @@
|
|||
#include <CGAL/Combinatorial_map.h>
|
||||
#include <CGAL/Cell_attribute.h>
|
||||
#include <CGAL/Face_graph_wrapper.h>
|
||||
#include <CGAL/Simple_cartesian.h>
|
||||
#include <CGAL/Surface_mesh.h>
|
||||
#include <CGAL/Polyhedron_3.h>
|
||||
#include <CGAL/IO/Polyhedron_iostream.h>
|
||||
|
||||
#include "Combinatorial_map_2_test.h"
|
||||
#include "Combinatorial_map_3_test.h"
|
||||
|
|
@ -193,8 +198,64 @@ bool test_get_new_mark()
|
|||
return true;
|
||||
}
|
||||
|
||||
bool test_face_graph_wrapper()
|
||||
{
|
||||
bool res=true;
|
||||
|
||||
typedef CGAL::Surface_mesh<CGAL::Simple_cartesian<double>::Point_3> SMesh;
|
||||
SMesh m;
|
||||
std::ifstream in1("data/head.off");
|
||||
if (in1.fail())
|
||||
{
|
||||
std::cout<<"Error: impossible to open 'data/head.off'"<<std::endl;
|
||||
return false;
|
||||
}
|
||||
in1>>m;
|
||||
|
||||
CGAL::Face_graph_wrapper<SMesh> fgw1(m);
|
||||
std::vector<unsigned int> cells=fgw1.count_all_cells();
|
||||
if (cells[0]!=1487 || cells[1]!=4406 || cells[2]!=2921 ||
|
||||
fgw1.number_of_darts()!=8812)
|
||||
{
|
||||
std::cout<<"Error: incorrect number of cells in test_face_graph_wrapper "
|
||||
<<"for Surface_mesh: "
|
||||
<<cells[0]<<", "<<cells[1]<<", "<<cells[2]<<", "<<fgw1.number_of_darts()
|
||||
<<std::endl;
|
||||
res=false;
|
||||
}
|
||||
|
||||
typedef CGAL::Polyhedron_3<CGAL::Simple_cartesian<double> > Polyhedron;
|
||||
Polyhedron p;
|
||||
std::ifstream in2("data/head.off");
|
||||
if (in2.fail())
|
||||
{
|
||||
std::cout<<"Error: impossible to open 'data/head.off'"<<std::endl;
|
||||
return false;
|
||||
}
|
||||
in2>>p;
|
||||
CGAL::Face_graph_wrapper<Polyhedron> fgw2(p);
|
||||
cells=fgw2.count_all_cells();
|
||||
if (cells[0]!=1487 || cells[1]!=4406 || cells[2]!=2921 ||
|
||||
fgw2.number_of_darts()!=8812)
|
||||
{
|
||||
std::cout<<"Error: incorrect number of cells in test_face_graph_wrapper "
|
||||
<<"for Polyhedron."
|
||||
<<cells[0]<<", "<<cells[1]<<", "<<cells[2]<<", "<<fgw2.number_of_darts()
|
||||
<<std::endl;
|
||||
res=false;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
if (!test_face_graph_wrapper())
|
||||
{
|
||||
std::cout<<"ERROR during test_face_graph_wrapper."<<std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
if ( !test_get_new_mark() )
|
||||
{
|
||||
std::cout<<"ERROR during test_get_new_mark."<<std::endl;
|
||||
|
|
|
|||
|
|
@ -102,3 +102,5 @@ Classification
|
|||
Hyperbolic_triangulation_2
|
||||
Periodic_4_hyperbolic_triangulation_2
|
||||
Surface_mesh_approximation
|
||||
Surface_mesh_topology
|
||||
|
||||
|
|
|
|||
|
|
@ -119,6 +119,7 @@
|
|||
\package_listing{Stream_lines_2}
|
||||
\package_listing{Classification}
|
||||
\package_listing{Heat_method_3}
|
||||
\package_listing{Surface_mesh_topology}
|
||||
|
||||
\cgalPackageSection{PartSearchStructures,Spatial Searching and Sorting}
|
||||
|
||||
|
|
|
|||
|
|
@ -152023,3 +152023,21 @@ pages = {179--189}
|
|||
HAL_ID = {inria-00412437},
|
||||
HAL_VERSION = {v1},
|
||||
}
|
||||
|
||||
@InProceedings{ew-tcsr-13,
|
||||
Title = {Transforming curves on surfaces redux},
|
||||
Author = {Erickson, Jeff and Whittelsey, Kim},
|
||||
Booktitle = {24rd Annual ACM-SIAM Symposium on Discrete Algorithms (SODA)},
|
||||
Year = {2013},
|
||||
Pages = {1646--1655},
|
||||
Url = {http://jeffe.cs.illinois.edu/pubs/pdf/dehn.pdf}
|
||||
}
|
||||
|
||||
@InProceedings{lr-hts-12,
|
||||
Title = {On the homotopy test on surfaces},
|
||||
Author = {Lazarus, Francis and Rivaud, Julien},
|
||||
Booktitle = {53rd Annual IEEE Symposium on Foundations of Computer Science (FOCS)},
|
||||
Year = {2012},
|
||||
Pages = {440-449},
|
||||
Url = {http://arxiv.org/abs/1110.4573}
|
||||
}
|
||||
|
|
@ -181,13 +181,22 @@ namespace CGAL {
|
|||
* @param amap the generalized map to copy.
|
||||
* @post *this is valid.
|
||||
*/
|
||||
template <typename GMap2, typename Converters, typename DartInfoConverter,
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2,
|
||||
typename Converters, typename DartInfoConverter,
|
||||
typename PointConverter>
|
||||
void copy(const GMap2& amap, const Converters& converters,
|
||||
void copy(const Generalized_map_base<d2, Refs2, Items2, Alloc2, Storage2>& amap,
|
||||
const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter,
|
||||
const PointConverter& pointconverter,
|
||||
boost::unordered_map<typename GMap2::Dart_const_handle, Dart_handle>* dart_mapping=nullptr)
|
||||
boost::unordered_map
|
||||
<typename Generalized_map_base<d2, Refs2, Items2, Alloc2, Storage2>::
|
||||
Dart_const_handle, Dart_handle>* origin_to_copy=NULL,
|
||||
boost::unordered_map
|
||||
<Dart_handle, typename Generalized_map_base<d2, Refs2, Items2,
|
||||
Alloc2, Storage2>::Dart_const_handle>* copy_to_origin=NULL)
|
||||
{
|
||||
typedef Generalized_map_base<d2, Refs2, Items2, Alloc2, Storage2> GMap2;
|
||||
this->clear();
|
||||
|
||||
this->mnb_used_marks = amap.mnb_used_marks;
|
||||
|
|
@ -207,107 +216,145 @@ namespace CGAL {
|
|||
// Create an mapping between darts of the two maps (originals->copies).
|
||||
// (here we cannot use CGAL::Unique_hash_map because it does not provide
|
||||
// iterators...
|
||||
boost::unordered_map<typename GMap2::Dart_const_handle, Dart_handle> local_dartmap;
|
||||
if (dart_mapping==nullptr)
|
||||
{ dart_mapping=&local_dartmap; }
|
||||
|
||||
boost::unordered_map<typename GMap2::Dart_const_handle, Dart_handle>
|
||||
local_dartmap;
|
||||
if (origin_to_copy==NULL) // Used local_dartmap if user does not provides its own unordered_map
|
||||
{ origin_to_copy=&local_dartmap; }
|
||||
|
||||
Dart_handle new_dart;
|
||||
for (typename GMap2::Dart_const_range::const_iterator
|
||||
it=amap.darts().begin(), itend=amap.darts().end();
|
||||
it!=itend; ++it)
|
||||
{
|
||||
(*dart_mapping)[it]=mdarts.emplace();
|
||||
init_dart((*dart_mapping)[it], amap.get_marks(it));
|
||||
internal::Copy_dart_info_functor<GMap2, Refs, DartInfoConverter>::
|
||||
run(amap, static_cast<Refs&>(*this), it, (*dart_mapping)[it],
|
||||
dartinfoconverter);
|
||||
new_dart=mdarts.emplace();
|
||||
init_dart(new_dart, amap.get_marks(it));
|
||||
|
||||
(*origin_to_copy)[it]=new_dart;
|
||||
if (copy_to_origin!=NULL) { (*copy_to_origin)[new_dart]=it; }
|
||||
|
||||
internal::Copy_dart_info_functor<Refs2, Refs, DartInfoConverter>::
|
||||
run(static_cast<const Refs2&>(amap), static_cast<Refs&>(*this),
|
||||
it, new_dart, dartinfoconverter);
|
||||
}
|
||||
|
||||
unsigned int min_dim=(dimension<amap.dimension?dimension:amap.dimension);
|
||||
|
||||
typename boost::unordered_map<typename GMap2::Dart_const_handle,Dart_handle>
|
||||
::iterator dartmap_iter, dartmap_iter_end=dart_mapping->end();
|
||||
for (dartmap_iter=dart_mapping->begin(); dartmap_iter!=dartmap_iter_end;
|
||||
::iterator dartmap_iter, dartmap_iter_end=origin_to_copy->end();
|
||||
for (dartmap_iter=origin_to_copy->begin(); dartmap_iter!=dartmap_iter_end;
|
||||
++dartmap_iter)
|
||||
{
|
||||
for (unsigned int i=0; i<=min_dim; i++)
|
||||
{
|
||||
if (!amap.is_free(dartmap_iter->first,i) &&
|
||||
(dartmap_iter->first)<(amap.alpha(dartmap_iter->first,i)))
|
||||
is_free(dartmap_iter->second,i))
|
||||
{
|
||||
basic_link_alpha(dartmap_iter->second,
|
||||
(*dart_mapping)[amap.alpha(dartmap_iter->first,i)], i);
|
||||
(*origin_to_copy)[amap.alpha(dartmap_iter->first,i)], i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Copy attributes */
|
||||
for (dartmap_iter=dart_mapping->begin(); dartmap_iter!=dartmap_iter_end;
|
||||
for (dartmap_iter=origin_to_copy->begin(); dartmap_iter!=dartmap_iter_end;
|
||||
++dartmap_iter)
|
||||
{
|
||||
Helper::template Foreach_enabled_attributes
|
||||
< internal::Copy_attributes_functor <GMap2, Refs, Converters,
|
||||
< internal::Copy_attributes_functor<Refs2, Refs, Converters,
|
||||
PointConverter> >::
|
||||
run(amap, static_cast<Refs&>(*this),
|
||||
run(static_cast<const Refs2&>(amap), static_cast<Refs&>(*this),
|
||||
dartmap_iter->first, dartmap_iter->second,
|
||||
converters, pointconverter);
|
||||
}
|
||||
|
||||
CGAL_assertion (is_valid () == 1);
|
||||
CGAL_assertion(is_valid());
|
||||
}
|
||||
|
||||
template <typename GMap2>
|
||||
void copy(const GMap2& amap,
|
||||
boost::unordered_map<typename GMap2::Dart_const_handle, Dart_handle>* dart_mapping=nullptr)
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2>
|
||||
void copy(const Generalized_map_base<d2, Refs2, Items2, Alloc2, Storage2>& amap,
|
||||
boost::unordered_map
|
||||
<typename Generalized_map_base<d2, Refs2, Items2, Alloc2, Storage2>::
|
||||
Dart_const_handle, Dart_handle>* origin_to_copy=NULL,
|
||||
boost::unordered_map
|
||||
<Dart_handle, typename Generalized_map_base<d2, Refs2, Items2,
|
||||
Alloc2, Storage2>::Dart_const_handle>* copy_to_origin=NULL)
|
||||
{
|
||||
std::tuple<> converters;
|
||||
Default_converter_dart_info<GMap2, Refs> dartinfoconverter;
|
||||
Default_converter_cmap_0attributes_with_point<GMap2, Refs> pointconverter;
|
||||
copy(amap, converters, dartinfoconverter, pointconverter, dart_mapping);
|
||||
CGAL::cpp11::tuple<> converters;
|
||||
Default_converter_dart_info<Refs2, Refs> dartinfoconverter;
|
||||
Default_converter_cmap_0attributes_with_point<Refs2, Refs> pointconverter;
|
||||
copy(amap, converters, dartinfoconverter, pointconverter,
|
||||
origin_to_copy, copy_to_origin);
|
||||
}
|
||||
|
||||
template <typename GMap2, typename Converters>
|
||||
void copy(const GMap2& amap, const Converters& converters,
|
||||
boost::unordered_map<typename GMap2::Dart_const_handle, Dart_handle>* dart_mapping=nullptr)
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2, typename Converters>
|
||||
void copy(const Generalized_map_base<d2, Refs2, Items2, Alloc2, Storage2>& amap,
|
||||
const Converters& converters,
|
||||
boost::unordered_map
|
||||
<typename Generalized_map_base<d2, Refs2, Items2, Alloc2, Storage2>::
|
||||
Dart_const_handle, Dart_handle>* origin_to_copy=NULL,
|
||||
boost::unordered_map
|
||||
<Dart_handle, typename Generalized_map_base<d2, Refs2, Items2,
|
||||
Alloc2, Storage2>::Dart_const_handle>* copy_to_origin=NULL)
|
||||
{
|
||||
Default_converter_cmap_0attributes_with_point<GMap2, Refs> pointconverter;
|
||||
Default_converter_dart_info<GMap2, Refs> dartinfoconverter;
|
||||
copy(amap, converters, dartinfoconverter, pointconverter, dart_mapping);
|
||||
Default_converter_cmap_0attributes_with_point<Refs2, Refs> pointconverter;
|
||||
Default_converter_dart_info<Refs2, Refs> dartinfoconverter;
|
||||
copy(amap, converters, dartinfoconverter, pointconverter,
|
||||
origin_to_copy, copy_to_origin);
|
||||
}
|
||||
|
||||
template <typename GMap2, typename Converters, typename DartInfoConverter>
|
||||
void copy(const GMap2& amap, const Converters& converters,
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2,
|
||||
typename Converters, typename DartInfoConverter>
|
||||
void copy(const Generalized_map_base<d2, Refs2, Items2, Alloc2, Storage2>& amap,
|
||||
const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter,
|
||||
boost::unordered_map<typename GMap2::Dart_const_handle, Dart_handle>* dart_mapping=nullptr)
|
||||
boost::unordered_map
|
||||
<typename Generalized_map_base<d2, Refs2, Items2, Alloc2, Storage2>::
|
||||
Dart_const_handle, Dart_handle>* origin_to_copy=NULL,
|
||||
boost::unordered_map
|
||||
<Dart_handle, typename Generalized_map_base<d2, Refs2, Items2,
|
||||
Alloc2, Storage2>::Dart_const_handle>* copy_to_origin=NULL)
|
||||
{
|
||||
Default_converter_cmap_0attributes_with_point<GMap2, Refs> pointconverter;
|
||||
copy(amap, converters, dartinfoconverter, pointconverter, dart_mapping);
|
||||
Default_converter_cmap_0attributes_with_point<Refs2, Refs> pointconverter;
|
||||
copy(amap, converters, dartinfoconverter, pointconverter,
|
||||
origin_to_copy, copy_to_origin);
|
||||
}
|
||||
|
||||
// Copy constructor from a map having exactly the same type.
|
||||
Generalized_map_base (const Self & amap)
|
||||
{ copy<Self>(amap); }
|
||||
|
||||
// "Copy constructor" from a map having different type.
|
||||
template <typename GMap2>
|
||||
Generalized_map_base(const GMap2& amap)
|
||||
{ copy(amap); }
|
||||
|
||||
// "Copy constructor" from a map having different type.
|
||||
template <typename GMap2, typename Converters>
|
||||
Generalized_map_base(const GMap2& amap, Converters& converters)
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2>
|
||||
Generalized_map_base(const Generalized_map_base<d2, Refs2, Items2, Alloc2, Storage2>& amap)
|
||||
{ copy(amap); }
|
||||
|
||||
// "Copy constructor" from a map having different type.
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2, typename Converters>
|
||||
Generalized_map_base(const Generalized_map_base<d2, Refs2, Items2, Alloc2, Storage2>& amap,
|
||||
const Converters& converters)
|
||||
{ copy(amap, converters); }
|
||||
|
||||
// "Copy constructor" from a map having different type.
|
||||
template <typename GMap2, typename Converters, typename DartInfoConverter>
|
||||
Generalized_map_base(const GMap2& amap, Converters& converters,
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2,
|
||||
typename Converters, typename DartInfoConverter>
|
||||
Generalized_map_base(const Generalized_map_base<d2, Refs2, Items2, Alloc2, Storage2>& amap,
|
||||
const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter)
|
||||
{ copy(amap, converters, dartinfoconverter); }
|
||||
|
||||
// "Copy constructor" from a map having different type.
|
||||
template <typename GMap2, typename Converters, typename DartInfoConverter,
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2,
|
||||
typename Converters, typename DartInfoConverter,
|
||||
typename PointConverter>
|
||||
Generalized_map_base(const GMap2& amap, Converters& converters,
|
||||
Generalized_map_base(const Generalized_map_base<d2, Refs2, Items2, Alloc2, Storage2>& amap,
|
||||
const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter,
|
||||
const PointConverter& pointconverter)
|
||||
{ copy(amap, converters, dartinfoconverter, pointconverter); }
|
||||
|
|
@ -579,6 +626,11 @@ namespace CGAL {
|
|||
Dart_const_handle next(Dart_const_handle ADart) const
|
||||
{ return this->template alpha<0, 1>(ADart); }
|
||||
|
||||
Dart_handle opposite2(Dart_handle ADart)
|
||||
{ return this->template alpha<0, 2>(ADart); }
|
||||
Dart_const_handle opposite2(Dart_const_handle ADart) const
|
||||
{ return this->template alpha<0, 2>(ADart); }
|
||||
|
||||
template<unsigned int dim>
|
||||
Dart_handle opposite(Dart_handle ADart)
|
||||
{ return this->template alpha<0, dim>(ADart); }
|
||||
|
|
@ -849,6 +901,27 @@ namespace CGAL {
|
|||
mnb_times_reserved_marks[amark]=0;
|
||||
}
|
||||
|
||||
template <unsigned int i, unsigned int d=dimension>
|
||||
bool belong_to_same_cell(Dart_const_handle adart1,
|
||||
Dart_const_handle adart2) const
|
||||
{ return CGAL::belong_to_same_cell<Self, i, d>(*this, adart1, adart2); }
|
||||
|
||||
template <unsigned int i, unsigned int d=dimension>
|
||||
bool is_whole_cell_unmarked(Dart_const_handle adart, size_type amark) const
|
||||
{ return CGAL::is_whole_cell_unmarked<Self, i, d>(*this, adart, amark); }
|
||||
|
||||
template <unsigned int i, unsigned int d=dimension>
|
||||
bool is_whole_cell_marked(Dart_const_handle adart, size_type amark) const
|
||||
{ return CGAL::is_whole_cell_marked<Self, i, d>(*this, adart, amark); }
|
||||
|
||||
template <unsigned int i, unsigned int d=dimension>
|
||||
size_type mark_cell(Dart_const_handle adart, size_type amark) const
|
||||
{ return CGAL::mark_cell<Self, i, d>(*this, adart, amark); }
|
||||
|
||||
template <unsigned int i, unsigned int d=dimension>
|
||||
size_type unmark_cell(Dart_const_handle adart, size_type amark) const
|
||||
{ return CGAL::unmark_cell<Self, i, d>(*this, adart, amark); }
|
||||
|
||||
/** Test if this map is without boundary for a given dimension.
|
||||
* @param i the dimension.
|
||||
* @return true iff all the darts are not i-free.
|
||||
|
|
@ -1647,6 +1720,61 @@ namespace CGAL {
|
|||
}
|
||||
|
||||
public:
|
||||
/// @return the positive turn between the two given darts.
|
||||
// @pre next(d1) and d2 must belong to the same vertex.
|
||||
std::size_t positive_turn(Dart_const_handle d1, Dart_const_handle d2) const
|
||||
{
|
||||
CGAL_assertion((!this->template is_free<1>(d1)));
|
||||
/* CGAL_assertion((belong_to_same_cell<0>(this->next(d1), d2))); */
|
||||
|
||||
if (d2==opposite2(d1)) { return 0; }
|
||||
|
||||
Dart_const_handle dd1=d1;
|
||||
std::size_t res=1;
|
||||
while (next(dd1)!=d2)
|
||||
{
|
||||
if (this->template is_free<2>(next(dd1)))
|
||||
{ return std::numeric_limits<std::size_t>::max(); }
|
||||
|
||||
++res;
|
||||
dd1=opposite2(next(dd1));
|
||||
|
||||
CGAL_assertion(!this->template is_free<1>(dd1));
|
||||
CGAL_assertion(next(dd1)==d2 || dd1!=d1);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/// @return the negative turn between the two given darts.
|
||||
// @pre next(d1) and d2 must belong to the same vertex.
|
||||
std::size_t negative_turn(Dart_const_handle d1, Dart_const_handle d2) const
|
||||
{
|
||||
CGAL_assertion((!this->template is_free<1>(d1)));
|
||||
/* CGAL_assertion((belong_to_same_cell<0>(this->next(d1), d2))); */
|
||||
|
||||
if (d2==opposite2(d1)) { return 0; }
|
||||
|
||||
if (this->template is_free<2>(d1) || this->template is_free<2>(d2))
|
||||
{ return std::numeric_limits<std::size_t>::max(); }
|
||||
|
||||
d1=opposite2(d1);
|
||||
d2=opposite2(d2);
|
||||
Dart_const_handle dd1=d1;
|
||||
std::size_t res=1;
|
||||
while (previous(dd1)!=d2)
|
||||
{
|
||||
if (this->template is_free<2>(previous(dd1)))
|
||||
{ return std::numeric_limits<std::size_t>::max(); }
|
||||
|
||||
++res;
|
||||
dd1=opposite2(previous(dd1));
|
||||
|
||||
CGAL_assertion(!this->template is_free<0>(dd1));
|
||||
CGAL_assertion(previous(dd1)==d2 || dd1!=d1);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/** Erase marked darts from the map.
|
||||
* Marked darts are unlinked before to be removed, thus surviving darts
|
||||
* are correctly linked, but the map is not necessarily valid depending
|
||||
|
|
@ -1666,7 +1794,7 @@ namespace CGAL {
|
|||
if (is_marked(d, amark))
|
||||
{
|
||||
for ( i = 0; i <= dimension; ++i)
|
||||
{ if (!is_free(d, i)) unlink_beta(d, i); }
|
||||
{ if (!is_free(d, i)) topo_unsew(d, i); }
|
||||
erase_dart(d); ++res;
|
||||
}
|
||||
}
|
||||
|
|
@ -2766,12 +2894,12 @@ namespace CGAL {
|
|||
!is_face_combinatorial_polygon(d4, 3) ) return false;
|
||||
|
||||
// TODO do better with marks (?).
|
||||
if ( belong_to_same_cell<Self,2,1>(*this, d1, d2) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d1, d3) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d1, d4) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d2, d3) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d2, d4) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d3, d4) ) return false;
|
||||
if ( belong_to_same_cell<2,1>(d1, d2) ||
|
||||
belong_to_same_cell<2,1>(d1, d3) ||
|
||||
belong_to_same_cell<2,1>(d1, d4) ||
|
||||
belong_to_same_cell<2,1>(d2, d3) ||
|
||||
belong_to_same_cell<2,1>(d2, d4) ||
|
||||
belong_to_same_cell<2,1>(d3, d4) ) return false;
|
||||
|
||||
if ( alpha(d1, 0,1,2)!=alpha(d3,1) ||
|
||||
alpha(d4, 1,2)!=alpha(d3,0,1) ||
|
||||
|
|
@ -2847,21 +2975,21 @@ namespace CGAL {
|
|||
!is_face_combinatorial_polygon(d6, 4) ) return false;
|
||||
|
||||
// TODO do better with marks.
|
||||
if ( belong_to_same_cell<Self,2,1>(*this, d1, d2) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d1, d3) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d1, d4) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d1, d5) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d1, d6) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d2, d3) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d2, d4) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d2, d5) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d2, d6) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d3, d4) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d3, d5) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d3, d6) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d4, d5) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d4, d6) ||
|
||||
belong_to_same_cell<Self,2,1>(*this, d5, d6) )
|
||||
if ( belong_to_same_cell<2,1>(d1, d2) ||
|
||||
belong_to_same_cell<2,1>(d1, d3) ||
|
||||
belong_to_same_cell<2,1>(d1, d4) ||
|
||||
belong_to_same_cell<2,1>(d1, d5) ||
|
||||
belong_to_same_cell<2,1>(d1, d6) ||
|
||||
belong_to_same_cell<2,1>(d2, d3) ||
|
||||
belong_to_same_cell<2,1>(d2, d4) ||
|
||||
belong_to_same_cell<2,1>(d2, d5) ||
|
||||
belong_to_same_cell<2,1>(d2, d6) ||
|
||||
belong_to_same_cell<2,1>(d3, d4) ||
|
||||
belong_to_same_cell<2,1>(d3, d5) ||
|
||||
belong_to_same_cell<2,1>(d3, d6) ||
|
||||
belong_to_same_cell<2,1>(d4, d5) ||
|
||||
belong_to_same_cell<2,1>(d4, d6) ||
|
||||
belong_to_same_cell<2,1>(d5, d6) )
|
||||
return false;
|
||||
|
||||
if ( alpha(d1,2) !=alpha(d4,1,0,1) ||
|
||||
|
|
@ -3341,14 +3469,14 @@ namespace CGAL {
|
|||
if (prec!=null_handle)
|
||||
{
|
||||
// prec and *it must belong to the same vertex of the same volume
|
||||
if ( !CGAL::belong_to_same_cell<Self, 0, 2>(*this, prec, *it) )
|
||||
if ( !belong_to_same_cell<0, 2>(prec, *it) )
|
||||
return false;
|
||||
}
|
||||
prec = this->template alpha<0>(*it);
|
||||
}
|
||||
|
||||
// The path must be closed.
|
||||
if (!CGAL::belong_to_same_cell<Self, 0, 2>(*this, prec, *afirst))
|
||||
if (!belong_to_same_cell<0, 2>(prec, *afirst))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
|
@ -3589,24 +3717,34 @@ namespace CGAL {
|
|||
Generalized_map(const Self & amap) : Base(amap)
|
||||
{}
|
||||
|
||||
template < class Gmap >
|
||||
Generalized_map(const Gmap & amap) : Base(amap)
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2>
|
||||
Generalized_map(const Generalized_map_base<d2, Refs2, Items2, Alloc2, Storage2>& amap) :
|
||||
Base(amap)
|
||||
{}
|
||||
|
||||
template < class Gmap, typename Converters >
|
||||
Generalized_map(const Gmap & amap, const Converters& converters) :
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2, typename Converters>
|
||||
Generalized_map(const Generalized_map_base<d2, Refs2, Items2, Alloc2, Storage2>& amap,
|
||||
const Converters& converters) :
|
||||
Base(amap, converters)
|
||||
{}
|
||||
|
||||
template < class Gmap, typename Converters, typename DartInfoConverter >
|
||||
Generalized_map(const Gmap & amap, const Converters& converters,
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2,
|
||||
typename Converters, typename DartInfoConverter>
|
||||
Generalized_map(const Generalized_map_base<d2, Refs2, Items2, Alloc2, Storage2>& amap,
|
||||
const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter) :
|
||||
Base(amap, converters, dartinfoconverter)
|
||||
{}
|
||||
|
||||
template < class Gmap, typename Converters, typename DartInfoConverter,
|
||||
typename PointConverter >
|
||||
Generalized_map(const Gmap & amap, const Converters& converters,
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2,
|
||||
typename Converters, typename DartInfoConverter,
|
||||
typename PointConverter >
|
||||
Generalized_map(const Generalized_map_base<d2, Refs2, Items2, Alloc2, Storage2>& amap,
|
||||
const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter,
|
||||
const PointConverter& pointconverter) :
|
||||
Base(amap, converters, dartinfoconverter, pointconverter)
|
||||
|
|
|
|||
|
|
@ -123,6 +123,8 @@ namespace CGAL {
|
|||
CGAL_assertion(i <= dimension);
|
||||
return dh->mf[i]==dh;
|
||||
}
|
||||
bool is_perforated(Dart_const_handle /*dh*/) const
|
||||
{ return false; }
|
||||
|
||||
/// Set simultaneously all the marks of this dart to a given value.
|
||||
void set_dart_marks(Dart_const_handle ADart,
|
||||
|
|
|
|||
|
|
@ -406,8 +406,8 @@ public:
|
|||
|
||||
if (m_points_of_face.size()<3)
|
||||
{
|
||||
std::cerr<<"PB: you try to triangulate a face with "<<m_points_of_face.size()<<" vertices."
|
||||
<<std::endl;
|
||||
/* std::cerr<<"PB: you try to triangulate a face with "<<m_points_of_face.size()<<" vertices."
|
||||
<<std::endl; */
|
||||
|
||||
m_face_started=false;
|
||||
m_points_of_face.clear();
|
||||
|
|
@ -526,9 +526,10 @@ public:
|
|||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
CGAL::Bbox_3 *bb() const { return m_bb; }
|
||||
|
||||
protected:
|
||||
protected:
|
||||
void face_begin_internal(bool has_color, bool has_normal)
|
||||
{
|
||||
if (is_a_face_started())
|
||||
|
|
|
|||
|
|
@ -104,7 +104,7 @@ const char fragment_source_color[] =
|
|||
" highp vec3 R = reflect(-L, N); \n"
|
||||
" highp vec4 diffuse = max(dot(N,L), 0.0) * light_diff * fColor; \n"
|
||||
" highp vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec; \n"
|
||||
"gl_FragColor = light_amb*fColor + diffuse ; \n"
|
||||
" gl_FragColor = light_amb*fColor + diffuse ; \n"
|
||||
"} \n"
|
||||
"\n"
|
||||
};
|
||||
|
|
@ -1223,6 +1223,7 @@ protected:
|
|||
setKeyDescription(::Qt::Key_M, "Toggles mono color");
|
||||
setKeyDescription(::Qt::Key_N, "Inverse direction of normals");
|
||||
setKeyDescription(::Qt::Key_T, "Toggles text display");
|
||||
setKeyDescription(::Qt::Key_U, "Move camera direction upside down");
|
||||
setKeyDescription(::Qt::Key_V, "Toggles vertices display");
|
||||
setKeyDescription(::Qt::Key_Plus, "Increase size of edges");
|
||||
setKeyDescription(::Qt::Key_Minus, "Decrease size of edges");
|
||||
|
|
@ -1305,6 +1306,30 @@ protected:
|
|||
negate_all_normals();
|
||||
redraw();
|
||||
}
|
||||
else if ((e->key()==::Qt::Key_U) && (modifiers==::Qt::NoButton))
|
||||
{
|
||||
if (is_two_dimensional())
|
||||
{
|
||||
displayMessage(QString("Move camera direction upside down."));
|
||||
/* CGAL::qglviewer::Vec cur=camera()->viewDirection();
|
||||
double cx=cur.x, cy=cur.y, cz=cur.z;
|
||||
if (has_zero_x()) { cx=-cx; }
|
||||
else if (has_zero_y()) { cy=-cy; }
|
||||
else { cz=-cz; }
|
||||
double cx=0., cy=0., cz=0.;
|
||||
if (has_zero_x()) { cx=(cur.x<0?-1.:1); }
|
||||
else if (has_zero_y()) { cy=(cur.y<0?-1.:1); }
|
||||
else { cz=(cur.z<0?-1.:1); }*/
|
||||
|
||||
camera()->setUpVector(-camera()->upVector());
|
||||
//camera()->frame()->setConstraint(NULL);
|
||||
// camera()->setViewDirection(CGAL::qglviewer::Vec(-cx,-cy,-cz));
|
||||
//constraint.setRotationConstraintDirection(CGAL::qglviewer::Vec(cx, cy, cz));
|
||||
//camera()->frame()->setConstraint(&constraint);
|
||||
//update();
|
||||
redraw();
|
||||
}
|
||||
}
|
||||
else if ((e->key()==::Qt::Key_T) && (modifiers==::Qt::NoButton))
|
||||
{
|
||||
m_draw_text=!m_draw_text;
|
||||
|
|
|
|||
|
|
@ -1,11 +1,19 @@
|
|||
Release History
|
||||
===============
|
||||
|
||||
Release 5.1
|
||||
[Release 5.1] (https://github.com/CGAL/cgal/releases/tag/releases%2FCGAL-5.1)
|
||||
-----------
|
||||
|
||||
Release date: June 2020
|
||||
|
||||
### Surface Mesh Topology (new package)
|
||||
|
||||
- This package allows to compute some topological invariants of
|
||||
surfaces. For now, it is possible to test if two (closed) curves
|
||||
on a combinatorial surface are homotopic. The user can choose
|
||||
between free homotopy and homotopy with fixed endpoints.
|
||||
A contractibility test is also provided.
|
||||
|
||||
### 3D Fast Intersection and Distance Computation
|
||||
- **Breaking change**: the internal search tree is now lazily constructed. To disable it, one must call
|
||||
the new function `do_not_accelerate_distance_queries()` before the first distance query.
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@
|
|||
# OPENMESH_LIBRARIES - OpenMesh libraries
|
||||
#
|
||||
|
||||
find_package(OpenMesh NO_MODULE QUIET)
|
||||
|
||||
# Is it already configured?
|
||||
if (NOT OpenMesh_FOUND)
|
||||
|
||||
|
|
@ -44,7 +46,34 @@ endif()
|
|||
|
||||
include( FindPackageHandleStandardArgs )
|
||||
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenMesh
|
||||
REQUIRED_VARS OPENMESH_INCLUDE_DIR OPENMESH_LIBRARIES
|
||||
FOUND_VAR OpenMesh_FOUND
|
||||
)
|
||||
find_package_handle_standard_args(OpenMesh
|
||||
REQUIRED_VARS OPENMESH_INCLUDE_DIR OPENMESH_LIBRARIES
|
||||
FOUND_VAR OpenMesh_FOUND
|
||||
)
|
||||
|
||||
if(OpenMesh_FOUND AND NOT TARGET OpenMesh::OpenMesh)
|
||||
add_library(OpenMesh::OpenMesh UNKNOWN IMPORTED)
|
||||
|
||||
if(TARGET OpenMeshCore)
|
||||
target_link_libraries(OpenMesh::OpenMesh PUBLIC OpenMeshCore)
|
||||
return()
|
||||
endif()
|
||||
|
||||
set_target_properties(OpenMesh::OpenMesh PROPERTIES
|
||||
INTERFACE_COMPILE_DEFINITIONS "CGAL_USE_OPENMESH;NOMINMAX;_USE_MATH_DEFINES"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${OPENMESH_INCLUDE_DIR}")
|
||||
|
||||
if(OPENMESH_LIBRARY_RELEASE)
|
||||
set_property(TARGET OpenMesh::OpenMesh APPEND PROPERTY
|
||||
IMPORTED_CONFIGURATIONS RELEASE)
|
||||
set_target_properties(OpenMesh::OpenMesh PROPERTIES
|
||||
IMPORTED_LOCATION_RELEASE "${OPENMESH_LIBRARY_RELEASE}")
|
||||
endif()
|
||||
|
||||
if(OPENMESH_LIBRARY_DEBUG)
|
||||
set_property(TARGET OpenMesh::OpenMesh APPEND PROPERTY
|
||||
IMPORTED_CONFIGURATIONS DEBUG)
|
||||
set_target_properties(OpenMesh::OpenMesh PROPERTIES
|
||||
IMPORTED_LOCATION_DEBUG "${OPENMESH_LIBRARY_DEBUG}")
|
||||
endif()
|
||||
endif()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,54 @@
|
|||
// Copyright (c) 2016 GeometryFactory SARL (France).
|
||||
// All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org)
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
|
||||
//
|
||||
// Author(s) : Andreas Fabri
|
||||
//
|
||||
// Warning: this file is generated, see include/CGAL/licence/README.md
|
||||
|
||||
#ifndef CGAL_LICENSE_SURFACE_MESH_TOPOLOGY_H
|
||||
#define CGAL_LICENSE_SURFACE_MESH_TOPOLOGY_H
|
||||
|
||||
#include <CGAL/config.h>
|
||||
#include <CGAL/license.h>
|
||||
|
||||
#ifdef CGAL_SURFACE_MESH_TOPOLOGY_COMMERCIAL_LICENSE
|
||||
|
||||
# if CGAL_SURFACE_MESH_TOPOLOGY_COMMERCIAL_LICENSE < CGAL_RELEASE_DATE
|
||||
|
||||
# if defined(CGAL_LICENSE_WARNING)
|
||||
|
||||
CGAL_pragma_warning("Your commercial license for CGAL does not cover "
|
||||
"this release of the Surface Mesh Topology package.")
|
||||
# endif
|
||||
|
||||
# ifdef CGAL_LICENSE_ERROR
|
||||
# error "Your commercial license for CGAL does not cover this release \
|
||||
of the Surface Mesh Topology package. \
|
||||
You get this error, as you defined CGAL_LICENSE_ERROR."
|
||||
# endif // CGAL_LICENSE_ERROR
|
||||
|
||||
# endif // CGAL_SURFACE_MESH_TOPOLOGY_COMMERCIAL_LICENSE < CGAL_RELEASE_DATE
|
||||
|
||||
#else // no CGAL_SURFACE_MESH_TOPOLOGY_COMMERCIAL_LICENSE
|
||||
|
||||
# if defined(CGAL_LICENSE_WARNING)
|
||||
CGAL_pragma_warning("\nThe macro CGAL_SURFACE_MESH_TOPOLOGY_COMMERCIAL_LICENSE is not defined."
|
||||
"\nYou use the CGAL Surface Mesh Topology package under "
|
||||
"the terms of the GPLv3+.")
|
||||
# endif // CGAL_LICENSE_WARNING
|
||||
|
||||
# ifdef CGAL_LICENSE_ERROR
|
||||
# error "The macro CGAL_SURFACE_MESH_TOPOLOGY_COMMERCIAL_LICENSE is not defined.\
|
||||
You use the CGAL Surface Mesh Topology package under the terms of \
|
||||
the GPLv3+. You get this error, as you defined CGAL_LICENSE_ERROR."
|
||||
# endif // CGAL_LICENSE_ERROR
|
||||
|
||||
#endif // no CGAL_SURFACE_MESH_TOPOLOGY_COMMERCIAL_LICENSE
|
||||
|
||||
#endif // CGAL_LICENSE_SURFACE_MESH_TOPOLOGY_H
|
||||
|
|
@ -82,6 +82,7 @@ Surface_mesh_segmentation Triangulated Surface Mesh Segmentation
|
|||
Surface_mesh_shortest_path Triangulated Surface Mesh Shortest Paths
|
||||
Surface_mesh_simplification Triangulated Surface Mesh Simplification
|
||||
Surface_mesh_skeletonization Triangulated Surface Mesh Skeletonization
|
||||
Surface_mesh_topology Surface Mesh Topology
|
||||
Surface_sweep_2 2D Intersection of Curves
|
||||
TDS_2 2D Triangulation Data Structure
|
||||
TDS_3 3D Triangulation Data Structure
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ endif()
|
|||
# set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
|
||||
|
||||
# To use valgrind, we must disable rounding math ckeck.
|
||||
# add_definition(-DCGAL_DISABLE_ROUNDING_MATH_CHECK)
|
||||
# add_definitions(-DCGAL_DISABLE_ROUNDING_MATH_CHECK)
|
||||
|
||||
if (CGAL_FOUND)
|
||||
|
||||
|
|
|
|||
|
|
@ -150,6 +150,8 @@ namespace CGAL {
|
|||
CGAL_assertion(i <= dimension);
|
||||
return dh->mf[i]==null_dart_handle;
|
||||
}
|
||||
bool is_perforated(Dart_const_handle /*dh*/) const
|
||||
{ return false; }
|
||||
|
||||
/// Set simultaneously all the marks of this dart to a given value.
|
||||
void set_dart_marks(Dart_const_handle ADart,
|
||||
|
|
|
|||
|
|
@ -142,6 +142,8 @@ namespace CGAL {
|
|||
CGAL_assertion(i <= dimension);
|
||||
return dh->mf[i]==dh;
|
||||
}
|
||||
bool is_perforated(Dart_const_handle /*dh*/) const
|
||||
{ return false; }
|
||||
|
||||
/// Set simultaneously all the marks of this dart to a given value.
|
||||
void set_dart_marks(Dart_const_handle ADart,
|
||||
|
|
|
|||
|
|
@ -147,26 +147,48 @@ namespace CGAL {
|
|||
Linear_cell_complex_base(const Self& alcc) : Base(alcc)
|
||||
{}
|
||||
|
||||
template < class LCC2 >
|
||||
Linear_cell_complex_base(const LCC2& alcc) : Base(alcc)
|
||||
template <unsigned int d2, unsigned int ambient_dim2, class Traits2,
|
||||
class Items2, class Alloc2,
|
||||
template<unsigned int,class,class,class,class> class CMap2,
|
||||
class Refs2, class Storage2>
|
||||
Linear_cell_complex_base
|
||||
(const Linear_cell_complex_base<d2, ambient_dim2,
|
||||
Traits2, Items2, Alloc2, CMap2, Refs2, Storage2>& alcc) : Base(alcc)
|
||||
{}
|
||||
|
||||
template < class LCC2, typename Converters >
|
||||
Linear_cell_complex_base(const LCC2& alcc, Converters& converters) :
|
||||
template <unsigned int d2, unsigned int ambient_dim2, class Traits2,
|
||||
class Items2, class Alloc2,
|
||||
template<unsigned int,class,class,class,class> class CMap2,
|
||||
class Refs2,
|
||||
class Storage2, typename Converters>
|
||||
Linear_cell_complex_base
|
||||
(const Linear_cell_complex_base<d2, ambient_dim2, Traits2, Items2,
|
||||
Alloc2, CMap2, Refs2, Storage2>& alcc, Converters& converters) :
|
||||
Base(alcc, converters)
|
||||
{}
|
||||
|
||||
template < class LCC2, typename Converters, typename DartInfoConverter >
|
||||
Linear_cell_complex_base(const LCC2& alcc, Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter) :
|
||||
template <unsigned int d2, unsigned int ambient_dim2, class Traits2,
|
||||
class Items2, class Alloc2,
|
||||
template<unsigned int,class,class,class,class> class CMap2,
|
||||
class Refs2, class Storage2, typename Converters,
|
||||
typename DartInfoConverter>
|
||||
Linear_cell_complex_base
|
||||
(const Linear_cell_complex_base<d2, ambient_dim2, Traits2, Items2,
|
||||
Alloc2, CMap2, Refs2, Storage2>& alcc, Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter) :
|
||||
Base(alcc, converters, dartinfoconverter)
|
||||
{}
|
||||
|
||||
template < class LCC2, typename Converters, typename DartInfoConverter,
|
||||
typename Pointconverter >
|
||||
Linear_cell_complex_base(const LCC2& alcc, Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter,
|
||||
const Pointconverter& pointconverter) :
|
||||
template <unsigned int d2, unsigned int ambient_dim2, class Traits2,
|
||||
class Items2, class Alloc2,
|
||||
template<unsigned int,class,class,class,class> class CMap2,
|
||||
class Refs2, class Storage2, typename Converters,
|
||||
typename DartInfoConverter, typename Pointconverter>
|
||||
Linear_cell_complex_base
|
||||
(const Linear_cell_complex_base<d2, ambient_dim2, Traits2, Items2,
|
||||
Alloc2, CMap2, Refs2, Storage2>& alcc, Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter,
|
||||
const Pointconverter& pointconverter) :
|
||||
Base(alcc, converters, dartinfoconverter, pointconverter)
|
||||
{}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
#include <CGAL/Linear_cell_complex_min_items.h>
|
||||
#include <CGAL/Combinatorial_map.h>
|
||||
#include <CGAL/CMap_linear_cell_complex_storages.h>
|
||||
#include <CGAL/boost/graph/properties.h>
|
||||
|
||||
namespace CGAL {
|
||||
|
||||
|
|
@ -100,40 +101,119 @@ namespace CGAL {
|
|||
* @param alcc the linear cell complex to copy.
|
||||
* @post *this is valid.
|
||||
*/
|
||||
#ifdef DOXYGEN_RUNNING
|
||||
Linear_cell_complex_for_combinatorial_map(const Self& alcc) : Base(alcc)
|
||||
{}
|
||||
#endif
|
||||
|
||||
template < class LCC2 >
|
||||
Linear_cell_complex_for_combinatorial_map(const LCC2& alcc) : Base(alcc)
|
||||
template <unsigned int d2, unsigned int ambient_dim2, class Traits2,
|
||||
class Items2, class Alloc2,
|
||||
template<unsigned int,class,class,class,class> class CMap2,
|
||||
class Storage2>
|
||||
Linear_cell_complex_for_combinatorial_map
|
||||
(const Linear_cell_complex_for_combinatorial_map<d2, ambient_dim2,
|
||||
Traits2, Items2, Alloc2, CMap2, Storage2>& alcc) : Base(alcc)
|
||||
{}
|
||||
|
||||
template < class LCC2, typename Converters >
|
||||
Linear_cell_complex_for_combinatorial_map(const LCC2& alcc,
|
||||
Converters& converters) :
|
||||
Base(alcc, converters)
|
||||
template <unsigned int d2, unsigned int ambient_dim2, class Traits2,
|
||||
class Items2, class Alloc2,
|
||||
template<unsigned int,class,class,class,class> class CMap2,
|
||||
class Storage2, typename Converters>
|
||||
Linear_cell_complex_for_combinatorial_map
|
||||
(const Linear_cell_complex_for_combinatorial_map<d2, ambient_dim2,
|
||||
Traits2, Items2, Alloc2, CMap2, Storage2>& alcc,
|
||||
const Converters& converters) : Base(alcc, converters)
|
||||
{}
|
||||
|
||||
template < class LCC2, typename Converters, typename DartInfoConverter >
|
||||
Linear_cell_complex_for_combinatorial_map(const LCC2& alcc,
|
||||
Converters& converters,
|
||||
const DartInfoConverter&
|
||||
dartinfoconverter) :
|
||||
template <unsigned int d2, unsigned int ambient_dim2, class Traits2,
|
||||
class Items2, class Alloc2,
|
||||
template<unsigned int,class,class,class,class> class CMap2,
|
||||
class Storage2, typename Converters, typename DartInfoConverter>
|
||||
Linear_cell_complex_for_combinatorial_map
|
||||
(const Linear_cell_complex_for_combinatorial_map<d2, ambient_dim2,
|
||||
Traits2, Items2, Alloc2, CMap2, Storage2>& alcc,
|
||||
const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter) :
|
||||
Base(alcc, converters, dartinfoconverter)
|
||||
{}
|
||||
|
||||
template < class LCC2, typename Converters, typename DartInfoConverter,
|
||||
typename PointConverter >
|
||||
Linear_cell_complex_for_combinatorial_map(const LCC2& alcc,
|
||||
Converters& converters,
|
||||
const DartInfoConverter&
|
||||
dartinfoconverter,
|
||||
const PointConverter&
|
||||
pointconverter) :
|
||||
template <unsigned int d2, unsigned int ambient_dim2, class Traits2,
|
||||
class Items2, class Alloc2,
|
||||
template<unsigned int,class,class,class,class> class CMap2,
|
||||
class Storage2, typename Converters,
|
||||
typename DartInfoConverter, typename PointConverter>
|
||||
Linear_cell_complex_for_combinatorial_map
|
||||
(const Linear_cell_complex_for_combinatorial_map<d2, ambient_dim2,
|
||||
Traits2, Items2, Alloc2, CMap2, Storage2>& alcc,
|
||||
const Converters& converters, const DartInfoConverter& dartinfoconverter,
|
||||
const PointConverter& pointconverter) :
|
||||
Base(alcc, converters, dartinfoconverter, pointconverter)
|
||||
{}
|
||||
|
||||
Self & operator= (const Self & alcc)
|
||||
{
|
||||
Base::operator=(alcc);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/** Import the given hds which should be a model of an halfedge graph. */
|
||||
template<class HEG, class PointConverter>
|
||||
void import_from_halfedge_graph(const HEG& heg ,
|
||||
const PointConverter& pointconverter,
|
||||
boost::unordered_map
|
||||
<typename boost::graph_traits<HEG>::halfedge_descriptor,
|
||||
Dart_handle>* origin_to_copy=NULL,
|
||||
boost::unordered_map
|
||||
<Dart_handle,
|
||||
typename boost::graph_traits<HEG>::halfedge_descriptor>*
|
||||
copy_to_origin=NULL)
|
||||
|
||||
{
|
||||
boost::unordered_map
|
||||
<typename boost::graph_traits<HEG>::halfedge_descriptor,
|
||||
Dart_handle> local_dartmap;
|
||||
if (origin_to_copy==NULL) // Used local_dartmap if user does not provides its own unordered_map
|
||||
{ origin_to_copy=&local_dartmap; }
|
||||
|
||||
Base::import_from_halfedge_graph(heg, origin_to_copy, copy_to_origin);
|
||||
|
||||
typedef typename boost::property_map<HEG,vertex_point_t>::const_type
|
||||
Point_property_map;
|
||||
Point_property_map ppmap = get(CGAL::vertex_point, heg);
|
||||
|
||||
typename boost::unordered_map
|
||||
<typename boost::graph_traits<HEG>::halfedge_descriptor,
|
||||
Dart_handle>::iterator dartmap_iter, dartmap_iter_end=origin_to_copy->end();
|
||||
for (dartmap_iter=origin_to_copy->begin(); dartmap_iter!=dartmap_iter_end;
|
||||
++dartmap_iter)
|
||||
{
|
||||
if (this->vertex_attribute(dartmap_iter->second)==NULL)
|
||||
{
|
||||
this->set_vertex_attribute(dartmap_iter->second,
|
||||
this->create_vertex_attribute());
|
||||
pointconverter.run(ppmap[source(dartmap_iter->first, heg)],
|
||||
this->point(dartmap_iter->second));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Import the given hds which should be a model of an halfedge graph. */
|
||||
template<class HEG>
|
||||
void import_from_halfedge_graph(const HEG& heg,
|
||||
boost::unordered_map
|
||||
<typename boost::graph_traits<HEG>::halfedge_descriptor,
|
||||
Dart_handle>* origin_to_copy=NULL,
|
||||
boost::unordered_map
|
||||
<Dart_handle,
|
||||
typename boost::graph_traits<HEG>::halfedge_descriptor>*
|
||||
copy_to_origin=NULL)
|
||||
{
|
||||
typedef typename boost::property_traits<typename boost::property_map
|
||||
<HEG, vertex_point_t>::type>::value_type HEG_point;
|
||||
|
||||
CGAL::internal::Set_point_if_possible_cmap<HEG_point, Point> default_point_converter;
|
||||
import_from_halfedge_graph(heg, default_point_converter,
|
||||
origin_to_copy, copy_to_origin);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
} // namespace CGAL
|
||||
|
|
|
|||
|
|
@ -96,40 +96,59 @@ namespace CGAL {
|
|||
* @param alcc the linear cell complex to copy.
|
||||
* @post *this is valid.
|
||||
*/
|
||||
#ifdef DOXYGEN_RUNNING
|
||||
Linear_cell_complex_for_generalized_map(const Self & alcc) : Base(alcc)
|
||||
{}
|
||||
#endif
|
||||
|
||||
template < class LCC2 >
|
||||
Linear_cell_complex_for_generalized_map(const LCC2& alcc) : Base(alcc)
|
||||
template <unsigned int d2, unsigned int ambient_dim2, class Traits2,
|
||||
class Items2, class Alloc2,
|
||||
template<unsigned int,class,class,class,class> class CMap2,
|
||||
class Storage2>
|
||||
Linear_cell_complex_for_generalized_map
|
||||
(const Linear_cell_complex_for_generalized_map<d2, ambient_dim2,
|
||||
Traits2, Items2, Alloc2, CMap2, Storage2>& alcc) : Base(alcc)
|
||||
{}
|
||||
|
||||
template < class LCC2, typename Converters >
|
||||
Linear_cell_complex_for_generalized_map(const LCC2& alcc,
|
||||
Converters& converters) :
|
||||
Base(alcc, converters)
|
||||
template <unsigned int d2, unsigned int ambient_dim2, class Traits2,
|
||||
class Items2, class Alloc2,
|
||||
template<unsigned int,class,class,class,class> class CMap2,
|
||||
class Storage2, typename Converters>
|
||||
Linear_cell_complex_for_generalized_map
|
||||
(const Linear_cell_complex_for_generalized_map<d2, ambient_dim2,
|
||||
Traits2, Items2, Alloc2, CMap2, Storage2>& alcc,
|
||||
const Converters& converters) : Base(alcc, converters)
|
||||
{}
|
||||
|
||||
template < class LCC2, typename Converters, typename DartInfoConverter >
|
||||
Linear_cell_complex_for_generalized_map(const LCC2& alcc,
|
||||
Converters& converters,
|
||||
const DartInfoConverter&
|
||||
dartinfoconverter) :
|
||||
template <unsigned int d2, unsigned int ambient_dim2, class Traits2,
|
||||
class Items2, class Alloc2,
|
||||
template<unsigned int,class,class,class,class> class CMap2,
|
||||
class Storage2, typename Converters, typename DartInfoConverter>
|
||||
Linear_cell_complex_for_generalized_map
|
||||
(const Linear_cell_complex_for_generalized_map<d2, ambient_dim2,
|
||||
Traits2, Items2, Alloc2, CMap2, Storage2>& alcc,
|
||||
const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter) :
|
||||
Base(alcc, converters, dartinfoconverter)
|
||||
{}
|
||||
|
||||
template < class LCC2, typename Converters, typename DartInfoConverter,
|
||||
typename PointConverter >
|
||||
Linear_cell_complex_for_generalized_map(const LCC2& alcc,
|
||||
Converters& converters,
|
||||
const DartInfoConverter&
|
||||
dartinfoconverter,
|
||||
const PointConverter&
|
||||
pointconverter) :
|
||||
template <unsigned int d2, unsigned int ambient_dim2, class Traits2,
|
||||
class Items2, class Alloc2,
|
||||
template<unsigned int,class,class,class,class> class CMap2,
|
||||
class Storage2, typename Converters, typename DartInfoConverter,
|
||||
typename PointConverter>
|
||||
Linear_cell_complex_for_generalized_map
|
||||
(const Linear_cell_complex_for_generalized_map<d2, ambient_dim2,
|
||||
Traits2, Items2, Alloc2, CMap2, Storage2>& alcc,
|
||||
const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter,
|
||||
const PointConverter& pointconverter) :
|
||||
Base(alcc, converters, dartinfoconverter, pointconverter)
|
||||
{}
|
||||
|
||||
Self & operator= (const Self & alcc)
|
||||
{
|
||||
Base::operator=(alcc);
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace CGAL
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
#ifdef CGAL_USE_BASIC_VIEWER
|
||||
|
||||
#include <CGAL/Linear_cell_complex_base.h>
|
||||
#include <CGAL/Linear_cell_complex_operations.h>
|
||||
#include <CGAL/Random.h>
|
||||
|
||||
namespace CGAL
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
#ifndef CGAL_POLYHEDRON_3_TO_LCC_H
|
||||
#define CGAL_POLYHEDRON_3_TO_LCC_H
|
||||
|
||||
#include <CGAL/Polyhedron_3.h>
|
||||
#include <CGAL/assertions.h>
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,23 @@
|
|||
project(Surface_mesh_topology_Benchmarks)
|
||||
|
||||
cmake_minimum_required(VERSION 3.1)
|
||||
|
||||
find_package(CGAL)
|
||||
|
||||
# add_definitions(-DCGAL_TRACE_PATH_TESTS)
|
||||
# add_definitions(-DCGAL_TRACE_CMAP_TOOLS)
|
||||
|
||||
if ( NOT CGAL_FOUND )
|
||||
|
||||
message(FATAL_ERROR "This program requires the CGAL library, and will not be compiled.")
|
||||
|
||||
endif()
|
||||
|
||||
set(SOURCE_FILES
|
||||
quadrangulation_computation_benchmarks.cpp
|
||||
path_homotopy_with_schema.cpp
|
||||
)
|
||||
|
||||
foreach(cppfile ${SOURCE_FILES})
|
||||
create_single_source_cgal_program("${cppfile}")
|
||||
endforeach()
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Requirement:
|
||||
# The three files res-quadrangulation-computation.txt, res-path-homotopy.txt, res-polygonal-schema.txt must exist (result of the script run-benchmarks.sh)
|
||||
|
||||
ficIn="res-path-homotopy.txt"
|
||||
|
||||
function extract_info_for_reduced_map()
|
||||
{
|
||||
if [ $# -ne 2 ]
|
||||
then
|
||||
echo "ERROR in extract_info_for_reduced_map: need two arguments."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ficIn="${1}"
|
||||
ficOut="${2}"
|
||||
|
||||
# 0) Copy old file
|
||||
if [ -f "${ficOut}" ]
|
||||
then
|
||||
cp -f "${ficOut}" "${ficOut}.COPY"
|
||||
fi
|
||||
|
||||
# 1) Extract 2-map size and simplification times
|
||||
echo "# ==========#INITIAL-MAP========== ==========#REDUCED-MAP========" > "${ficOut}"
|
||||
echo "#darts #vertices #edges #faces #darts #vertices #edges #faces GlobalTime" >> "${ficOut}"
|
||||
|
||||
# 2.1) Extract the different info.
|
||||
grep "Initial map:" "${ficIn}" | cut -d '=' -f 2 | cut -d ',' -f 1 > restmp1.txt
|
||||
grep "Initial map:" "${ficIn}" | cut -d '=' -f 3 | cut -d ',' -f 1 > restmp2.txt
|
||||
grep "Initial map:" "${ficIn}" | cut -d '=' -f 4 | cut -d ',' -f 1 > restmp3.txt
|
||||
grep "Initial map:" "${ficIn}" | cut -d '=' -f 5 | cut -d ',' -f 1 > restmp4.txt
|
||||
|
||||
grep "Reduced map:" "${ficIn}" | cut -d '=' -f 2 | cut -d ',' -f 1 > restmp5.txt
|
||||
grep "Reduced map:" "${ficIn}" | cut -d '=' -f 3 | cut -d ',' -f 1 > restmp6.txt
|
||||
grep "Reduced map:" "${ficIn}" | cut -d '=' -f 4 | cut -d ',' -f 1 > restmp7.txt
|
||||
grep "Reduced map:" "${ficIn}" | cut -d '=' -f 5 | cut -d ',' -f 1 > restmp8.txt
|
||||
|
||||
grep "\[TIME\] Total time for computation of reduced map: " "${ficIn}" | cut -d ' ' -f 9 > restmp9.txt
|
||||
|
||||
# 2.2) Regroup the different info in different columns of a same file.
|
||||
paste -d '\t' restmp1.txt restmp2.txt restmp3.txt restmp4.txt restmp5.txt restmp6.txt restmp7.txt restmp8.txt restmp9.txt >> "${ficOut}"
|
||||
|
||||
# 3) Erase temp files
|
||||
rm -f restmp1.txt restmp2.txt restmp3.txt restmp4.txt restmp5.txt restmp6.txt restmp7.txt restmp8.txt restmp9.txt
|
||||
}
|
||||
|
||||
function extract_time_path_homotopy()
|
||||
{
|
||||
if [ $# -ne 2 ]
|
||||
then
|
||||
echo "ERROR in extract_time_path_homotopy: need two arguments."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ficIn="${1}"
|
||||
ficOut="${2}"
|
||||
|
||||
# 0) Copy old file
|
||||
if [ -f "${ficOut}" ]
|
||||
then
|
||||
cp -f "${ficOut}" "${ficOut}.COPY"
|
||||
fi
|
||||
|
||||
# 1) Extract computation times of homotopy tests.
|
||||
|
||||
# 1.1) Extract the different info.
|
||||
echo "Path1" > restmp1.txt
|
||||
grep "Random seed: " "${ficIn}" | cut -d ' ' -f 6 >> restmp1.txt
|
||||
echo "Path2" > restmp2.txt
|
||||
grep "Random seed: " "${ficIn}" | cut -d ' ' -f 12 >> restmp2.txt
|
||||
echo "TimeContractible" > restmp3.txt
|
||||
grep "\[TIME\] is_contractible: " "${ficIn}" | cut -d ' ' -f 3 >> restmp3.txt
|
||||
echo "TimeHomotopy" > restmp4.txt
|
||||
grep "\[TIME\] are_freely_homotopic: " "${ficIn}" | cut -d ' ' -f 3 >> restmp4.txt
|
||||
|
||||
# 1.2) Regroup the different info in different columns of a same file.
|
||||
echo "# Size_of_path1; Size_of_path 2; time_of_contractible_test; time_of_homotopy_test." > "${ficOut}"
|
||||
paste -d '\t' restmp1.txt restmp2.txt restmp3.txt restmp4.txt >> "${ficOut}"
|
||||
|
||||
# 2) Erase temp files
|
||||
rm -f restmp1.txt restmp2.txt restmp3.txt restmp4.txt
|
||||
}
|
||||
|
||||
# Bench 1
|
||||
extract_info_for_reduced_map "res-quadrangulation-computation.txt" "computation-time-reduce-surface.dat"
|
||||
|
||||
# Bench 2
|
||||
extract_time_path_homotopy "res-path-homotopy.txt" "computation-time-path-homotopy.dat"
|
||||
|
||||
# Bench 3
|
||||
extract_time_path_homotopy "res-polygonal-schema.txt" "computation-time-polygonal-schema.dat"
|
||||
|
|
@ -0,0 +1,202 @@
|
|||
# Size_of_path1; Size_of_path 2; time_of_contractible_test; time_of_homotopy_test.
|
||||
Path1 Path2 TimeContractible TimeHomotopy
|
||||
1524414 1530418 3.86554 7.8444
|
||||
1049124 1050087 2.83135 5.60931
|
||||
2509006 2513362 6.13668 12.624
|
||||
2224823 2232443 5.40251 10.484
|
||||
1008888 1018619 2.38837 4.79886
|
||||
1332065 1339611 3.22555 6.41267
|
||||
3561764 3562141 8.05207 16.0708
|
||||
2438898 2442370 5.71337 11.477
|
||||
1914057 1919940 4.77898 9.59951
|
||||
2551120 2555476 6.3078 12.6345
|
||||
64526 70685 0.173418 0.361924
|
||||
492594 498396 1.26223 2.53348
|
||||
571858 580868 1.37788 2.7772
|
||||
38840 43934 0.095079 0.203706
|
||||
15721 22405 0.052084 0.12308
|
||||
9948224 9954782 23.2806 46.5412
|
||||
1122183 1126957 2.45848 4.81015
|
||||
1459662 1462867 3.35651 6.8351
|
||||
1329962 1333900 3.47501 7.01742
|
||||
117030 123624 0.265891 0.552161
|
||||
1047344 1054974 2.62549 5.27579
|
||||
6539021 6542800 15.1482 29.9774
|
||||
380967 385239 0.911951 1.78487
|
||||
41353 50077 0.115257 0.254276
|
||||
3898884 3908780 8.92204 18.0542
|
||||
558908 563296 1.44482 2.89175
|
||||
4623570 4623770 12.0801 23.8146
|
||||
2627660 2633041 6.63529 13.3076
|
||||
312744 313066 0.820126 1.65689
|
||||
33012 34720 0.108203 0.230179
|
||||
5128852 5133062 11.6124 23.6011
|
||||
8652 11181 0.026449 0.060392
|
||||
90040 90840 0.216791 0.433557
|
||||
325686 327807 0.873464 1.75005
|
||||
4408 4618 0.01283 0.026318
|
||||
2047709 2051939 5.35872 10.6866
|
||||
2929154 2934675 7.39593 14.586
|
||||
2287508 2290644 5.55511 10.9367
|
||||
20056 25590 0.061392 0.135105
|
||||
12729 18273 0.025678 0.061112
|
||||
8756 11625 0.028232 0.066159
|
||||
1133402 1141097 2.82907 5.799
|
||||
887726 891707 2.14112 4.27661
|
||||
190541 196368 0.443466 0.889504
|
||||
784656 793928 1.94601 3.97098
|
||||
27886 35939 0.093204 0.205428
|
||||
166193 174683 0.481829 0.959715
|
||||
1634955 1637981 4.05175 8.12494
|
||||
786667 787481 2.16864 4.30371
|
||||
3058683 3066220 7.43228 14.9763
|
||||
853145 854664 1.91083 3.84597
|
||||
915736 924315 2.21234 4.46275
|
||||
2064414 2068788 4.54639 9.07704
|
||||
1498675 1506208 3.47994 7.0999
|
||||
11465 13867 0.034742 0.074569
|
||||
1500 5543 0.004261 0.019447
|
||||
1460356 1465976 3.44903 6.99999
|
||||
3918177 3922313 9.90904 19.7113
|
||||
155505 159968 0.419477 0.853855
|
||||
5997 12540 0.012746 0.037545
|
||||
7791265 7796654 18.2438 36.3007
|
||||
3017926 3020885 7.27202 14.4281
|
||||
2253 11462 0.007446 0.043296
|
||||
1344480 1349288 3.13805 6.35775
|
||||
218100 226787 0.468398 0.96952
|
||||
19859 25206 0.061167 0.136706
|
||||
1570055 1572437 3.70686 7.42759
|
||||
1147928 1157287 3.11372 6.27166
|
||||
4267 12199 0.013633 0.05177
|
||||
794927 804905 1.94774 3.91127
|
||||
3118323 3123949 7.4862 14.8817
|
||||
345935 348709 0.961987 1.93947
|
||||
5251784 5257377 12.0356 24.3891
|
||||
425488 434411 1.0689 2.21017
|
||||
1025760 1033772 2.47379 4.96134
|
||||
2667536 2670807 5.99514 12.1269
|
||||
1020 10923 0.003334 0.03613
|
||||
41545 47295 0.13632 0.285656
|
||||
1586593 1595375 3.89181 7.88352
|
||||
2356504 2366079 5.84226 11.6113
|
||||
698817 703240 1.81419 3.64923
|
||||
1498299 1501573 3.70302 7.44321
|
||||
70491 78080 0.208676 0.436235
|
||||
3205404 3213809 7.6062 15.2643
|
||||
137069 143418 0.331668 0.684771
|
||||
185021 193489 0.456013 0.94372
|
||||
10514 14184 0.03405 0.079866
|
||||
258978 263450 0.654929 1.31629
|
||||
188212 189028 0.572463 1.14209
|
||||
1655535 1659255 4.05374 8.14516
|
||||
20552 29551 0.046739 0.113477
|
||||
6858 12047 0.022151 0.059419
|
||||
231344 234092 0.522525 1.05193
|
||||
277089 283900 0.668141 1.3473
|
||||
1421926 1428857 3.38821 6.82178
|
||||
6803208 6804143 15.5407 31.2071
|
||||
4341787 4342468 10.8756 21.6696
|
||||
9820 11913 0.024156 0.051882
|
||||
488145 491953 1.09079 2.19668
|
||||
193168 202125 0.505617 1.0208
|
||||
134408 144351 0.269846 0.569942
|
||||
72262 76189 0.158625 0.328027
|
||||
1163327 1167912 2.53666 5.09627
|
||||
95971 101468 0.22881 0.477161
|
||||
94754 98378 0.248858 0.51487
|
||||
1619634 1626306 3.6389 7.25762
|
||||
1919 8130 0.00373 0.018792
|
||||
169566 169802 0.375949 0.766477
|
||||
52578 59065 0.119055 0.25467
|
||||
327514 327939 0.652794 1.42988
|
||||
146008 155458 0.305657 0.660986
|
||||
590498 596057 1.32982 2.69134
|
||||
144709 145509 0.372597 0.744431
|
||||
49839 52970 0.11164 0.229819
|
||||
2257 4753 0.005862 0.018162
|
||||
772205 779198 1.68543 3.38799
|
||||
209107 210069 0.512779 1.07825
|
||||
13950 19070 0.044721 0.10062
|
||||
148524 156085 0.361171 0.75974
|
||||
15715 20316 0.038191 0.085281
|
||||
341581 344135 0.828873 1.65824
|
||||
111707 114165 0.296571 0.598192
|
||||
285513 291355 0.605756 1.24273
|
||||
12753 17702 0.024112 0.058651
|
||||
261253 263576 0.618294 1.25177
|
||||
18513 28416 0.052058 0.130877
|
||||
158453 163209 0.358461 0.750459
|
||||
101060 103049 0.281742 0.608572
|
||||
19681 22059 0.043818 0.09175
|
||||
636056 637157 1.43374 2.91012
|
||||
26136 29879 0.068484 0.145167
|
||||
10689 15705 0.033721 0.083634
|
||||
28682 32541 0.068278 0.139902
|
||||
13712 16507 0.030123 0.06685
|
||||
36802 39073 0.085301 0.192078
|
||||
131822 135049 0.330327 0.657221
|
||||
15369 15546 0.040625 0.080504
|
||||
1197160 1204876 2.66886 5.37277
|
||||
47253 47995 0.133238 0.264456
|
||||
48388 49535 0.099999 0.198439
|
||||
1329710 1332418 3.19551 6.3238
|
||||
398055 398563 0.898438 1.81173
|
||||
10626 14753 0.021253 0.049661
|
||||
38241 47721 0.098851 0.226109
|
||||
713191 718785 1.57574 3.37537
|
||||
17118 19578 0.042418 0.089777
|
||||
20334 20581 0.049075 0.087179
|
||||
425156 425864 0.998048 1.96725
|
||||
681002 685169 1.56764 3.13846
|
||||
14736 23593 0.032963 0.083728
|
||||
66104 73386 0.144509 0.312302
|
||||
126934 133243 0.304479 0.637488
|
||||
173684 182567 0.380653 0.806827
|
||||
216994 220747 0.51478 1.05948
|
||||
13280 16356 0.030476 0.066812
|
||||
24361 31632 0.057538 0.129382
|
||||
287887 290771 0.643613 1.31868
|
||||
13682 21002 0.032396 0.08104
|
||||
43631 51969 0.085418 0.192622
|
||||
38593 42276 0.095875 0.202057
|
||||
52163 61186 0.1213 0.267168
|
||||
30870 31893 0.073838 0.169932
|
||||
23218 26791 0.048905 0.106194
|
||||
39019 39369 0.106431 0.193006
|
||||
18964 27272 0.056686 0.13645
|
||||
11732 20138 0.035749 0.106614
|
||||
2756 8825 0.006236 0.024911
|
||||
85872 86320 0.209328 0.422786
|
||||
18111 21500 0.040477 0.086777
|
||||
39323 42317 0.11067 0.242744
|
||||
110949 115416 0.280661 0.58945
|
||||
271220 276460 0.598784 1.22255
|
||||
135663 143683 0.312725 0.664022
|
||||
44947 48769 0.085369 0.185623
|
||||
17174 22804 0.040513 0.091902
|
||||
19647 22235 0.052287 0.112104
|
||||
400748 408506 0.876389 1.7828
|
||||
71523 71930 0.14962 0.338061
|
||||
223197 228220 0.533326 1.09191
|
||||
2601935 2603641 5.50732 10.8151
|
||||
516647 521009 1.14199 2.2921
|
||||
1042972 1044599 2.29914 4.62039
|
||||
104943 114537 0.231351 0.498831
|
||||
1513 9121 0.004627 0.031175
|
||||
142475 145066 0.343284 0.726973
|
||||
6627 10613 0.019339 0.049796
|
||||
448219 449595 0.946231 1.917
|
||||
219376 223420 0.51011 1.05122
|
||||
370410 371342 0.889112 1.78276
|
||||
18643 19126 0.041526 0.08436
|
||||
17322 18198 0.032815 0.066431
|
||||
16556 25713 0.039275 0.101854
|
||||
8885 13720 0.018419 0.046641
|
||||
43760 51887 0.116647 0.262684
|
||||
33747 41820 0.077442 0.17862
|
||||
73982 79198 0.194931 0.409284
|
||||
138225 141825 0.298229 0.628531
|
||||
25385 34450 0.058727 0.138786
|
||||
737872 744717 1.68372 3.4144
|
||||
11975 20410 0.027492 0.075561
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
# set terminal postscript eps color 20 lw 3
|
||||
# set output '| epstopdf -f -o=computation-time-path-homotopy.pdf'
|
||||
|
||||
set terminal svg fname 'Verdana' lw 2 # size 640 480 fname 'Verdana' lw 3
|
||||
set output 'computation-time-path-homotopy.svg'
|
||||
|
||||
set key autotitle columnheader
|
||||
|
||||
set ylabel "Time (sec)"
|
||||
set xlabel "Path lengths"
|
||||
set key left
|
||||
|
||||
# set xtics (0, '' 1, 2, 4, 8, 16, 32, 64)
|
||||
# set ytics (4, 16, 64, 256, 1024, 4096, "16,384" 16384)
|
||||
|
||||
# set logscale x 10
|
||||
# set logscale y 10
|
||||
|
||||
set xrange [0:20100000]
|
||||
# set yrange [0:250]
|
||||
|
||||
set xtics ('5,000,000' 5000000, '10,000,000' 10000000, '15,000,000' 15000000, '20,000,000' 20000000)
|
||||
|
||||
# set auto x
|
||||
|
||||
FIT_LIMIT=1.e-14
|
||||
f(x) = m*x + b
|
||||
fit f(x) 'computation-time-path-homotopy.dat' using ($1+$2):4 via m,b
|
||||
|
||||
plot 'computation-time-path-homotopy.dat' using ($1+$2):4 with points title "Homotopy test", f(x) title 'Model Fit'
|
||||
|
||||
|
|
@ -0,0 +1,212 @@
|
|||
# Size_of_path1; Size_of_path 2; time_of_contractible_test; time_of_homotopy_test.
|
||||
Path1 Path2 TimeContractible TimeHomotopy
|
||||
10 1810 1.2e-05 0.001005
|
||||
10 1810 9e-06 0.000968
|
||||
10 1810 8e-06 0.001003
|
||||
10 1810 8e-06 0.000963
|
||||
10 1810 7e-06 0.000966
|
||||
10 1810 9e-06 0.001177
|
||||
10 1810 7e-06 0.000996
|
||||
10 1810 8e-06 0.001022
|
||||
10 1810 8e-06 0.000979
|
||||
10 1810 7e-06 0.000987
|
||||
20 1820 1.8e-05 0.001095
|
||||
20 1820 1.4e-05 0.00105
|
||||
20 1820 1.2e-05 0.001062
|
||||
20 1820 1.7e-05 0.001035
|
||||
20 1820 1.3e-05 0.001049
|
||||
20 1820 1.2e-05 0.00101
|
||||
20 1820 1.3e-05 0.001002
|
||||
20 1820 1.8e-05 0.001019
|
||||
20 1820 2.2e-05 0.001037
|
||||
20 1820 1.4e-05 0.001149
|
||||
30 1830 2.2e-05 0.001108
|
||||
30 1830 1.8e-05 0.001021
|
||||
30 1830 2.2e-05 0.001016
|
||||
30 1830 2.1e-05 0.001083
|
||||
30 1830 2e-05 0.001038
|
||||
30 1830 2e-05 0.001031
|
||||
30 1830 1.9e-05 0.001087
|
||||
30 1830 2.2e-05 0.001032
|
||||
30 1830 2e-05 0.001021
|
||||
30 1830 1.8e-05 0.001027
|
||||
100 1900 6.2e-05 0.001295
|
||||
100 1900 5.6e-05 0.001204
|
||||
100 1900 5.5e-05 0.001213
|
||||
100 1900 5.9e-05 0.001151
|
||||
100 1900 5.5e-05 0.001145
|
||||
100 1900 5.9e-05 0.001107
|
||||
100 1900 5.7e-05 0.001101
|
||||
100 1900 5.7e-05 0.001154
|
||||
100 1900 5.3e-05 0.001134
|
||||
100 1900 5.8e-05 0.001139
|
||||
200 2000 0.000108 0.001324
|
||||
200 2000 0.000127 0.001278
|
||||
200 2000 0.000103 0.001273
|
||||
200 2000 0.000106 0.001214
|
||||
200 2000 9.7e-05 0.001194
|
||||
200 2000 0.000102 0.001204
|
||||
200 2000 0.0001 0.001208
|
||||
200 2000 0.000106 0
|
||||
200 2000 0 0
|
||||
200 2000 0 0.001102
|
||||
300 2100 0.00015 0.001414
|
||||
300 2100 0.000156 0.001383
|
||||
300 2100 0.00015 0.001383
|
||||
300 2100 0.000164 0.001353
|
||||
300 2100 0.000151 0.001377
|
||||
300 2100 0.000148 0.00132
|
||||
300 2100 0.000189 0.001327
|
||||
300 2100 0.000153 0.001346
|
||||
300 2100 0.000148 0.001338
|
||||
300 2100 0.000149 0.001316
|
||||
1000 2800 0.000503 0.00274
|
||||
1000 2800 0.000515 0.00225
|
||||
1000 2800 0.000503 0.002229
|
||||
1000 2800 0.000487 0.002148
|
||||
1000 2800 0.000506 0.002183
|
||||
1000 2800 0.0005 0.002198
|
||||
1000 2800 0.000524 0.002243
|
||||
1000 2800 0.000476 0.002138
|
||||
1000 2800 0.000519 0.00216
|
||||
1000 2800 0.000508 0.002289
|
||||
2000 3800 0.001098 0.003557
|
||||
2000 3800 0.001039 0.003471
|
||||
2000 3800 0.001114 0.003608
|
||||
2000 3800 0.001052 0.0035
|
||||
2000 3800 0.001065 0.003567
|
||||
2000 3800 0.001091 0.003504
|
||||
2000 3800 0.001089 0.003487
|
||||
2000 3800 0.001035 0.003462
|
||||
2000 3800 0.001044 0.003641
|
||||
2000 3800 0.001071 0.003581
|
||||
3000 4800 0.001588 0.004812
|
||||
3000 4800 0.001464 0.00467
|
||||
3000 4800 0.001528 0.004638
|
||||
3000 4800 0.001537 0.004624
|
||||
3000 4800 0.001567 0.004616
|
||||
3000 4800 0.0015 0.004668
|
||||
3000 4800 0.001511 0.004656
|
||||
3000 4800 0.001499 0.004802
|
||||
3000 4800 0.001506 0.004569
|
||||
3000 4800 0.001547 0.004533
|
||||
10000 11800 0.005356 0.013876
|
||||
10000 11800 0.005086 0.013546
|
||||
10000 11800 0.005001 0.013021
|
||||
10000 11800 0.004986 0.013122
|
||||
10000 11800 0.005043 0.01331
|
||||
10000 11800 0.00499 0.013371
|
||||
10000 11800 0.005031 0.009351
|
||||
10000 11800 0.004947 0.012935
|
||||
10000 11800 0.005056 0.013268
|
||||
10000 11800 0.00501 0.012934
|
||||
20000 21800 0.010521 0.028003
|
||||
20000 21800 0.010399 0.02753
|
||||
20000 21800 0.010433 0.027865
|
||||
20000 21800 0.010353 0.023407
|
||||
20000 21800 0.010198 0.028186
|
||||
20000 21800 0.010343 0.027859
|
||||
20000 21800 0.010273 0.029628
|
||||
20000 21800 0.010566 0.027236
|
||||
20000 21800 0.010242 0.026748
|
||||
20000 21800 0.01086 0.028129
|
||||
30000 31800 0.015946 0.043957
|
||||
30000 31800 0.015459 0.041385
|
||||
30000 31800 0.016125 0.038053
|
||||
30000 31800 0.015935 0.043414
|
||||
30000 31800 0.015291 0.04098
|
||||
30000 31800 0.015353 0.042937
|
||||
30000 31800 0.017732 0.045088
|
||||
30000 31800 0.015587 0.041879
|
||||
30000 31800 0.015839 0.041111
|
||||
30000 31800 0.016299 0.045976
|
||||
100000 101800 0.056463 0.17237
|
||||
100000 101800 0.054943 0.180977
|
||||
100000 101800 0.055873 0.171254
|
||||
100000 101800 0.053753 0.171383
|
||||
100000 101800 0.055899 0.171538
|
||||
100000 101800 0.054506 0.178545
|
||||
100000 101800 0.05419 0.171793
|
||||
100000 101800 0.055006 0.185616
|
||||
100000 101800 0.055066 0.174076
|
||||
100000 101800 0.055227 0.189212
|
||||
200000 201800 0.113193 0.251366
|
||||
200000 201800 0.053804 0.188959
|
||||
200000 201800 0.065313 0.319781
|
||||
200000 201800 0.11272 0.339641
|
||||
200000 201800 0.112057 0.347156
|
||||
200000 201800 0.109281 0.340843
|
||||
200000 201800 0.108663 0.344816
|
||||
200000 201800 0.12226 0.366892
|
||||
200000 201800 0.116914 0.375243
|
||||
200000 201800 0.109202 0.342457
|
||||
300000 301800 0.165865 0.524276
|
||||
300000 301800 0.161986 0.52858
|
||||
300000 301800 0.164922 0.531664
|
||||
300000 301800 0.166501 0.529451
|
||||
300000 301800 0.165578 0.532124
|
||||
300000 301800 0.166458 0.537297
|
||||
300000 301800 0.165786 0.532855
|
||||
300000 301800 0.165027 0.55081
|
||||
300000 301800 0.166903 0.535346
|
||||
300000 301800 0.16556 0.542188
|
||||
1000000 1001800 0.565789 1.7571
|
||||
1000000 1001800 0.555874 1.73021
|
||||
1000000 1001800 0.545865 1.78313
|
||||
1000000 1001800 0.567576 1.75944
|
||||
1000000 1001800 0.584859 1.77367
|
||||
1000000 1001800 0.525251 1.71673
|
||||
1000000 1001800 0.568166 1.64886
|
||||
1000000 1001800 0.538682 1.71856
|
||||
1000000 1001800 0.575029 1.67964
|
||||
1000000 1001800 0.548759 1.75386
|
||||
2000000 2001800 1.07172 3.30467
|
||||
2000000 2001800 1.00794 3.21761
|
||||
2000000 2001800 1.04292 3.43482
|
||||
2000000 2001800 1.10887 3.44661
|
||||
2000000 2001800 1.10033 3.49517
|
||||
2000000 2001800 1.10725 3.48497
|
||||
2000000 2001800 1.13176 3.46857
|
||||
2000000 2001800 1.11183 3.52759
|
||||
2000000 2001800 1.12338 3.41028
|
||||
2000000 2001800 1.0625 3.4078
|
||||
3000000 3001800 1.61675 5.23394
|
||||
3000000 3001800 1.76362 5.39348
|
||||
3000000 3001800 1.70443 5.38821
|
||||
3000000 3001800 1.79035 5.44008
|
||||
3000000 3001800 1.79136 5.56954
|
||||
3000000 3001800 1.7848 5.48245
|
||||
3000000 3001800 1.7496 5.512
|
||||
3000000 3001800 1.72438 5.4148
|
||||
3000000 3001800 1.65999 5.21928
|
||||
3000000 3001800 1.59595 4.85017
|
||||
10000000 10001800 5.66762 17.7623
|
||||
10000000 10001800 5.35138 17.0192
|
||||
10000000 10001800 5.6751 17.2393
|
||||
10000000 10001800 5.67143 16.4106
|
||||
10000000 10001800 5.66773 17.6798
|
||||
10000000 10001800 5.63388 16.511
|
||||
10000000 10001800 5.64777 17.7845
|
||||
10000000 10001800 5.57198 16.1655
|
||||
10000000 10001800 5.58956 17.3209
|
||||
10000000 10001800 5.61045 16.1997
|
||||
20000000 20001800 11.2896 33.2624
|
||||
20000000 20001800 10.8629 32.7729
|
||||
20000000 20001800 10.6456 32.64
|
||||
20000000 20001800 10.7267 32.7883
|
||||
20000000 20001800 10.7952 33.4828
|
||||
20000000 20001800 10.8942 33.3988
|
||||
20000000 20001800 11.1634 33.8661
|
||||
20000000 20001800 10.8488 32.7967
|
||||
20000000 20001800 10.805 32.5927
|
||||
20000000 20001800 10.6542 33.3069
|
||||
30000000 30001800 16.8741 51.2028
|
||||
30000000 30001800 16.4561 50.1288
|
||||
30000000 30001800 16.031 51.1833
|
||||
30000000 30001800 16.4791 51.4586
|
||||
30000000 30001800 16.5506 49.4669
|
||||
30000000 30001800 16.4287 50.4364
|
||||
30000000 30001800 17.0067 51.1537
|
||||
30000000 30001800 16.4827 51.8852
|
||||
30000000 30001800 17.0735 51.4021
|
||||
30000000 30001800 16.1387 51.3036
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
# set terminal postscript eps color 20 lw 3
|
||||
# set output '| epstopdf -f -o=computation-time-polygonal-schema.pdf'
|
||||
|
||||
set terminal svg fname 'Verdana' lw 2 # size 640 480 fname 'Verdana' lw 3
|
||||
set output 'computation-time-polygonal-schema.svg'
|
||||
|
||||
set key autotitle columnheader
|
||||
|
||||
set ylabel "Time (sec)"
|
||||
set xlabel "Path lengths"
|
||||
set key left
|
||||
|
||||
# set xtics (0, '' 1, 2, 4, 8, 16, 32, 64)
|
||||
# set ytics (4, 16, 64, 256, 1024, 4096, "16,384" 16384)
|
||||
|
||||
# set logscale x 10
|
||||
# set logscale y 10
|
||||
|
||||
set xrange [0:62000000]
|
||||
# set yrange [0:250]
|
||||
|
||||
# set xtics ('5,000,000' 5000000, '10,000,000' 10000000, '15,000,000' 15000000, '20,000,000' 20000000, '25,000,000' 25000000, '30,000,000' 30000000)
|
||||
set xtics ('10,000,000' 10000000, '20,000,000' 20000000, '30,000,000' 30000000, '40,000,000' 40000000, '50,000,000' 50000000, '60,000,000' 60000000)
|
||||
|
||||
# set auto x
|
||||
|
||||
FIT_LIMIT=1.e-14
|
||||
f(x) = m*x + b
|
||||
fit f(x) 'computation-time-polygonal-schema.dat' using ($1+$2):4 via m,b
|
||||
|
||||
plot 'computation-time-polygonal-schema.dat' using ($1+$2):4 with points title "Homotopy test", f(x) title 'Model Fit'
|
||||
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
# ==========#INITIAL-MAP========== ==========#REDUCED-MAP========
|
||||
#darts #vertices #edges #faces #darts #vertices #edges #faces GlobalTime
|
||||
12023616 2003932 6011808 4007872 24 2 12 6 13.5703
|
||||
5296164 882954 2648082 1765388 13112 3538 6556 3278 5.37898
|
||||
8012604 1335436 4006302 2670868 0 0 0 0 4.72275
|
||||
205662 33871 102831 68554 1632 2 816 408 0.154715
|
||||
334926 55617 167463 111642 824 2 412 206 0.284387
|
||||
310740 50528 155370 103580 5056 2 2528 1264 0.290279
|
||||
172800 28564 86400 57600 952 2 476 238 0.137383
|
||||
694992 115612 347496 231664 888 2 444 222 0.67383
|
||||
3298422 548955 1649211 1099474 3136 2 1568 784 3.14391
|
||||
16326 2491 8163 5442 928 2 464 232 0.006399
|
||||
38292 5488 19146 12764 3584 2 1792 896 0.018229
|
||||
11532 1684 5766 3844 960 2 480 240 0.004556
|
||||
16188 2460 8094 5396 960 2 480 240 0.006134
|
||||
1037988 172466 518994 345996 2136 2 1068 534 0.987253
|
||||
97644 15520 48822 32548 3024 2 1512 756 0.061761
|
||||
9186 1311 4593 3062 888 2 444 222 0.004214
|
||||
11520 1608 5760 3840 1256 2 628 314 0.00465
|
||||
29676 4716 14838 9892 928 2 464 232 0.013347
|
||||
334212 55498 167106 111404 824 2 412 206 0.276585
|
||||
197493 33955 100736 65831 2594 211 1297 690 0.148973
|
||||
11079 1687 5650 3693 892 5 446 203 0.004537
|
||||
321591 55737 164019 107197 3050 367 1525 956 0.275295
|
||||
298413 50589 152202 99471 5672 161 2836 1413 0.267131
|
||||
165912 28588 84592 55304 1742 90 871 545 0.140701
|
||||
667356 115730 340370 222452 5712 638 2856 1998 0.659971
|
||||
3167334 549481 1615459 1055778 26678 3121 13339 9436 3.25409
|
||||
15681 2493 7993 5227 880 9 440 201 0.006591
|
||||
36780 5494 18750 12260 3372 19 1686 775 0.020382
|
||||
15555 2468 7932 5185 948 13 474 225 0.006666
|
||||
996714 172645 508357 332238 9820 1247 4910 3131 1.02332
|
||||
93777 15548 47826 31259 3200 61 1600 787 0.061693
|
||||
8826 1315 4501 2942 822 7 411 186 0.003816
|
||||
11064 1614 5646 3688 1146 4 573 257 0.004506
|
||||
28500 4727 14534 9500 918 20 459 211 0.011759
|
||||
320889 55616 163663 106963 3042 362 1521 959 0.276335
|
||||
3263148 543652 1631574 1087716 832 2 416 208 3.54039
|
||||
2110536 351750 1055268 703512 32 2 16 8 2.03018
|
||||
30000000 4999996 15000000 10000000 24 2 12 6 33.841
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
# set terminal postscript eps color 20 lw 3
|
||||
# set output '| epstopdf -f -o=computation-time-reduce-surface.pdf'
|
||||
|
||||
set terminal svg fname 'Verdana' lw 2 # size 640 480 fname 'Verdana' lw 3
|
||||
set output 'computation-time-reduce-surface.svg'
|
||||
|
||||
set key autotitle columnheader
|
||||
|
||||
set ylabel "Time (sec)"
|
||||
set xlabel "#Darts"
|
||||
set key left
|
||||
|
||||
# set xtics (0, '' 1, 2, 4, 8, 16, 32, 64)
|
||||
#set ytics (0, 30, 60, 90, 120, 150, 180,200)
|
||||
|
||||
set xrange [0:30500000]
|
||||
set yrange [0:35]
|
||||
# set auto y
|
||||
|
||||
# set logscale x
|
||||
# set logscale y
|
||||
|
||||
# set xtics ('5,000,000' 5000000, '12,000,000' 12000000, '19,000,000' 19000000, '26,000,000' 26000000, )
|
||||
# set xtics ('5,000,000' 5000000, '11,000,000' 11000000, '17,000,000' 17000000, '23,000,000' 23000000, '29,000,000' 29000000 )
|
||||
set xtics ('5,000,000' 5000000, '10,000,000' 10000000, '15,000,000' 15000000, '20,000,000' 20000000, '25,000,000' 25000000, '30,000,000' 30000000 )
|
||||
|
||||
# set auto x
|
||||
set format x '%.0f'
|
||||
|
||||
FIT_LIMIT=1.e-14
|
||||
# f(x) = a*x**2 + b*x + c
|
||||
f(x) = a*x + b
|
||||
fit f(x) 'computation-time-reduce-surface.dat' using 1:9 via a,b
|
||||
# fit f(x) 'computation-time-reduce-surface.dat' using (log($1)):(log($9)) via a,b
|
||||
|
||||
plot 'computation-time-reduce-surface.dat' using 1:9 with points title "Reduce surface computation", f(x) title 'Model Fit'
|
||||
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
import matplotlib.pyplot as plt
|
||||
import numpy as np
|
||||
# exec(open("./plot-res.py").read())
|
||||
|
||||
x = [10, 10, 10, 20, 20, 20, 30, 30, 30, 100, 100, 100, 200, 200, 200, 300, 300, 300, 1000, 1000, 1000, 2000, 2000, 2000, 3000, 3000, 3000, 10000, 10000, 10000, 20000, 20000, 20000, 30000, 30000, 30000, 100000, 100000, 100000, 200000, 200000, 200000, 300000, 300000, 300000, 1000000, 1000000, 1000000, 2000000, 2000000, 2000000, 3000000, 3000000, 3000000, 10000000, 10000000, 10000000, 20000000, 20000000, 20000000, 30000000, 30000000, 30000000]
|
||||
|
||||
y_nfh = [3e-05, 2.8e-05, 4.1e-05,
|
||||
5e-05, 3.1e-05, 3.3e-05,
|
||||
4.8e-05, 3.9e-05, 4.2e-05,
|
||||
0, 0.000141, 0.000107,
|
||||
0.000285, 0.000289, 0.000213,
|
||||
0.000349, 0.000333, 0.000334,
|
||||
0, 0.001847, 0.001052,
|
||||
0.002631, 0.001751, 0.002106,
|
||||
0.003527, 0.003165, 0.003182,
|
||||
0.010599, 0.010524, 0.010555,
|
||||
0.021093, 0.020575, 0.020579,
|
||||
0.032026, 0.032009, 0.032175,
|
||||
0.10946, 0.108055, 0.107969,
|
||||
0.219881, 0.22562, 0.220325,
|
||||
0.337536, 0.329134, 0.333249,
|
||||
1.10841, 1.16317, 1.14465,
|
||||
2.35853, 2.2348, 2.33958,
|
||||
3.53096, 3.4077, 3.30577,
|
||||
10.9284, 11.0523, 11.0834,
|
||||
22.0406, 22.0634, 22.368,
|
||||
33.8717, 34.2746, 33.8732]
|
||||
|
||||
|
||||
col_pts = '#9400d3'
|
||||
col_line = '#009e73'
|
||||
# log-log plot
|
||||
#plt.plot(x[0:63], y_nfh[0:63], 'b+')
|
||||
plt.plot(x[0:63], y_nfh[0:63], linestyle = 'None', color = col_pts, marker='+')
|
||||
# plt.plot(x[0:63], y_fh[0:63], 'ro')
|
||||
# plt.plot(x[0:63], y_c[0:63], 'g+')
|
||||
plt.xscale('log')
|
||||
plt.yscale('log')
|
||||
plt.xlabel('log(path length)')
|
||||
plt.ylabel('log(time in sec.)')
|
||||
plt.plot([x[0],x[62]],[1.5e-05,y_nfh[62]], color = col_line)
|
||||
# plt.plot([x[0],x[62]],[y_fh[0],y_fh[62]], 'r')
|
||||
# plt.plot([x[0],x[62]],[y_c[0],y_c[62]], 'g')
|
||||
# plt.title('Random paths on the canonical reduced genus 5 surface')
|
||||
plt.grid(False)
|
||||
plt.show()
|
||||
|
|
@ -0,0 +1,616 @@
|
|||
Initial map: #Darts=3263148, #0-cells=543652, #1-cells=1631574, #2-cells=1087716, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 1.30931 seconds
|
||||
[TIME] Simplification in one face: 1.52864 seconds
|
||||
[TIME] Face quadrangulation: 0.334481 seconds
|
||||
[TIME] Total time for computation of reduced map: 3.18527 seconds
|
||||
Reduced map: #Darts=832, #0-cells=2, #1-cells=416, #2-cells=208, #ccs=1, valid=1
|
||||
Random seed: 1574945952: Path1 size: 1524414 (from 2360 darts); Path2 size: 1530418 (from 6004 deformations).
|
||||
[TIME] is_contractible: 3.86554 seconds
|
||||
[TIME] are_freely_homotopic: 7.8444 seconds
|
||||
Random seed: 1524412294: Path1 size: 1049124 (from 6814 darts); Path2 size: 1050087 (from 963 deformations).
|
||||
[TIME] is_contractible: 2.83135 seconds
|
||||
[TIME] are_freely_homotopic: 5.60931 seconds
|
||||
Random seed: 1903401680: Path1 size: 2509006 (from 1122 darts); Path2 size: 2513362 (from 4356 deformations).
|
||||
[TIME] is_contractible: 6.13668 seconds
|
||||
[TIME] are_freely_homotopic: 12.624 seconds
|
||||
Random seed: 931857252: Path1 size: 2224823 (from 5500 darts); Path2 size: 2232443 (from 7620 deformations).
|
||||
[TIME] is_contractible: 5.40251 seconds
|
||||
[TIME] are_freely_homotopic: 10.484 seconds
|
||||
Random seed: 1094439597: Path1 size: 1008888 (from 4919 darts); Path2 size: 1018619 (from 9731 deformations).
|
||||
[TIME] is_contractible: 2.38837 seconds
|
||||
[TIME] are_freely_homotopic: 4.79886 seconds
|
||||
Random seed: 74268877: Path1 size: 1332065 (from 2814 darts); Path2 size: 1339611 (from 7546 deformations).
|
||||
[TIME] is_contractible: 3.22555 seconds
|
||||
[TIME] are_freely_homotopic: 6.41267 seconds
|
||||
Random seed: 1179101070: Path1 size: 3561764 (from 608 darts); Path2 size: 3562141 (from 377 deformations).
|
||||
[TIME] is_contractible: 8.05207 seconds
|
||||
[TIME] are_freely_homotopic: 16.0708 seconds
|
||||
Random seed: 1456908315: Path1 size: 2438898 (from 7785 darts); Path2 size: 2442370 (from 3472 deformations).
|
||||
[TIME] is_contractible: 5.71337 seconds
|
||||
[TIME] are_freely_homotopic: 11.477 seconds
|
||||
Random seed: 1499814407: Path1 size: 1914057 (from 668 darts); Path2 size: 1919940 (from 5883 deformations).
|
||||
[TIME] is_contractible: 4.77898 seconds
|
||||
[TIME] are_freely_homotopic: 9.59951 seconds
|
||||
Random seed: 578744460: Path1 size: 2551120 (from 5048 darts); Path2 size: 2555476 (from 4356 deformations).
|
||||
[TIME] is_contractible: 6.3078 seconds
|
||||
[TIME] are_freely_homotopic: 12.6345 seconds
|
||||
Random seed: 213254128: Path1 size: 64526 (from 8013 darts); Path2 size: 70685 (from 6159 deformations).
|
||||
[TIME] is_contractible: 0.173418 seconds
|
||||
[TIME] are_freely_homotopic: 0.361924 seconds
|
||||
Random seed: 1775095594: Path1 size: 492594 (from 4092 darts); Path2 size: 498396 (from 5802 deformations).
|
||||
[TIME] is_contractible: 1.26223 seconds
|
||||
[TIME] are_freely_homotopic: 2.53348 seconds
|
||||
Random seed: 1876630085: Path1 size: 571858 (from 5582 darts); Path2 size: 580868 (from 9010 deformations).
|
||||
[TIME] is_contractible: 1.37788 seconds
|
||||
[TIME] are_freely_homotopic: 2.7772 seconds
|
||||
Random seed: 1560969122: Path1 size: 38840 (from 990 darts); Path2 size: 43934 (from 5094 deformations).
|
||||
[TIME] is_contractible: 0.095079 seconds
|
||||
[TIME] are_freely_homotopic: 0.203706 seconds
|
||||
Random seed: 810569075: Path1 size: 15721 (from 6097 darts); Path2 size: 22405 (from 6684 deformations).
|
||||
[TIME] is_contractible: 0.052084 seconds
|
||||
[TIME] are_freely_homotopic: 0.12308 seconds
|
||||
Random seed: 1388546522: Path1 size: 9948224 (from 3167 darts); Path2 size: 9954782 (from 6558 deformations).
|
||||
[TIME] is_contractible: 23.2806 seconds
|
||||
[TIME] are_freely_homotopic: 46.5412 seconds
|
||||
Random seed: 740365847: Path1 size: 1122183 (from 6018 darts); Path2 size: 1126957 (from 4774 deformations).
|
||||
[TIME] is_contractible: 2.45848 seconds
|
||||
[TIME] are_freely_homotopic: 4.81015 seconds
|
||||
Random seed: 1751524586: Path1 size: 1459662 (from 9345 darts); Path2 size: 1462867 (from 3205 deformations).
|
||||
[TIME] is_contractible: 3.35651 seconds
|
||||
[TIME] are_freely_homotopic: 6.8351 seconds
|
||||
Random seed: 1549068120: Path1 size: 1329962 (from 5701 darts); Path2 size: 1333900 (from 3938 deformations).
|
||||
[TIME] is_contractible: 3.47501 seconds
|
||||
[TIME] are_freely_homotopic: 7.01742 seconds
|
||||
Random seed: 201033949: Path1 size: 117030 (from 2125 darts); Path2 size: 123624 (from 6594 deformations).
|
||||
[TIME] is_contractible: 0.265891 seconds
|
||||
[TIME] are_freely_homotopic: 0.552161 seconds
|
||||
Random seed: 877874983: Path1 size: 1047344 (from 5741 darts); Path2 size: 1054974 (from 7630 deformations).
|
||||
[TIME] is_contractible: 2.62549 seconds
|
||||
[TIME] are_freely_homotopic: 5.27579 seconds
|
||||
Random seed: 133416294: Path1 size: 6539021 (from 2842 darts); Path2 size: 6542800 (from 3779 deformations).
|
||||
[TIME] is_contractible: 15.1482 seconds
|
||||
[TIME] are_freely_homotopic: 29.9774 seconds
|
||||
Random seed: 769183546: Path1 size: 380967 (from 5195 darts); Path2 size: 385239 (from 4272 deformations).
|
||||
[TIME] is_contractible: 0.911951 seconds
|
||||
[TIME] are_freely_homotopic: 1.78487 seconds
|
||||
Random seed: 1860083912: Path1 size: 41353 (from 8398 darts); Path2 size: 50077 (from 8724 deformations).
|
||||
[TIME] is_contractible: 0.115257 seconds
|
||||
[TIME] are_freely_homotopic: 0.254276 seconds
|
||||
Random seed: 1552388394: Path1 size: 3898884 (from 9652 darts); Path2 size: 3908780 (from 9896 deformations).
|
||||
[TIME] is_contractible: 8.92204 seconds
|
||||
[TIME] are_freely_homotopic: 18.0542 seconds
|
||||
Random seed: 394269490: Path1 size: 558908 (from 7487 darts); Path2 size: 563296 (from 4388 deformations).
|
||||
[TIME] is_contractible: 1.44482 seconds
|
||||
[TIME] are_freely_homotopic: 2.89175 seconds
|
||||
Random seed: 608779364: Path1 size: 4623570 (from 4581 darts); Path2 size: 4623770 (from 200 deformations).
|
||||
[TIME] is_contractible: 12.0801 seconds
|
||||
[TIME] are_freely_homotopic: 23.8146 seconds
|
||||
Random seed: 1391080840: Path1 size: 2627660 (from 6099 darts); Path2 size: 2633041 (from 5381 deformations).
|
||||
[TIME] is_contractible: 6.63529 seconds
|
||||
[TIME] are_freely_homotopic: 13.3076 seconds
|
||||
Random seed: 1692836185: Path1 size: 312744 (from 2352 darts); Path2 size: 313066 (from 322 deformations).
|
||||
[TIME] is_contractible: 0.820126 seconds
|
||||
[TIME] are_freely_homotopic: 1.65689 seconds
|
||||
Random seed: 118535817: Path1 size: 33012 (from 886 darts); Path2 size: 34720 (from 1708 deformations).
|
||||
[TIME] is_contractible: 0.108203 seconds
|
||||
[TIME] are_freely_homotopic: 0.230179 seconds
|
||||
Random seed: 1014624509: Path1 size: 5128852 (from 5834 darts); Path2 size: 5133062 (from 4210 deformations).
|
||||
[TIME] is_contractible: 11.6124 seconds
|
||||
[TIME] are_freely_homotopic: 23.6011 seconds
|
||||
Random seed: 914741513: Path1 size: 8652 (from 669 darts); Path2 size: 11181 (from 2529 deformations).
|
||||
[TIME] is_contractible: 0.026449 seconds
|
||||
[TIME] are_freely_homotopic: 0.060392 seconds
|
||||
Random seed: 479844977: Path1 size: 90040 (from 8608 darts); Path2 size: 90840 (from 800 deformations).
|
||||
[TIME] is_contractible: 0.216791 seconds
|
||||
[TIME] are_freely_homotopic: 0.433557 seconds
|
||||
Random seed: 2020930182: Path1 size: 325686 (from 8905 darts); Path2 size: 327807 (from 2121 deformations).
|
||||
[TIME] is_contractible: 0.873464 seconds
|
||||
[TIME] are_freely_homotopic: 1.75005 seconds
|
||||
Random seed: 937146605: Path1 size: 4408 (from 2389 darts); Path2 size: 4618 (from 210 deformations).
|
||||
[TIME] is_contractible: 0.01283 seconds
|
||||
[TIME] are_freely_homotopic: 0.026318 seconds
|
||||
Random seed: 1300363106: Path1 size: 2047709 (from 2988 darts); Path2 size: 2051939 (from 4230 deformations).
|
||||
[TIME] is_contractible: 5.35872 seconds
|
||||
[TIME] are_freely_homotopic: 10.6866 seconds
|
||||
Random seed: 1805470009: Path1 size: 2929154 (from 5735 darts); Path2 size: 2934675 (from 5521 deformations).
|
||||
[TIME] is_contractible: 7.39593 seconds
|
||||
[TIME] are_freely_homotopic: 14.586 seconds
|
||||
Random seed: 97004012: Path1 size: 2287508 (from 6025 darts); Path2 size: 2290644 (from 3136 deformations).
|
||||
[TIME] is_contractible: 5.55511 seconds
|
||||
[TIME] are_freely_homotopic: 10.9367 seconds
|
||||
Random seed: 1757477495: Path1 size: 20056 (from 8513 darts); Path2 size: 25590 (from 5534 deformations).
|
||||
[TIME] is_contractible: 0.061392 seconds
|
||||
[TIME] are_freely_homotopic: 0.135105 seconds
|
||||
Random seed: 579366743: Path1 size: 12729 (from 1759 darts); Path2 size: 18273 (from 5544 deformations).
|
||||
[TIME] is_contractible: 0.025678 seconds
|
||||
[TIME] are_freely_homotopic: 0.061112 seconds
|
||||
Random seed: 2110856968: Path1 size: 8756 (from 7872 darts); Path2 size: 11625 (from 2869 deformations).
|
||||
[TIME] is_contractible: 0.028232 seconds
|
||||
[TIME] are_freely_homotopic: 0.066159 seconds
|
||||
Random seed: 2017033362: Path1 size: 1133402 (from 6797 darts); Path2 size: 1141097 (from 7695 deformations).
|
||||
[TIME] is_contractible: 2.82907 seconds
|
||||
[TIME] are_freely_homotopic: 5.799 seconds
|
||||
Random seed: 1781133485: Path1 size: 887726 (from 8278 darts); Path2 size: 891707 (from 3981 deformations).
|
||||
[TIME] is_contractible: 2.14112 seconds
|
||||
[TIME] are_freely_homotopic: 4.27661 seconds
|
||||
Random seed: 2079943689: Path1 size: 190541 (from 1912 darts); Path2 size: 196368 (from 5827 deformations).
|
||||
[TIME] is_contractible: 0.443466 seconds
|
||||
[TIME] are_freely_homotopic: 0.889504 seconds
|
||||
Random seed: 357050911: Path1 size: 784656 (from 8912 darts); Path2 size: 793928 (from 9272 deformations).
|
||||
[TIME] is_contractible: 1.94601 seconds
|
||||
[TIME] are_freely_homotopic: 3.97098 seconds
|
||||
Random seed: 1204070003: Path1 size: 27886 (from 1541 darts); Path2 size: 35939 (from 8053 deformations).
|
||||
[TIME] is_contractible: 0.093204 seconds
|
||||
[TIME] are_freely_homotopic: 0.205428 seconds
|
||||
Random seed: 10590152: Path1 size: 166193 (from 8654 darts); Path2 size: 174683 (from 8490 deformations).
|
||||
[TIME] is_contractible: 0.481829 seconds
|
||||
[TIME] are_freely_homotopic: 0.959715 seconds
|
||||
Random seed: 1213655585: Path1 size: 1634955 (from 8188 darts); Path2 size: 1637981 (from 3026 deformations).
|
||||
[TIME] is_contractible: 4.05175 seconds
|
||||
[TIME] are_freely_homotopic: 8.12494 seconds
|
||||
Random seed: 102340164: Path1 size: 786667 (from 4193 darts); Path2 size: 787481 (from 814 deformations).
|
||||
[TIME] is_contractible: 2.16864 seconds
|
||||
[TIME] are_freely_homotopic: 4.30371 seconds
|
||||
Random seed: 65018470: Path1 size: 3058683 (from 7145 darts); Path2 size: 3066220 (from 7537 deformations).
|
||||
[TIME] is_contractible: 7.43228 seconds
|
||||
[TIME] are_freely_homotopic: 14.9763 seconds
|
||||
Random seed: 893839509: Path1 size: 853145 (from 3620 darts); Path2 size: 854664 (from 1519 deformations).
|
||||
[TIME] is_contractible: 1.91083 seconds
|
||||
[TIME] are_freely_homotopic: 3.84597 seconds
|
||||
Random seed: 626858492: Path1 size: 915736 (from 6468 darts); Path2 size: 924315 (from 8579 deformations).
|
||||
[TIME] is_contractible: 2.21234 seconds
|
||||
[TIME] are_freely_homotopic: 4.46275 seconds
|
||||
Random seed: 1473957125: Path1 size: 2064414 (from 7316 darts); Path2 size: 2068788 (from 4374 deformations).
|
||||
[TIME] is_contractible: 4.54639 seconds
|
||||
[TIME] are_freely_homotopic: 9.07704 seconds
|
||||
Random seed: 2097455431: Path1 size: 1498675 (from 6125 darts); Path2 size: 1506208 (from 7533 deformations).
|
||||
[TIME] is_contractible: 3.47994 seconds
|
||||
[TIME] are_freely_homotopic: 7.0999 seconds
|
||||
Random seed: 1805351056: Path1 size: 11465 (from 4255 darts); Path2 size: 13867 (from 2402 deformations).
|
||||
[TIME] is_contractible: 0.034742 seconds
|
||||
[TIME] are_freely_homotopic: 0.074569 seconds
|
||||
Random seed: 1551039656: Path1 size: 1500 (from 409 darts); Path2 size: 5543 (from 4043 deformations).
|
||||
[TIME] is_contractible: 0.004261 seconds
|
||||
[TIME] are_freely_homotopic: 0.019447 seconds
|
||||
Random seed: 731201525: Path1 size: 1460356 (from 7083 darts); Path2 size: 1465976 (from 5620 deformations).
|
||||
[TIME] is_contractible: 3.44903 seconds
|
||||
[TIME] are_freely_homotopic: 6.99999 seconds
|
||||
Random seed: 1336172401: Path1 size: 3918177 (from 892 darts); Path2 size: 3922313 (from 4136 deformations).
|
||||
[TIME] is_contractible: 9.90904 seconds
|
||||
[TIME] are_freely_homotopic: 19.7113 seconds
|
||||
Random seed: 1754013662: Path1 size: 155505 (from 1567 darts); Path2 size: 159968 (from 4463 deformations).
|
||||
[TIME] is_contractible: 0.419477 seconds
|
||||
[TIME] are_freely_homotopic: 0.853855 seconds
|
||||
Random seed: 1440167577: Path1 size: 5997 (from 4228 darts); Path2 size: 12540 (from 6543 deformations).
|
||||
[TIME] is_contractible: 0.012746 seconds
|
||||
[TIME] are_freely_homotopic: 0.037545 seconds
|
||||
Random seed: 1364584180: Path1 size: 7791265 (from 6393 darts); Path2 size: 7796654 (from 5389 deformations).
|
||||
[TIME] is_contractible: 18.2438 seconds
|
||||
[TIME] are_freely_homotopic: 36.3007 seconds
|
||||
Random seed: 1410381909: Path1 size: 3017926 (from 7754 darts); Path2 size: 3020885 (from 2959 deformations).
|
||||
[TIME] is_contractible: 7.27202 seconds
|
||||
[TIME] are_freely_homotopic: 14.4281 seconds
|
||||
Random seed: 1030767246: Path1 size: 2253 (from 1448 darts); Path2 size: 11462 (from 9209 deformations).
|
||||
[TIME] is_contractible: 0.007446 seconds
|
||||
[TIME] are_freely_homotopic: 0.043296 seconds
|
||||
Random seed: 913511814: Path1 size: 1344480 (from 8696 darts); Path2 size: 1349288 (from 4808 deformations).
|
||||
[TIME] is_contractible: 3.13805 seconds
|
||||
[TIME] are_freely_homotopic: 6.35775 seconds
|
||||
Random seed: 1423693671: Path1 size: 218100 (from 3471 darts); Path2 size: 226787 (from 8687 deformations).
|
||||
[TIME] is_contractible: 0.468398 seconds
|
||||
[TIME] are_freely_homotopic: 0.96952 seconds
|
||||
Random seed: 1075956758: Path1 size: 19859 (from 3815 darts); Path2 size: 25206 (from 5347 deformations).
|
||||
[TIME] is_contractible: 0.061167 seconds
|
||||
[TIME] are_freely_homotopic: 0.136706 seconds
|
||||
Random seed: 700728023: Path1 size: 1570055 (from 7862 darts); Path2 size: 1572437 (from 2382 deformations).
|
||||
[TIME] is_contractible: 3.70686 seconds
|
||||
[TIME] are_freely_homotopic: 7.42759 seconds
|
||||
Random seed: 1888402334: Path1 size: 1147928 (from 9424 darts); Path2 size: 1157287 (from 9359 deformations).
|
||||
[TIME] is_contractible: 3.11372 seconds
|
||||
[TIME] are_freely_homotopic: 6.27166 seconds
|
||||
Random seed: 1037308229: Path1 size: 4267 (from 3909 darts); Path2 size: 12199 (from 7932 deformations).
|
||||
[TIME] is_contractible: 0.013633 seconds
|
||||
[TIME] are_freely_homotopic: 0.05177 seconds
|
||||
Random seed: 1003878652: Path1 size: 794927 (from 2148 darts); Path2 size: 804905 (from 9978 deformations).
|
||||
[TIME] is_contractible: 1.94774 seconds
|
||||
[TIME] are_freely_homotopic: 3.91127 seconds
|
||||
Random seed: 502871283: Path1 size: 3118323 (from 4987 darts); Path2 size: 3123949 (from 5626 deformations).
|
||||
[TIME] is_contractible: 7.4862 seconds
|
||||
[TIME] are_freely_homotopic: 14.8817 seconds
|
||||
Random seed: 99745040: Path1 size: 345935 (from 7916 darts); Path2 size: 348709 (from 2774 deformations).
|
||||
[TIME] is_contractible: 0.961987 seconds
|
||||
[TIME] are_freely_homotopic: 1.93947 seconds
|
||||
Random seed: 1085969316: Path1 size: 5251784 (from 2720 darts); Path2 size: 5257377 (from 5593 deformations).
|
||||
[TIME] is_contractible: 12.0356 seconds
|
||||
[TIME] are_freely_homotopic: 24.3891 seconds
|
||||
Random seed: 1029892736: Path1 size: 425488 (from 7321 darts); Path2 size: 434411 (from 8923 deformations).
|
||||
[TIME] is_contractible: 1.0689 seconds
|
||||
[TIME] are_freely_homotopic: 2.21017 seconds
|
||||
Random seed: 1434221472: Path1 size: 1025760 (from 5393 darts); Path2 size: 1033772 (from 8012 deformations).
|
||||
[TIME] is_contractible: 2.47379 seconds
|
||||
[TIME] are_freely_homotopic: 4.96134 seconds
|
||||
Random seed: 1260354135: Path1 size: 2667536 (from 8426 darts); Path2 size: 2670807 (from 3271 deformations).
|
||||
[TIME] is_contractible: 5.99514 seconds
|
||||
[TIME] are_freely_homotopic: 12.1269 seconds
|
||||
Random seed: 410552450: Path1 size: 1020 (from 1008 darts); Path2 size: 10923 (from 9903 deformations).
|
||||
[TIME] is_contractible: 0.003334 seconds
|
||||
[TIME] are_freely_homotopic: 0.03613 seconds
|
||||
Random seed: 416264188: Path1 size: 41545 (from 2286 darts); Path2 size: 47295 (from 5750 deformations).
|
||||
[TIME] is_contractible: 0.13632 seconds
|
||||
[TIME] are_freely_homotopic: 0.285656 seconds
|
||||
Random seed: 950597358: Path1 size: 1586593 (from 5366 darts); Path2 size: 1595375 (from 8782 deformations).
|
||||
[TIME] is_contractible: 3.89181 seconds
|
||||
[TIME] are_freely_homotopic: 7.88352 seconds
|
||||
Random seed: 1698189675: Path1 size: 2356504 (from 2396 darts); Path2 size: 2366079 (from 9575 deformations).
|
||||
[TIME] is_contractible: 5.84226 seconds
|
||||
[TIME] are_freely_homotopic: 11.6113 seconds
|
||||
Random seed: 60202036: Path1 size: 698817 (from 2511 darts); Path2 size: 703240 (from 4423 deformations).
|
||||
[TIME] is_contractible: 1.81419 seconds
|
||||
[TIME] are_freely_homotopic: 3.64923 seconds
|
||||
Random seed: 1487242723: Path1 size: 1498299 (from 3976 darts); Path2 size: 1501573 (from 3274 deformations).
|
||||
[TIME] is_contractible: 3.70302 seconds
|
||||
[TIME] are_freely_homotopic: 7.44321 seconds
|
||||
Random seed: 719861449: Path1 size: 70491 (from 2990 darts); Path2 size: 78080 (from 7589 deformations).
|
||||
[TIME] is_contractible: 0.208676 seconds
|
||||
[TIME] are_freely_homotopic: 0.436235 seconds
|
||||
Random seed: 633605317: Path1 size: 3205404 (from 2101 darts); Path2 size: 3213809 (from 8405 deformations).
|
||||
[TIME] is_contractible: 7.6062 seconds
|
||||
[TIME] are_freely_homotopic: 15.2643 seconds
|
||||
Random seed: 2142556750: Path1 size: 137069 (from 9018 darts); Path2 size: 143418 (from 6349 deformations).
|
||||
[TIME] is_contractible: 0.331668 seconds
|
||||
[TIME] are_freely_homotopic: 0.684771 seconds
|
||||
Random seed: 1424644563: Path1 size: 185021 (from 7786 darts); Path2 size: 193489 (from 8468 deformations).
|
||||
[TIME] is_contractible: 0.456013 seconds
|
||||
[TIME] are_freely_homotopic: 0.94372 seconds
|
||||
Random seed: 909840399: Path1 size: 10514 (from 8703 darts); Path2 size: 14184 (from 3670 deformations).
|
||||
[TIME] is_contractible: 0.03405 seconds
|
||||
[TIME] are_freely_homotopic: 0.079866 seconds
|
||||
Random seed: 252496923: Path1 size: 258978 (from 9472 darts); Path2 size: 263450 (from 4472 deformations).
|
||||
[TIME] is_contractible: 0.654929 seconds
|
||||
[TIME] are_freely_homotopic: 1.31629 seconds
|
||||
Random seed: 955673551: Path1 size: 188212 (from 7173 darts); Path2 size: 189028 (from 816 deformations).
|
||||
[TIME] is_contractible: 0.572463 seconds
|
||||
[TIME] are_freely_homotopic: 1.14209 seconds
|
||||
Random seed: 370735399: Path1 size: 1655535 (from 6465 darts); Path2 size: 1659255 (from 3720 deformations).
|
||||
[TIME] is_contractible: 4.05374 seconds
|
||||
[TIME] are_freely_homotopic: 8.14516 seconds
|
||||
Random seed: 1742530242: Path1 size: 20552 (from 9202 darts); Path2 size: 29551 (from 8999 deformations).
|
||||
[TIME] is_contractible: 0.046739 seconds
|
||||
[TIME] are_freely_homotopic: 0.113477 seconds
|
||||
Random seed: 1526231623: Path1 size: 6858 (from 5474 darts); Path2 size: 12047 (from 5189 deformations).
|
||||
[TIME] is_contractible: 0.022151 seconds
|
||||
[TIME] are_freely_homotopic: 0.059419 seconds
|
||||
Random seed: 558603143: Path1 size: 231344 (from 6082 darts); Path2 size: 234092 (from 2748 deformations).
|
||||
[TIME] is_contractible: 0.522525 seconds
|
||||
[TIME] are_freely_homotopic: 1.05193 seconds
|
||||
Random seed: 99045425: Path1 size: 277089 (from 7346 darts); Path2 size: 283900 (from 6811 deformations).
|
||||
[TIME] is_contractible: 0.668141 seconds
|
||||
[TIME] are_freely_homotopic: 1.3473 seconds
|
||||
Random seed: 108772769: Path1 size: 1421926 (from 5611 darts); Path2 size: 1428857 (from 6931 deformations).
|
||||
[TIME] is_contractible: 3.38821 seconds
|
||||
[TIME] are_freely_homotopic: 6.82178 seconds
|
||||
Random seed: 1727722322: Path1 size: 6803208 (from 6951 darts); Path2 size: 6804143 (from 935 deformations).
|
||||
[TIME] is_contractible: 15.5407 seconds
|
||||
[TIME] are_freely_homotopic: 31.2071 seconds
|
||||
Random seed: 1334752652: Path1 size: 4341787 (from 4783 darts); Path2 size: 4342468 (from 681 deformations).
|
||||
[TIME] is_contractible: 10.8756 seconds
|
||||
[TIME] are_freely_homotopic: 21.6696 seconds
|
||||
Random seed: 1817691772: Path1 size: 9820 (from 2429 darts); Path2 size: 11913 (from 2093 deformations).
|
||||
[TIME] is_contractible: 0.024156 seconds
|
||||
[TIME] are_freely_homotopic: 0.051882 seconds
|
||||
Random seed: 905432892: Path1 size: 488145 (from 4710 darts); Path2 size: 491953 (from 3808 deformations).
|
||||
[TIME] is_contractible: 1.09079 seconds
|
||||
[TIME] are_freely_homotopic: 2.19668 seconds
|
||||
Random seed: 1958519057: Path1 size: 193168 (from 3581 darts); Path2 size: 202125 (from 8957 deformations).
|
||||
[TIME] is_contractible: 0.505617 seconds
|
||||
[TIME] are_freely_homotopic: 1.0208 seconds
|
||||
All the 100 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 13 among 100 (i.e. 13%).
|
||||
Initial map: #Darts=334212, #0-cells=55498, #1-cells=167106, #2-cells=111404, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 0.110389 seconds
|
||||
[TIME] Simplification in one face: 0.150956 seconds
|
||||
[TIME] Face quadrangulation: 0.032417 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.295167 seconds
|
||||
Reduced map: #Darts=824, #0-cells=2, #1-cells=412, #2-cells=206, #ccs=1, valid=1
|
||||
Random seed: 1574949942: Path1 size: 134408 (from 5488 darts); Path2 size: 144351 (from 9943 deformations).
|
||||
[TIME] is_contractible: 0.269846 seconds
|
||||
[TIME] are_freely_homotopic: 0.569942 seconds
|
||||
Random seed: 50530994: Path1 size: 72262 (from 2783 darts); Path2 size: 76189 (from 3927 deformations).
|
||||
[TIME] is_contractible: 0.158625 seconds
|
||||
[TIME] are_freely_homotopic: 0.328027 seconds
|
||||
Random seed: 247847864: Path1 size: 1163327 (from 3144 darts); Path2 size: 1167912 (from 4585 deformations).
|
||||
[TIME] is_contractible: 2.53666 seconds
|
||||
[TIME] are_freely_homotopic: 5.09627 seconds
|
||||
Random seed: 706313880: Path1 size: 95971 (from 3672 darts); Path2 size: 101468 (from 5497 deformations).
|
||||
[TIME] is_contractible: 0.22881 seconds
|
||||
[TIME] are_freely_homotopic: 0.477161 seconds
|
||||
Random seed: 188201654: Path1 size: 94754 (from 5181 darts); Path2 size: 98378 (from 3624 deformations).
|
||||
[TIME] is_contractible: 0.248858 seconds
|
||||
[TIME] are_freely_homotopic: 0.51487 seconds
|
||||
Random seed: 83309156: Path1 size: 1619634 (from 6552 darts); Path2 size: 1626306 (from 6672 deformations).
|
||||
[TIME] is_contractible: 3.6389 seconds
|
||||
[TIME] are_freely_homotopic: 7.25762 seconds
|
||||
Random seed: 1017839793: Path1 size: 1919 (from 351 darts); Path2 size: 8130 (from 6211 deformations).
|
||||
[TIME] is_contractible: 0.00373 seconds
|
||||
[TIME] are_freely_homotopic: 0.018792 seconds
|
||||
Random seed: 886255421: Path1 size: 169566 (from 2780 darts); Path2 size: 169802 (from 236 deformations).
|
||||
[TIME] is_contractible: 0.375949 seconds
|
||||
[TIME] are_freely_homotopic: 0.766477 seconds
|
||||
Random seed: 397789418: Path1 size: 52578 (from 4552 darts); Path2 size: 59065 (from 6487 deformations).
|
||||
[TIME] is_contractible: 0.119055 seconds
|
||||
[TIME] are_freely_homotopic: 0.25467 seconds
|
||||
Random seed: 1668607722: Path1 size: 327514 (from 2421 darts); Path2 size: 327939 (from 425 deformations).
|
||||
[TIME] is_contractible: 0.652794 seconds
|
||||
[TIME] are_freely_homotopic: 1.42988 seconds
|
||||
Random seed: 1358200861: Path1 size: 146008 (from 9387 darts); Path2 size: 155458 (from 9450 deformations).
|
||||
[TIME] is_contractible: 0.305657 seconds
|
||||
[TIME] are_freely_homotopic: 0.660986 seconds
|
||||
Random seed: 910744256: Path1 size: 590498 (from 8933 darts); Path2 size: 596057 (from 5559 deformations).
|
||||
[TIME] is_contractible: 1.32982 seconds
|
||||
[TIME] are_freely_homotopic: 2.69134 seconds
|
||||
Random seed: 1899095530: Path1 size: 144709 (from 8770 darts); Path2 size: 145509 (from 800 deformations).
|
||||
[TIME] is_contractible: 0.372597 seconds
|
||||
[TIME] are_freely_homotopic: 0.744431 seconds
|
||||
Random seed: 2092349574: Path1 size: 49839 (from 4600 darts); Path2 size: 52970 (from 3131 deformations).
|
||||
[TIME] is_contractible: 0.11164 seconds
|
||||
[TIME] are_freely_homotopic: 0.229819 seconds
|
||||
Random seed: 267040898: Path1 size: 2257 (from 533 darts); Path2 size: 4753 (from 2496 deformations).
|
||||
[TIME] is_contractible: 0.005862 seconds
|
||||
[TIME] are_freely_homotopic: 0.018162 seconds
|
||||
Random seed: 1683097682: Path1 size: 772205 (from 8790 darts); Path2 size: 779198 (from 6993 deformations).
|
||||
[TIME] is_contractible: 1.68543 seconds
|
||||
[TIME] are_freely_homotopic: 3.38799 seconds
|
||||
Random seed: 1331152193: Path1 size: 209107 (from 4008 darts); Path2 size: 210069 (from 962 deformations).
|
||||
[TIME] is_contractible: 0.512779 seconds
|
||||
[TIME] are_freely_homotopic: 1.07825 seconds
|
||||
Random seed: 233227286: Path1 size: 13950 (from 4723 darts); Path2 size: 19070 (from 5120 deformations).
|
||||
[TIME] is_contractible: 0.044721 seconds
|
||||
[TIME] are_freely_homotopic: 0.10062 seconds
|
||||
Random seed: 564988137: Path1 size: 148524 (from 4960 darts); Path2 size: 156085 (from 7561 deformations).
|
||||
[TIME] is_contractible: 0.361171 seconds
|
||||
[TIME] are_freely_homotopic: 0.75974 seconds
|
||||
Random seed: 1627703444: Path1 size: 15715 (from 187 darts); Path2 size: 20316 (from 4601 deformations).
|
||||
[TIME] is_contractible: 0.038191 seconds
|
||||
[TIME] are_freely_homotopic: 0.085281 seconds
|
||||
Random seed: 519520541: Path1 size: 341581 (from 9181 darts); Path2 size: 344135 (from 2554 deformations).
|
||||
[TIME] is_contractible: 0.828873 seconds
|
||||
[TIME] are_freely_homotopic: 1.65824 seconds
|
||||
Random seed: 824313550: Path1 size: 111707 (from 6305 darts); Path2 size: 114165 (from 2458 deformations).
|
||||
[TIME] is_contractible: 0.296571 seconds
|
||||
[TIME] are_freely_homotopic: 0.598192 seconds
|
||||
Random seed: 1290684516: Path1 size: 285513 (from 797 darts); Path2 size: 291355 (from 5842 deformations).
|
||||
[TIME] is_contractible: 0.605756 seconds
|
||||
[TIME] are_freely_homotopic: 1.24273 seconds
|
||||
Random seed: 326598709: Path1 size: 12753 (from 7482 darts); Path2 size: 17702 (from 4949 deformations).
|
||||
[TIME] is_contractible: 0.024112 seconds
|
||||
[TIME] are_freely_homotopic: 0.058651 seconds
|
||||
Random seed: 2086734682: Path1 size: 261253 (from 1027 darts); Path2 size: 263576 (from 2323 deformations).
|
||||
[TIME] is_contractible: 0.618294 seconds
|
||||
[TIME] are_freely_homotopic: 1.25177 seconds
|
||||
Random seed: 132606227: Path1 size: 18513 (from 7955 darts); Path2 size: 28416 (from 9903 deformations).
|
||||
[TIME] is_contractible: 0.052058 seconds
|
||||
[TIME] are_freely_homotopic: 0.130877 seconds
|
||||
Random seed: 121475808: Path1 size: 158453 (from 7060 darts); Path2 size: 163209 (from 4756 deformations).
|
||||
[TIME] is_contractible: 0.358461 seconds
|
||||
[TIME] are_freely_homotopic: 0.750459 seconds
|
||||
Random seed: 1769936895: Path1 size: 101060 (from 2871 darts); Path2 size: 103049 (from 1989 deformations).
|
||||
[TIME] is_contractible: 0.281742 seconds
|
||||
[TIME] are_freely_homotopic: 0.608572 seconds
|
||||
Random seed: 2059751412: Path1 size: 19681 (from 3639 darts); Path2 size: 22059 (from 2378 deformations).
|
||||
[TIME] is_contractible: 0.043818 seconds
|
||||
[TIME] are_freely_homotopic: 0.09175 seconds
|
||||
Random seed: 1990948225: Path1 size: 636056 (from 8889 darts); Path2 size: 637157 (from 1101 deformations).
|
||||
[TIME] is_contractible: 1.43374 seconds
|
||||
[TIME] are_freely_homotopic: 2.91012 seconds
|
||||
Random seed: 1730451011: Path1 size: 26136 (from 9419 darts); Path2 size: 29879 (from 3743 deformations).
|
||||
[TIME] is_contractible: 0.068484 seconds
|
||||
[TIME] are_freely_homotopic: 0.145167 seconds
|
||||
Random seed: 684989631: Path1 size: 10689 (from 8597 darts); Path2 size: 15705 (from 5016 deformations).
|
||||
[TIME] is_contractible: 0.033721 seconds
|
||||
[TIME] are_freely_homotopic: 0.083634 seconds
|
||||
Random seed: 428735279: Path1 size: 28682 (from 279 darts); Path2 size: 32541 (from 3859 deformations).
|
||||
[TIME] is_contractible: 0.068278 seconds
|
||||
[TIME] are_freely_homotopic: 0.139902 seconds
|
||||
Random seed: 61851330: Path1 size: 13712 (from 780 darts); Path2 size: 16507 (from 2795 deformations).
|
||||
[TIME] is_contractible: 0.030123 seconds
|
||||
[TIME] are_freely_homotopic: 0.06685 seconds
|
||||
Random seed: 642424623: Path1 size: 36802 (from 1199 darts); Path2 size: 39073 (from 2271 deformations).
|
||||
[TIME] is_contractible: 0.085301 seconds
|
||||
[TIME] are_freely_homotopic: 0.192078 seconds
|
||||
Random seed: 1090558461: Path1 size: 131822 (from 800 darts); Path2 size: 135049 (from 3227 deformations).
|
||||
[TIME] is_contractible: 0.330327 seconds
|
||||
[TIME] are_freely_homotopic: 0.657221 seconds
|
||||
Random seed: 481514882: Path1 size: 15369 (from 9986 darts); Path2 size: 15546 (from 177 deformations).
|
||||
[TIME] is_contractible: 0.040625 seconds
|
||||
[TIME] are_freely_homotopic: 0.080504 seconds
|
||||
Random seed: 1980511917: Path1 size: 1197160 (from 7912 darts); Path2 size: 1204876 (from 7716 deformations).
|
||||
[TIME] is_contractible: 2.66886 seconds
|
||||
[TIME] are_freely_homotopic: 5.37277 seconds
|
||||
Random seed: 1842672511: Path1 size: 47253 (from 7272 darts); Path2 size: 47995 (from 742 deformations).
|
||||
[TIME] is_contractible: 0.133238 seconds
|
||||
[TIME] are_freely_homotopic: 0.264456 seconds
|
||||
Random seed: 697653306: Path1 size: 48388 (from 5105 darts); Path2 size: 49535 (from 1147 deformations).
|
||||
[TIME] is_contractible: 0.099999 seconds
|
||||
[TIME] are_freely_homotopic: 0.198439 seconds
|
||||
Random seed: 1633707128: Path1 size: 1329710 (from 5106 darts); Path2 size: 1332418 (from 2708 deformations).
|
||||
[TIME] is_contractible: 3.19551 seconds
|
||||
[TIME] are_freely_homotopic: 6.3238 seconds
|
||||
Random seed: 60068853: Path1 size: 398055 (from 7741 darts); Path2 size: 398563 (from 508 deformations).
|
||||
[TIME] is_contractible: 0.898438 seconds
|
||||
[TIME] are_freely_homotopic: 1.81173 seconds
|
||||
Random seed: 989827132: Path1 size: 10626 (from 2147 darts); Path2 size: 14753 (from 4127 deformations).
|
||||
[TIME] is_contractible: 0.021253 seconds
|
||||
[TIME] are_freely_homotopic: 0.049661 seconds
|
||||
Random seed: 624504064: Path1 size: 38241 (from 1344 darts); Path2 size: 47721 (from 9480 deformations).
|
||||
[TIME] is_contractible: 0.098851 seconds
|
||||
[TIME] are_freely_homotopic: 0.226109 seconds
|
||||
Random seed: 332973462: Path1 size: 713191 (from 9221 darts); Path2 size: 718785 (from 5594 deformations).
|
||||
[TIME] is_contractible: 1.57574 seconds
|
||||
[TIME] are_freely_homotopic: 3.37537 seconds
|
||||
Random seed: 1786994212: Path1 size: 17118 (from 1919 darts); Path2 size: 19578 (from 2460 deformations).
|
||||
[TIME] is_contractible: 0.042418 seconds
|
||||
[TIME] are_freely_homotopic: 0.089777 seconds
|
||||
Random seed: 1475222584: Path1 size: 20334 (from 824 darts); Path2 size: 20581 (from 247 deformations).
|
||||
[TIME] is_contractible: 0.049075 seconds
|
||||
[TIME] are_freely_homotopic: 0.087179 seconds
|
||||
Random seed: 656214858: Path1 size: 425156 (from 1998 darts); Path2 size: 425864 (from 708 deformations).
|
||||
[TIME] is_contractible: 0.998048 seconds
|
||||
[TIME] are_freely_homotopic: 1.96725 seconds
|
||||
Random seed: 9811463: Path1 size: 681002 (from 297 darts); Path2 size: 685169 (from 4167 deformations).
|
||||
[TIME] is_contractible: 1.56764 seconds
|
||||
[TIME] are_freely_homotopic: 3.13846 seconds
|
||||
Random seed: 1499084921: Path1 size: 14736 (from 1862 darts); Path2 size: 23593 (from 8857 deformations).
|
||||
[TIME] is_contractible: 0.032963 seconds
|
||||
[TIME] are_freely_homotopic: 0.083728 seconds
|
||||
Random seed: 675748919: Path1 size: 66104 (from 3072 darts); Path2 size: 73386 (from 7282 deformations).
|
||||
[TIME] is_contractible: 0.144509 seconds
|
||||
[TIME] are_freely_homotopic: 0.312302 seconds
|
||||
Random seed: 446853816: Path1 size: 126934 (from 4202 darts); Path2 size: 133243 (from 6309 deformations).
|
||||
[TIME] is_contractible: 0.304479 seconds
|
||||
[TIME] are_freely_homotopic: 0.637488 seconds
|
||||
Random seed: 570468812: Path1 size: 173684 (from 8352 darts); Path2 size: 182567 (from 8883 deformations).
|
||||
[TIME] is_contractible: 0.380653 seconds
|
||||
[TIME] are_freely_homotopic: 0.806827 seconds
|
||||
Random seed: 1475889916: Path1 size: 216994 (from 8386 darts); Path2 size: 220747 (from 3753 deformations).
|
||||
[TIME] is_contractible: 0.51478 seconds
|
||||
[TIME] are_freely_homotopic: 1.05948 seconds
|
||||
Random seed: 1221641326: Path1 size: 13280 (from 7778 darts); Path2 size: 16356 (from 3076 deformations).
|
||||
[TIME] is_contractible: 0.030476 seconds
|
||||
[TIME] are_freely_homotopic: 0.066812 seconds
|
||||
Random seed: 71936334: Path1 size: 24361 (from 7218 darts); Path2 size: 31632 (from 7271 deformations).
|
||||
[TIME] is_contractible: 0.057538 seconds
|
||||
[TIME] are_freely_homotopic: 0.129382 seconds
|
||||
Random seed: 22866134: Path1 size: 287887 (from 7232 darts); Path2 size: 290771 (from 2884 deformations).
|
||||
[TIME] is_contractible: 0.643613 seconds
|
||||
[TIME] are_freely_homotopic: 1.31868 seconds
|
||||
Random seed: 1682518789: Path1 size: 13682 (from 3962 darts); Path2 size: 21002 (from 7320 deformations).
|
||||
[TIME] is_contractible: 0.032396 seconds
|
||||
[TIME] are_freely_homotopic: 0.08104 seconds
|
||||
Random seed: 1690300033: Path1 size: 43631 (from 7154 darts); Path2 size: 51969 (from 8338 deformations).
|
||||
[TIME] is_contractible: 0.085418 seconds
|
||||
[TIME] are_freely_homotopic: 0.192622 seconds
|
||||
Random seed: 1556202589: Path1 size: 38593 (from 3967 darts); Path2 size: 42276 (from 3683 deformations).
|
||||
[TIME] is_contractible: 0.095875 seconds
|
||||
[TIME] are_freely_homotopic: 0.202057 seconds
|
||||
Random seed: 1080932390: Path1 size: 52163 (from 2436 darts); Path2 size: 61186 (from 9023 deformations).
|
||||
[TIME] is_contractible: 0.1213 seconds
|
||||
[TIME] are_freely_homotopic: 0.267168 seconds
|
||||
Random seed: 568510672: Path1 size: 30870 (from 712 darts); Path2 size: 31893 (from 1023 deformations).
|
||||
[TIME] is_contractible: 0.073838 seconds
|
||||
[TIME] are_freely_homotopic: 0.169932 seconds
|
||||
Random seed: 476818107: Path1 size: 23218 (from 1296 darts); Path2 size: 26791 (from 3573 deformations).
|
||||
[TIME] is_contractible: 0.048905 seconds
|
||||
[TIME] are_freely_homotopic: 0.106194 seconds
|
||||
Random seed: 1231940380: Path1 size: 39019 (from 244 darts); Path2 size: 39369 (from 350 deformations).
|
||||
[TIME] is_contractible: 0.106431 seconds
|
||||
[TIME] are_freely_homotopic: 0.193006 seconds
|
||||
Random seed: 259400406: Path1 size: 18964 (from 2460 darts); Path2 size: 27272 (from 8308 deformations).
|
||||
[TIME] is_contractible: 0.056686 seconds
|
||||
[TIME] are_freely_homotopic: 0.13645 seconds
|
||||
Random seed: 1176742988: Path1 size: 11732 (from 9607 darts); Path2 size: 20138 (from 8406 deformations).
|
||||
[TIME] is_contractible: 0.035749 seconds
|
||||
[TIME] are_freely_homotopic: 0.106614 seconds
|
||||
Random seed: 776901128: Path1 size: 2756 (from 2068 darts); Path2 size: 8825 (from 6069 deformations).
|
||||
[TIME] is_contractible: 0.006236 seconds
|
||||
[TIME] are_freely_homotopic: 0.024911 seconds
|
||||
Random seed: 682675560: Path1 size: 85872 (from 5031 darts); Path2 size: 86320 (from 448 deformations).
|
||||
[TIME] is_contractible: 0.209328 seconds
|
||||
[TIME] are_freely_homotopic: 0.422786 seconds
|
||||
Random seed: 566519663: Path1 size: 18111 (from 1151 darts); Path2 size: 21500 (from 3389 deformations).
|
||||
[TIME] is_contractible: 0.040477 seconds
|
||||
[TIME] are_freely_homotopic: 0.086777 seconds
|
||||
Random seed: 1095996006: Path1 size: 39323 (from 4324 darts); Path2 size: 42317 (from 2994 deformations).
|
||||
[TIME] is_contractible: 0.11067 seconds
|
||||
[TIME] are_freely_homotopic: 0.242744 seconds
|
||||
Random seed: 1705041849: Path1 size: 110949 (from 6948 darts); Path2 size: 115416 (from 4467 deformations).
|
||||
[TIME] is_contractible: 0.280661 seconds
|
||||
[TIME] are_freely_homotopic: 0.58945 seconds
|
||||
Random seed: 1443122557: Path1 size: 271220 (from 1555 darts); Path2 size: 276460 (from 5240 deformations).
|
||||
[TIME] is_contractible: 0.598784 seconds
|
||||
[TIME] are_freely_homotopic: 1.22255 seconds
|
||||
Random seed: 1096168385: Path1 size: 135663 (from 360 darts); Path2 size: 143683 (from 8020 deformations).
|
||||
[TIME] is_contractible: 0.312725 seconds
|
||||
[TIME] are_freely_homotopic: 0.664022 seconds
|
||||
Random seed: 439840688: Path1 size: 44947 (from 3080 darts); Path2 size: 48769 (from 3822 deformations).
|
||||
[TIME] is_contractible: 0.085369 seconds
|
||||
[TIME] are_freely_homotopic: 0.185623 seconds
|
||||
Random seed: 176471338: Path1 size: 17174 (from 7199 darts); Path2 size: 22804 (from 5630 deformations).
|
||||
[TIME] is_contractible: 0.040513 seconds
|
||||
[TIME] are_freely_homotopic: 0.091902 seconds
|
||||
Random seed: 724801413: Path1 size: 19647 (from 8219 darts); Path2 size: 22235 (from 2588 deformations).
|
||||
[TIME] is_contractible: 0.052287 seconds
|
||||
[TIME] are_freely_homotopic: 0.112104 seconds
|
||||
Random seed: 36963316: Path1 size: 400748 (from 7330 darts); Path2 size: 408506 (from 7758 deformations).
|
||||
[TIME] is_contractible: 0.876389 seconds
|
||||
[TIME] are_freely_homotopic: 1.7828 seconds
|
||||
Random seed: 1527565741: Path1 size: 71523 (from 3702 darts); Path2 size: 71930 (from 407 deformations).
|
||||
[TIME] is_contractible: 0.14962 seconds
|
||||
[TIME] are_freely_homotopic: 0.338061 seconds
|
||||
Random seed: 914933755: Path1 size: 223197 (from 9382 darts); Path2 size: 228220 (from 5023 deformations).
|
||||
[TIME] is_contractible: 0.533326 seconds
|
||||
[TIME] are_freely_homotopic: 1.09191 seconds
|
||||
Random seed: 1521965457: Path1 size: 2601935 (from 6638 darts); Path2 size: 2603641 (from 1706 deformations).
|
||||
[TIME] is_contractible: 5.50732 seconds
|
||||
[TIME] are_freely_homotopic: 10.8151 seconds
|
||||
Random seed: 2046362967: Path1 size: 516647 (from 6827 darts); Path2 size: 521009 (from 4362 deformations).
|
||||
[TIME] is_contractible: 1.14199 seconds
|
||||
[TIME] are_freely_homotopic: 2.2921 seconds
|
||||
Random seed: 663235010: Path1 size: 1042972 (from 3550 darts); Path2 size: 1044599 (from 1627 deformations).
|
||||
[TIME] is_contractible: 2.29914 seconds
|
||||
[TIME] are_freely_homotopic: 4.62039 seconds
|
||||
Random seed: 2118300716: Path1 size: 104943 (from 6476 darts); Path2 size: 114537 (from 9594 deformations).
|
||||
[TIME] is_contractible: 0.231351 seconds
|
||||
[TIME] are_freely_homotopic: 0.498831 seconds
|
||||
Random seed: 2032286680: Path1 size: 1513 (from 964 darts); Path2 size: 9121 (from 7608 deformations).
|
||||
[TIME] is_contractible: 0.004627 seconds
|
||||
[TIME] are_freely_homotopic: 0.031175 seconds
|
||||
Random seed: 1954718906: Path1 size: 142475 (from 2023 darts); Path2 size: 145066 (from 2591 deformations).
|
||||
[TIME] is_contractible: 0.343284 seconds
|
||||
[TIME] are_freely_homotopic: 0.726973 seconds
|
||||
Random seed: 422276677: Path1 size: 6627 (from 6403 darts); Path2 size: 10613 (from 3986 deformations).
|
||||
[TIME] is_contractible: 0.019339 seconds
|
||||
[TIME] are_freely_homotopic: 0.049796 seconds
|
||||
Random seed: 1328445502: Path1 size: 448219 (from 7293 darts); Path2 size: 449595 (from 1376 deformations).
|
||||
[TIME] is_contractible: 0.946231 seconds
|
||||
[TIME] are_freely_homotopic: 1.917 seconds
|
||||
Random seed: 233652024: Path1 size: 219376 (from 8135 darts); Path2 size: 223420 (from 4044 deformations).
|
||||
[TIME] is_contractible: 0.51011 seconds
|
||||
[TIME] are_freely_homotopic: 1.05122 seconds
|
||||
Random seed: 1984406757: Path1 size: 370410 (from 9137 darts); Path2 size: 371342 (from 932 deformations).
|
||||
[TIME] is_contractible: 0.889112 seconds
|
||||
[TIME] are_freely_homotopic: 1.78276 seconds
|
||||
Random seed: 1805171553: Path1 size: 18643 (from 3244 darts); Path2 size: 19126 (from 483 deformations).
|
||||
[TIME] is_contractible: 0.041526 seconds
|
||||
[TIME] are_freely_homotopic: 0.08436 seconds
|
||||
Random seed: 519182547: Path1 size: 17322 (from 5722 darts); Path2 size: 18198 (from 876 deformations).
|
||||
[TIME] is_contractible: 0.032815 seconds
|
||||
[TIME] are_freely_homotopic: 0.066431 seconds
|
||||
Random seed: 538307140: Path1 size: 16556 (from 4339 darts); Path2 size: 25713 (from 9157 deformations).
|
||||
[TIME] is_contractible: 0.039275 seconds
|
||||
[TIME] are_freely_homotopic: 0.101854 seconds
|
||||
Random seed: 945348024: Path1 size: 8885 (from 8534 darts); Path2 size: 13720 (from 4835 deformations).
|
||||
[TIME] is_contractible: 0.018419 seconds
|
||||
[TIME] are_freely_homotopic: 0.046641 seconds
|
||||
Random seed: 928636710: Path1 size: 43760 (from 3689 darts); Path2 size: 51887 (from 8127 deformations).
|
||||
[TIME] is_contractible: 0.116647 seconds
|
||||
[TIME] are_freely_homotopic: 0.262684 seconds
|
||||
Random seed: 1389758013: Path1 size: 33747 (from 3227 darts); Path2 size: 41820 (from 8073 deformations).
|
||||
[TIME] is_contractible: 0.077442 seconds
|
||||
[TIME] are_freely_homotopic: 0.17862 seconds
|
||||
Random seed: 440615746: Path1 size: 73982 (from 7794 darts); Path2 size: 79198 (from 5216 deformations).
|
||||
[TIME] is_contractible: 0.194931 seconds
|
||||
[TIME] are_freely_homotopic: 0.409284 seconds
|
||||
Random seed: 989452973: Path1 size: 138225 (from 3498 darts); Path2 size: 141825 (from 3600 deformations).
|
||||
[TIME] is_contractible: 0.298229 seconds
|
||||
[TIME] are_freely_homotopic: 0.628531 seconds
|
||||
Random seed: 1545034495: Path1 size: 25385 (from 8559 darts); Path2 size: 34450 (from 9065 deformations).
|
||||
[TIME] is_contractible: 0.058727 seconds
|
||||
[TIME] are_freely_homotopic: 0.138786 seconds
|
||||
Random seed: 1533279853: Path1 size: 737872 (from 1987 darts); Path2 size: 744717 (from 6845 deformations).
|
||||
[TIME] is_contractible: 1.68372 seconds
|
||||
[TIME] are_freely_homotopic: 3.4144 seconds
|
||||
Random seed: 1357804745: Path1 size: 11975 (from 3879 darts); Path2 size: 20410 (from 8435 deformations).
|
||||
[TIME] is_contractible: 0.027492 seconds
|
||||
[TIME] are_freely_homotopic: 0.075561 seconds
|
||||
All the 100 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 2 among 100 (i.e. 2%).
|
||||
|
|
@ -0,0 +1,819 @@
|
|||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 8e-06 seconds
|
||||
[TIME] Simplification in one face: 4e-06 seconds
|
||||
[TIME] Face quadrangulation: 2.1e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 5.1e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574945958: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.2e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001005 seconds
|
||||
Random seed: 407428646: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations).
|
||||
[TIME] is_contractible: 9e-06 seconds
|
||||
[TIME] are_freely_homotopic: 0.000968 seconds
|
||||
Random seed: 1051319270: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations).
|
||||
[TIME] is_contractible: 8e-06 seconds
|
||||
[TIME] are_freely_homotopic: 0.001003 seconds
|
||||
Random seed: 1723844934: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations).
|
||||
[TIME] is_contractible: 8e-06 seconds
|
||||
[TIME] are_freely_homotopic: 0.000963 seconds
|
||||
Random seed: 1027388982: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations).
|
||||
[TIME] is_contractible: 7e-06 seconds
|
||||
[TIME] are_freely_homotopic: 0.000966 seconds
|
||||
Random seed: 711831886: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations).
|
||||
[TIME] is_contractible: 9e-06 seconds
|
||||
[TIME] are_freely_homotopic: 0.001177 seconds
|
||||
Random seed: 2010793706: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations).
|
||||
[TIME] is_contractible: 7e-06 seconds
|
||||
[TIME] are_freely_homotopic: 0.000996 seconds
|
||||
Random seed: 32114464: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations).
|
||||
[TIME] is_contractible: 8e-06 seconds
|
||||
[TIME] are_freely_homotopic: 0.001022 seconds
|
||||
Random seed: 195228895: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations).
|
||||
[TIME] is_contractible: 8e-06 seconds
|
||||
[TIME] are_freely_homotopic: 0.000979 seconds
|
||||
Random seed: 1929405609: Path1 size: 10 (from 10 darts); Path2 size: 1810 (from 100 deformations).
|
||||
[TIME] is_contractible: 7e-06 seconds
|
||||
[TIME] are_freely_homotopic: 0.000987 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 8e-06 seconds
|
||||
[TIME] Simplification in one face: 4e-06 seconds
|
||||
[TIME] Face quadrangulation: 2.1e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 5.4e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574945958: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.8e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001095 seconds
|
||||
Random seed: 1171368432: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.4e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.00105 seconds
|
||||
Random seed: 34571897: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.2e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001062 seconds
|
||||
Random seed: 1247288983: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.7e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001035 seconds
|
||||
Random seed: 178150098: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.3e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001049 seconds
|
||||
Random seed: 1284851902: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.2e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.00101 seconds
|
||||
Random seed: 586309868: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.3e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001002 seconds
|
||||
Random seed: 1809343951: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.8e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001019 seconds
|
||||
Random seed: 1595581086: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations).
|
||||
[TIME] is_contractible: 2.2e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001037 seconds
|
||||
Random seed: 47612060: Path1 size: 20 (from 20 darts); Path2 size: 1820 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.4e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001149 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 9e-06 seconds
|
||||
[TIME] Simplification in one face: 4e-06 seconds
|
||||
[TIME] Face quadrangulation: 2.1e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 5.6e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574945958: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations).
|
||||
[TIME] is_contractible: 2.2e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001108 seconds
|
||||
Random seed: 374067786: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.8e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001021 seconds
|
||||
Random seed: 391456340: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations).
|
||||
[TIME] is_contractible: 2.2e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001016 seconds
|
||||
Random seed: 1273863045: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations).
|
||||
[TIME] is_contractible: 2.1e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001083 seconds
|
||||
Random seed: 1519773403: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations).
|
||||
[TIME] is_contractible: 2e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001038 seconds
|
||||
Random seed: 1799868058: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations).
|
||||
[TIME] is_contractible: 2e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001031 seconds
|
||||
Random seed: 277235164: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.9e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001087 seconds
|
||||
Random seed: 734561593: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations).
|
||||
[TIME] is_contractible: 2.2e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001032 seconds
|
||||
Random seed: 21414605: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations).
|
||||
[TIME] is_contractible: 2e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001021 seconds
|
||||
Random seed: 130317551: Path1 size: 30 (from 30 darts); Path2 size: 1830 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.8e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001027 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 9e-06 seconds
|
||||
[TIME] Simplification in one face: 4e-06 seconds
|
||||
[TIME] Face quadrangulation: 2e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 5.4e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574945958: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations).
|
||||
[TIME] is_contractible: 6.2e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001295 seconds
|
||||
Random seed: 827721189: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.6e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001204 seconds
|
||||
Random seed: 179817563: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.5e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001213 seconds
|
||||
Random seed: 1778101746: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.9e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001151 seconds
|
||||
Random seed: 328240899: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.5e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001145 seconds
|
||||
Random seed: 241402582: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.9e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001107 seconds
|
||||
Random seed: 773902557: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.7e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001101 seconds
|
||||
Random seed: 225479303: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.7e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001154 seconds
|
||||
Random seed: 950681152: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.3e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001134 seconds
|
||||
Random seed: 380481270: Path1 size: 100 (from 100 darts); Path2 size: 1900 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.8e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001139 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 9e-06 seconds
|
||||
[TIME] Simplification in one face: 4e-06 seconds
|
||||
[TIME] Face quadrangulation: 2.2e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 5.9e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574945958: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000108 seconds
|
||||
[TIME] are_freely_homotopic: 0.001324 seconds
|
||||
Random seed: 129634878: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000127 seconds
|
||||
[TIME] are_freely_homotopic: 0.001278 seconds
|
||||
Random seed: 452917690: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000103 seconds
|
||||
[TIME] are_freely_homotopic: 0.001273 seconds
|
||||
Random seed: 314585648: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000106 seconds
|
||||
[TIME] are_freely_homotopic: 0.001214 seconds
|
||||
Random seed: 1198383543: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations).
|
||||
[TIME] is_contractible: 9.7e-05 seconds
|
||||
[TIME] are_freely_homotopic: 0.001194 seconds
|
||||
Random seed: 1500775544: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000102 seconds
|
||||
[TIME] are_freely_homotopic: 0.001204 seconds
|
||||
Random seed: 1867790315: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.0001 seconds
|
||||
[TIME] are_freely_homotopic: 0.001208 seconds
|
||||
Random seed: 317233466: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000106 seconds
|
||||
[TIME] are_freely_homotopic: 0 seconds
|
||||
Random seed: 860485872: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations).
|
||||
[TIME] is_contractible: 0 seconds
|
||||
[TIME] are_freely_homotopic: 0 seconds
|
||||
Random seed: 186785431: Path1 size: 200 (from 200 darts); Path2 size: 2000 (from 100 deformations).
|
||||
[TIME] is_contractible: 0 seconds
|
||||
[TIME] are_freely_homotopic: 0.001102 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 8e-06 seconds
|
||||
[TIME] Simplification in one face: 3e-06 seconds
|
||||
[TIME] Face quadrangulation: 2e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 5.1e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574945958: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.00015 seconds
|
||||
[TIME] are_freely_homotopic: 0.001414 seconds
|
||||
Random seed: 1956175858: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000156 seconds
|
||||
[TIME] are_freely_homotopic: 0.001383 seconds
|
||||
Random seed: 2005845456: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.00015 seconds
|
||||
[TIME] are_freely_homotopic: 0.001383 seconds
|
||||
Random seed: 1292528523: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000164 seconds
|
||||
[TIME] are_freely_homotopic: 0.001353 seconds
|
||||
Random seed: 895083270: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000151 seconds
|
||||
[TIME] are_freely_homotopic: 0.001377 seconds
|
||||
Random seed: 1540167906: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000148 seconds
|
||||
[TIME] are_freely_homotopic: 0.00132 seconds
|
||||
Random seed: 562183336: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000189 seconds
|
||||
[TIME] are_freely_homotopic: 0.001327 seconds
|
||||
Random seed: 421041639: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000153 seconds
|
||||
[TIME] are_freely_homotopic: 0.001346 seconds
|
||||
Random seed: 1020347916: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000148 seconds
|
||||
[TIME] are_freely_homotopic: 0.001338 seconds
|
||||
Random seed: 788223553: Path1 size: 300 (from 300 darts); Path2 size: 2100 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000149 seconds
|
||||
[TIME] are_freely_homotopic: 0.001316 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 8e-06 seconds
|
||||
[TIME] Simplification in one face: 4e-06 seconds
|
||||
[TIME] Face quadrangulation: 2e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 5.4e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574945958: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000503 seconds
|
||||
[TIME] are_freely_homotopic: 0.00274 seconds
|
||||
Random seed: 43424588: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000515 seconds
|
||||
[TIME] are_freely_homotopic: 0.00225 seconds
|
||||
Random seed: 573264075: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000503 seconds
|
||||
[TIME] are_freely_homotopic: 0.002229 seconds
|
||||
Random seed: 1527608505: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000487 seconds
|
||||
[TIME] are_freely_homotopic: 0.002148 seconds
|
||||
Random seed: 836582892: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000506 seconds
|
||||
[TIME] are_freely_homotopic: 0.002183 seconds
|
||||
Random seed: 1873914203: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.0005 seconds
|
||||
[TIME] are_freely_homotopic: 0.002198 seconds
|
||||
Random seed: 701716257: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000524 seconds
|
||||
[TIME] are_freely_homotopic: 0.002243 seconds
|
||||
Random seed: 1041502320: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000476 seconds
|
||||
[TIME] are_freely_homotopic: 0.002138 seconds
|
||||
Random seed: 453945061: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000519 seconds
|
||||
[TIME] are_freely_homotopic: 0.00216 seconds
|
||||
Random seed: 1711098650: Path1 size: 1000 (from 1000 darts); Path2 size: 2800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.000508 seconds
|
||||
[TIME] are_freely_homotopic: 0.002289 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 8e-06 seconds
|
||||
[TIME] Simplification in one face: 4e-06 seconds
|
||||
[TIME] Face quadrangulation: 2e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 5.5e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574945958: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001098 seconds
|
||||
[TIME] are_freely_homotopic: 0.003557 seconds
|
||||
Random seed: 1244268897: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001039 seconds
|
||||
[TIME] are_freely_homotopic: 0.003471 seconds
|
||||
Random seed: 1196854613: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001114 seconds
|
||||
[TIME] are_freely_homotopic: 0.003608 seconds
|
||||
Random seed: 371870391: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001052 seconds
|
||||
[TIME] are_freely_homotopic: 0.0035 seconds
|
||||
Random seed: 1678709996: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001065 seconds
|
||||
[TIME] are_freely_homotopic: 0.003567 seconds
|
||||
Random seed: 169242704: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001091 seconds
|
||||
[TIME] are_freely_homotopic: 0.003504 seconds
|
||||
Random seed: 1844556362: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001089 seconds
|
||||
[TIME] are_freely_homotopic: 0.003487 seconds
|
||||
Random seed: 2053640443: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001035 seconds
|
||||
[TIME] are_freely_homotopic: 0.003462 seconds
|
||||
Random seed: 1974056470: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001044 seconds
|
||||
[TIME] are_freely_homotopic: 0.003641 seconds
|
||||
Random seed: 1751977721: Path1 size: 2000 (from 2000 darts); Path2 size: 3800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001071 seconds
|
||||
[TIME] are_freely_homotopic: 0.003581 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 8e-06 seconds
|
||||
[TIME] Simplification in one face: 5e-06 seconds
|
||||
[TIME] Face quadrangulation: 2e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 5.2e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574945958: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001588 seconds
|
||||
[TIME] are_freely_homotopic: 0.004812 seconds
|
||||
Random seed: 1252487160: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001464 seconds
|
||||
[TIME] are_freely_homotopic: 0.00467 seconds
|
||||
Random seed: 13701413: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001528 seconds
|
||||
[TIME] are_freely_homotopic: 0.004638 seconds
|
||||
Random seed: 510220869: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001537 seconds
|
||||
[TIME] are_freely_homotopic: 0.004624 seconds
|
||||
Random seed: 1182277397: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001567 seconds
|
||||
[TIME] are_freely_homotopic: 0.004616 seconds
|
||||
Random seed: 1096764957: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.0015 seconds
|
||||
[TIME] are_freely_homotopic: 0.004668 seconds
|
||||
Random seed: 331987761: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001511 seconds
|
||||
[TIME] are_freely_homotopic: 0.004656 seconds
|
||||
Random seed: 2143485603: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001499 seconds
|
||||
[TIME] are_freely_homotopic: 0.004802 seconds
|
||||
Random seed: 1248377376: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001506 seconds
|
||||
[TIME] are_freely_homotopic: 0.004569 seconds
|
||||
Random seed: 519811081: Path1 size: 3000 (from 3000 darts); Path2 size: 4800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.001547 seconds
|
||||
[TIME] are_freely_homotopic: 0.004533 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 8e-06 seconds
|
||||
[TIME] Simplification in one face: 4e-06 seconds
|
||||
[TIME] Face quadrangulation: 2.1e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 5.5e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574945958: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.005356 seconds
|
||||
[TIME] are_freely_homotopic: 0.013876 seconds
|
||||
Random seed: 1666928446: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.005086 seconds
|
||||
[TIME] are_freely_homotopic: 0.013546 seconds
|
||||
Random seed: 1181327034: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.005001 seconds
|
||||
[TIME] are_freely_homotopic: 0.013021 seconds
|
||||
Random seed: 1346202096: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.004986 seconds
|
||||
[TIME] are_freely_homotopic: 0.013122 seconds
|
||||
Random seed: 828629303: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.005043 seconds
|
||||
[TIME] are_freely_homotopic: 0.01331 seconds
|
||||
Random seed: 1857214345: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.00499 seconds
|
||||
[TIME] are_freely_homotopic: 0.013371 seconds
|
||||
Random seed: 164145942: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.005031 seconds
|
||||
[TIME] are_freely_homotopic: 0.009351 seconds
|
||||
Random seed: 1551241558: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.004947 seconds
|
||||
[TIME] are_freely_homotopic: 0.012935 seconds
|
||||
Random seed: 1186302198: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.005056 seconds
|
||||
[TIME] are_freely_homotopic: 0.013268 seconds
|
||||
Random seed: 1147150342: Path1 size: 10000 (from 10000 darts); Path2 size: 11800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.00501 seconds
|
||||
[TIME] are_freely_homotopic: 0.012934 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 1e-05 seconds
|
||||
[TIME] Simplification in one face: 5e-06 seconds
|
||||
[TIME] Face quadrangulation: 2.2e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 6e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574945958: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.010521 seconds
|
||||
[TIME] are_freely_homotopic: 0.028003 seconds
|
||||
Random seed: 92918279: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.010399 seconds
|
||||
[TIME] are_freely_homotopic: 0.02753 seconds
|
||||
Random seed: 596408825: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.010433 seconds
|
||||
[TIME] are_freely_homotopic: 0.027865 seconds
|
||||
Random seed: 898032342: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.010353 seconds
|
||||
[TIME] are_freely_homotopic: 0.023407 seconds
|
||||
Random seed: 1328207231: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.010198 seconds
|
||||
[TIME] are_freely_homotopic: 0.028186 seconds
|
||||
Random seed: 2051608229: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.010343 seconds
|
||||
[TIME] are_freely_homotopic: 0.027859 seconds
|
||||
Random seed: 588608644: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.010273 seconds
|
||||
[TIME] are_freely_homotopic: 0.029628 seconds
|
||||
Random seed: 66849970: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.010566 seconds
|
||||
[TIME] are_freely_homotopic: 0.027236 seconds
|
||||
Random seed: 2130416677: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.010242 seconds
|
||||
[TIME] are_freely_homotopic: 0.026748 seconds
|
||||
Random seed: 1280279108: Path1 size: 20000 (from 20000 darts); Path2 size: 21800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.01086 seconds
|
||||
[TIME] are_freely_homotopic: 0.028129 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 9e-06 seconds
|
||||
[TIME] Simplification in one face: 4e-06 seconds
|
||||
[TIME] Face quadrangulation: 2e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 5.6e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574945959: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.015946 seconds
|
||||
[TIME] are_freely_homotopic: 0.043957 seconds
|
||||
Random seed: 1536606275: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.015459 seconds
|
||||
[TIME] are_freely_homotopic: 0.041385 seconds
|
||||
Random seed: 2080252105: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.016125 seconds
|
||||
[TIME] are_freely_homotopic: 0.038053 seconds
|
||||
Random seed: 1598541528: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.015935 seconds
|
||||
[TIME] are_freely_homotopic: 0.043414 seconds
|
||||
Random seed: 974598622: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.015291 seconds
|
||||
[TIME] are_freely_homotopic: 0.04098 seconds
|
||||
Random seed: 1923233325: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.015353 seconds
|
||||
[TIME] are_freely_homotopic: 0.042937 seconds
|
||||
Random seed: 1140340946: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.017732 seconds
|
||||
[TIME] are_freely_homotopic: 0.045088 seconds
|
||||
Random seed: 1573867023: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.015587 seconds
|
||||
[TIME] are_freely_homotopic: 0.041879 seconds
|
||||
Random seed: 1467028679: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.015839 seconds
|
||||
[TIME] are_freely_homotopic: 0.041111 seconds
|
||||
Random seed: 1979862163: Path1 size: 30000 (from 30000 darts); Path2 size: 31800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.016299 seconds
|
||||
[TIME] are_freely_homotopic: 0.045976 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 0 seconds
|
||||
[TIME] Simplification in one face: 0 seconds
|
||||
[TIME] Face quadrangulation: 0 seconds
|
||||
[TIME] Total time for computation of reduced map: 0 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574945960: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.056463 seconds
|
||||
[TIME] are_freely_homotopic: 0.17237 seconds
|
||||
Random seed: 579143103: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.054943 seconds
|
||||
[TIME] are_freely_homotopic: 0.180977 seconds
|
||||
Random seed: 1329965305: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.055873 seconds
|
||||
[TIME] are_freely_homotopic: 0.171254 seconds
|
||||
Random seed: 46115850: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.053753 seconds
|
||||
[TIME] are_freely_homotopic: 0.171383 seconds
|
||||
Random seed: 1372864308: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.055899 seconds
|
||||
[TIME] are_freely_homotopic: 0.171538 seconds
|
||||
Random seed: 824893981: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.054506 seconds
|
||||
[TIME] are_freely_homotopic: 0.178545 seconds
|
||||
Random seed: 87947492: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.05419 seconds
|
||||
[TIME] are_freely_homotopic: 0.171793 seconds
|
||||
Random seed: 1798052437: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.055006 seconds
|
||||
[TIME] are_freely_homotopic: 0.185616 seconds
|
||||
Random seed: 1637566832: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.055066 seconds
|
||||
[TIME] are_freely_homotopic: 0.174076 seconds
|
||||
Random seed: 228920755: Path1 size: 100000 (from 100000 darts); Path2 size: 101800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.055227 seconds
|
||||
[TIME] are_freely_homotopic: 0.189212 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 1.7e-05 seconds
|
||||
[TIME] Simplification in one face: 4e-06 seconds
|
||||
[TIME] Face quadrangulation: 2.1e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 6.5e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574945963: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.113193 seconds
|
||||
[TIME] are_freely_homotopic: 0.251366 seconds
|
||||
Random seed: 474217776: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.053804 seconds
|
||||
[TIME] are_freely_homotopic: 0.188959 seconds
|
||||
Random seed: 225712445: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.065313 seconds
|
||||
[TIME] are_freely_homotopic: 0.319781 seconds
|
||||
Random seed: 558926877: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.11272 seconds
|
||||
[TIME] are_freely_homotopic: 0.339641 seconds
|
||||
Random seed: 489485133: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.112057 seconds
|
||||
[TIME] are_freely_homotopic: 0.347156 seconds
|
||||
Random seed: 1250371909: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.109281 seconds
|
||||
[TIME] are_freely_homotopic: 0.340843 seconds
|
||||
Random seed: 1461432881: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.108663 seconds
|
||||
[TIME] are_freely_homotopic: 0.344816 seconds
|
||||
Random seed: 900599167: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.12226 seconds
|
||||
[TIME] are_freely_homotopic: 0.366892 seconds
|
||||
Random seed: 332938818: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.116914 seconds
|
||||
[TIME] are_freely_homotopic: 0.375243 seconds
|
||||
Random seed: 1170036586: Path1 size: 200000 (from 200000 darts); Path2 size: 201800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.109202 seconds
|
||||
[TIME] are_freely_homotopic: 0.342457 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 1.2e-05 seconds
|
||||
[TIME] Simplification in one face: 6e-06 seconds
|
||||
[TIME] Face quadrangulation: 3.2e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 8.6e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574945969: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.165865 seconds
|
||||
[TIME] are_freely_homotopic: 0.524276 seconds
|
||||
Random seed: 1226891914: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.161986 seconds
|
||||
[TIME] are_freely_homotopic: 0.52858 seconds
|
||||
Random seed: 1375369512: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.164922 seconds
|
||||
[TIME] are_freely_homotopic: 0.531664 seconds
|
||||
Random seed: 457873843: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.166501 seconds
|
||||
[TIME] are_freely_homotopic: 0.529451 seconds
|
||||
Random seed: 1433095951: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.165578 seconds
|
||||
[TIME] are_freely_homotopic: 0.532124 seconds
|
||||
Random seed: 1454564469: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.166458 seconds
|
||||
[TIME] are_freely_homotopic: 0.537297 seconds
|
||||
Random seed: 1770807796: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.165786 seconds
|
||||
[TIME] are_freely_homotopic: 0.532855 seconds
|
||||
Random seed: 1798074289: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.165027 seconds
|
||||
[TIME] are_freely_homotopic: 0.55081 seconds
|
||||
Random seed: 138710538: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.166903 seconds
|
||||
[TIME] are_freely_homotopic: 0.535346 seconds
|
||||
Random seed: 1787667944: Path1 size: 300000 (from 300000 darts); Path2 size: 301800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.16556 seconds
|
||||
[TIME] are_freely_homotopic: 0.542188 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 1.2e-05 seconds
|
||||
[TIME] Simplification in one face: 6e-06 seconds
|
||||
[TIME] Face quadrangulation: 3.1e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 8.2e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574945979: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.565789 seconds
|
||||
[TIME] are_freely_homotopic: 1.7571 seconds
|
||||
Random seed: 644792205: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.555874 seconds
|
||||
[TIME] are_freely_homotopic: 1.73021 seconds
|
||||
Random seed: 602587674: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.545865 seconds
|
||||
[TIME] are_freely_homotopic: 1.78313 seconds
|
||||
Random seed: 581717819: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.567576 seconds
|
||||
[TIME] are_freely_homotopic: 1.75944 seconds
|
||||
Random seed: 1562933709: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.584859 seconds
|
||||
[TIME] are_freely_homotopic: 1.77367 seconds
|
||||
Random seed: 196412346: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.525251 seconds
|
||||
[TIME] are_freely_homotopic: 1.71673 seconds
|
||||
Random seed: 872074059: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.568166 seconds
|
||||
[TIME] are_freely_homotopic: 1.64886 seconds
|
||||
Random seed: 721079285: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.538682 seconds
|
||||
[TIME] are_freely_homotopic: 1.71856 seconds
|
||||
Random seed: 169285406: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.575029 seconds
|
||||
[TIME] are_freely_homotopic: 1.67964 seconds
|
||||
Random seed: 417147589: Path1 size: 1000000 (from 1000000 darts); Path2 size: 1001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 0.548759 seconds
|
||||
[TIME] are_freely_homotopic: 1.75386 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 8e-06 seconds
|
||||
[TIME] Simplification in one face: 3e-06 seconds
|
||||
[TIME] Face quadrangulation: 2e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 5.4e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574946010: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.07172 seconds
|
||||
[TIME] are_freely_homotopic: 3.30467 seconds
|
||||
Random seed: 370928264: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.00794 seconds
|
||||
[TIME] are_freely_homotopic: 3.21761 seconds
|
||||
Random seed: 527719483: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.04292 seconds
|
||||
[TIME] are_freely_homotopic: 3.43482 seconds
|
||||
Random seed: 1799719226: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.10887 seconds
|
||||
[TIME] are_freely_homotopic: 3.44661 seconds
|
||||
Random seed: 1931996536: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.10033 seconds
|
||||
[TIME] are_freely_homotopic: 3.49517 seconds
|
||||
Random seed: 2105171859: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.10725 seconds
|
||||
[TIME] are_freely_homotopic: 3.48497 seconds
|
||||
Random seed: 1990690710: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.13176 seconds
|
||||
[TIME] are_freely_homotopic: 3.46857 seconds
|
||||
Random seed: 993120350: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.11183 seconds
|
||||
[TIME] are_freely_homotopic: 3.52759 seconds
|
||||
Random seed: 886380626: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.12338 seconds
|
||||
[TIME] are_freely_homotopic: 3.41028 seconds
|
||||
Random seed: 157399348: Path1 size: 2000000 (from 2000000 darts); Path2 size: 2001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.0625 seconds
|
||||
[TIME] are_freely_homotopic: 3.4078 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 9e-06 seconds
|
||||
[TIME] Simplification in one face: 4e-06 seconds
|
||||
[TIME] Face quadrangulation: 2e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 5.6e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574946072: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.61675 seconds
|
||||
[TIME] are_freely_homotopic: 5.23394 seconds
|
||||
Random seed: 1590578674: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.76362 seconds
|
||||
[TIME] are_freely_homotopic: 5.39348 seconds
|
||||
Random seed: 472245139: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.70443 seconds
|
||||
[TIME] are_freely_homotopic: 5.38821 seconds
|
||||
Random seed: 429234277: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.79035 seconds
|
||||
[TIME] are_freely_homotopic: 5.44008 seconds
|
||||
Random seed: 1271064050: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.79136 seconds
|
||||
[TIME] are_freely_homotopic: 5.56954 seconds
|
||||
Random seed: 1099653011: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.7848 seconds
|
||||
[TIME] are_freely_homotopic: 5.48245 seconds
|
||||
Random seed: 1494765157: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.7496 seconds
|
||||
[TIME] are_freely_homotopic: 5.512 seconds
|
||||
Random seed: 22424818: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.72438 seconds
|
||||
[TIME] are_freely_homotopic: 5.4148 seconds
|
||||
Random seed: 1046116947: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.65999 seconds
|
||||
[TIME] are_freely_homotopic: 5.21928 seconds
|
||||
Random seed: 782410053: Path1 size: 3000000 (from 3000000 darts); Path2 size: 3001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 1.59595 seconds
|
||||
[TIME] are_freely_homotopic: 4.85017 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 8e-06 seconds
|
||||
[TIME] Simplification in one face: 4e-06 seconds
|
||||
[TIME] Face quadrangulation: 2e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 5.7e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574946169: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.66762 seconds
|
||||
[TIME] are_freely_homotopic: 17.7623 seconds
|
||||
Random seed: 1473356665: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.35138 seconds
|
||||
[TIME] are_freely_homotopic: 17.0192 seconds
|
||||
Random seed: 1977994873: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.6751 seconds
|
||||
[TIME] are_freely_homotopic: 17.2393 seconds
|
||||
Random seed: 1879243257: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.67143 seconds
|
||||
[TIME] are_freely_homotopic: 16.4106 seconds
|
||||
Random seed: 1229375161: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.66773 seconds
|
||||
[TIME] are_freely_homotopic: 17.6798 seconds
|
||||
Random seed: 1461417625: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.63388 seconds
|
||||
[TIME] are_freely_homotopic: 16.511 seconds
|
||||
Random seed: 468007748: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.64777 seconds
|
||||
[TIME] are_freely_homotopic: 17.7845 seconds
|
||||
Random seed: 448609289: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.57198 seconds
|
||||
[TIME] are_freely_homotopic: 16.1655 seconds
|
||||
Random seed: 1489170401: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.58956 seconds
|
||||
[TIME] are_freely_homotopic: 17.3209 seconds
|
||||
Random seed: 1788684157: Path1 size: 10000000 (from 10000000 darts); Path2 size: 10001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 5.61045 seconds
|
||||
[TIME] are_freely_homotopic: 16.1997 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 9e-06 seconds
|
||||
[TIME] Simplification in one face: 5e-06 seconds
|
||||
[TIME] Face quadrangulation: 2.1e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 5.7e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574946480: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 11.2896 seconds
|
||||
[TIME] are_freely_homotopic: 33.2624 seconds
|
||||
Random seed: 99584895: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 10.8629 seconds
|
||||
[TIME] are_freely_homotopic: 32.7729 seconds
|
||||
Random seed: 912045122: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 10.6456 seconds
|
||||
[TIME] are_freely_homotopic: 32.64 seconds
|
||||
Random seed: 595863310: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 10.7267 seconds
|
||||
[TIME] are_freely_homotopic: 32.7883 seconds
|
||||
Random seed: 1309255323: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 10.7952 seconds
|
||||
[TIME] are_freely_homotopic: 33.4828 seconds
|
||||
Random seed: 1248795693: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 10.8942 seconds
|
||||
[TIME] are_freely_homotopic: 33.3988 seconds
|
||||
Random seed: 2034370714: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 11.1634 seconds
|
||||
[TIME] are_freely_homotopic: 33.8661 seconds
|
||||
Random seed: 1340254186: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 10.8488 seconds
|
||||
[TIME] are_freely_homotopic: 32.7967 seconds
|
||||
Random seed: 803460071: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 10.805 seconds
|
||||
[TIME] are_freely_homotopic: 32.5927 seconds
|
||||
Random seed: 2000292971: Path1 size: 20000000 (from 20000000 darts); Path2 size: 20001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 10.6542 seconds
|
||||
[TIME] are_freely_homotopic: 33.3069 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
Initial map: #Darts=20, #0-cells=1, #1-cells=10, #2-cells=1, #ccs=1, valid=1
|
||||
[TIME] Simplification in one vertex: 1e-05 seconds
|
||||
[TIME] Simplification in one face: 4e-06 seconds
|
||||
[TIME] Face quadrangulation: 2.1e-05 seconds
|
||||
[TIME] Total time for computation of reduced map: 6e-05 seconds
|
||||
Reduced map: #Darts=40, #0-cells=2, #1-cells=20, #2-cells=10, #ccs=1, valid=1
|
||||
Random seed: 1574947086: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 16.8741 seconds
|
||||
[TIME] are_freely_homotopic: 51.2028 seconds
|
||||
Random seed: 1043134997: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 16.4561 seconds
|
||||
[TIME] are_freely_homotopic: 50.1288 seconds
|
||||
Random seed: 439762399: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 16.031 seconds
|
||||
[TIME] are_freely_homotopic: 51.1833 seconds
|
||||
Random seed: 1662380910: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 16.4791 seconds
|
||||
[TIME] are_freely_homotopic: 51.4586 seconds
|
||||
Random seed: 185618813: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 16.5506 seconds
|
||||
[TIME] are_freely_homotopic: 49.4669 seconds
|
||||
Random seed: 652798972: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 16.4287 seconds
|
||||
[TIME] are_freely_homotopic: 50.4364 seconds
|
||||
Random seed: 2005222812: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 17.0067 seconds
|
||||
[TIME] are_freely_homotopic: 51.1537 seconds
|
||||
Random seed: 1669933756: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 16.4827 seconds
|
||||
[TIME] are_freely_homotopic: 51.8852 seconds
|
||||
Random seed: 485850944: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 17.0735 seconds
|
||||
[TIME] are_freely_homotopic: 51.4021 seconds
|
||||
Random seed: 325794698: Path1 size: 30000000 (from 30000000 darts); Path2 size: 30001800 (from 100 deformations).
|
||||
[TIME] is_contractible: 16.1387 seconds
|
||||
[TIME] are_freely_homotopic: 51.3036 seconds
|
||||
All the 10 tests OK: each pair of paths were homotopic.
|
||||
Number of contractible paths: 0 among 10 (i.e. 0%).
|
||||
==============
|
||||
|
|
@ -0,0 +1,265 @@
|
|||
Mesh data/big/803_neptune_4Mtriangles_manifold.off
|
||||
[TIME] Simplification in one vertex: 5.77141 seconds
|
||||
[TIME] Simplification in one face: 6.60485 seconds
|
||||
[TIME] Face quadrangulation: 1.14649 seconds
|
||||
[TIME] Total time for computation of reduced map: 13.5703 seconds
|
||||
Initial map: #Darts=12023616, #0-cells=2003932, #1-cells=6011808, #2-cells=4007872, #ccs=1
|
||||
Reduced map: #Darts=24, #0-cells=2, #1-cells=12, #2-cells=6, #ccs=1
|
||||
Mesh data/big/blade-several-cc.off
|
||||
[TIME] Simplification in one vertex: 1.96106 seconds
|
||||
[TIME] Simplification in one face: 2.84259 seconds
|
||||
[TIME] Face quadrangulation: 0.554043 seconds
|
||||
[TIME] Total time for computation of reduced map: 5.37898 seconds
|
||||
Initial map: #Darts=5296164, #0-cells=882954, #1-cells=2648082, #2-cells=1765388, #ccs=295
|
||||
Reduced map: #Darts=13112, #0-cells=3538, #1-cells=6556, #2-cells=3278, #ccs=295
|
||||
Mesh data/big/Drum_Dancer_2670868.off
|
||||
[TIME] Simplification in one vertex: 3.26392 seconds
|
||||
[TIME] Simplification in one face: 1.45876 seconds
|
||||
[TIME] Total time for computation of reduced map: 4.72275 seconds
|
||||
Initial map: #Darts=8012604, #0-cells=1335436, #1-cells=4006302, #2-cells=2670868, #ccs=1
|
||||
Reduced map: #Darts=0, #0-cells=0, #1-cells=0, #2-cells=0, #ccs=0
|
||||
Mesh data/big-genus/obj10.off
|
||||
[TIME] Simplification in one vertex: 0.054267 seconds
|
||||
[TIME] Simplification in one face: 0.081982 seconds
|
||||
[TIME] Face quadrangulation: 0.017711 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.154715 seconds
|
||||
Initial map: #Darts=205662, #0-cells=33871, #1-cells=102831, #2-cells=68554, #ccs=1
|
||||
Reduced map: #Darts=1632, #0-cells=2, #1-cells=816, #2-cells=408, #ccs=1
|
||||
Mesh data/big-genus/obj11.off
|
||||
[TIME] Simplification in one vertex: 0.108287 seconds
|
||||
[TIME] Simplification in one face: 0.143657 seconds
|
||||
[TIME] Face quadrangulation: 0.031098 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.284387 seconds
|
||||
Initial map: #Darts=334926, #0-cells=55617, #1-cells=167463, #2-cells=111642, #ccs=1
|
||||
Reduced map: #Darts=824, #0-cells=2, #1-cells=412, #2-cells=206, #ccs=1
|
||||
Mesh data/big-genus/obj12.off
|
||||
[TIME] Simplification in one vertex: 0.095036 seconds
|
||||
[TIME] Simplification in one face: 0.163535 seconds
|
||||
[TIME] Face quadrangulation: 0.030391 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.290279 seconds
|
||||
Initial map: #Darts=310740, #0-cells=50528, #1-cells=155370, #2-cells=103580, #ccs=1
|
||||
Reduced map: #Darts=5056, #0-cells=2, #1-cells=2528, #2-cells=1264, #ccs=1
|
||||
Mesh data/big-genus/obj13.off
|
||||
[TIME] Simplification in one vertex: 0.047877 seconds
|
||||
[TIME] Simplification in one face: 0.075205 seconds
|
||||
[TIME] Face quadrangulation: 0.013692 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.137383 seconds
|
||||
Initial map: #Darts=172800, #0-cells=28564, #1-cells=86400, #2-cells=57600, #ccs=1
|
||||
Reduced map: #Darts=952, #0-cells=2, #1-cells=476, #2-cells=238, #ccs=1
|
||||
Mesh data/big-genus/obj14.off
|
||||
[TIME] Simplification in one vertex: 0.274628 seconds
|
||||
[TIME] Simplification in one face: 0.325655 seconds
|
||||
[TIME] Face quadrangulation: 0.070724 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.67383 seconds
|
||||
Initial map: #Darts=694992, #0-cells=115612, #1-cells=347496, #2-cells=231664, #ccs=1
|
||||
Reduced map: #Darts=888, #0-cells=2, #1-cells=444, #2-cells=222, #ccs=1
|
||||
Mesh data/big-genus/obj15.off
|
||||
[TIME] Simplification in one vertex: 1.27469 seconds
|
||||
[TIME] Simplification in one face: 1.51623 seconds
|
||||
[TIME] Face quadrangulation: 0.339918 seconds
|
||||
[TIME] Total time for computation of reduced map: 3.14391 seconds
|
||||
Initial map: #Darts=3298422, #0-cells=548955, #1-cells=1649211, #2-cells=1099474, #ccs=1
|
||||
Reduced map: #Darts=3136, #0-cells=2, #1-cells=1568, #2-cells=784, #ccs=1
|
||||
Mesh data/big-genus/obj16.off
|
||||
[TIME] Simplification in one vertex: 0.002664 seconds
|
||||
[TIME] Simplification in one face: 0.003016 seconds
|
||||
[TIME] Face quadrangulation: 0.000657 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.006399 seconds
|
||||
Initial map: #Darts=16326, #0-cells=2491, #1-cells=8163, #2-cells=5442, #ccs=1
|
||||
Reduced map: #Darts=928, #0-cells=2, #1-cells=464, #2-cells=232, #ccs=1
|
||||
Mesh data/big-genus/obj17.off
|
||||
[TIME] Simplification in one vertex: 0.007386 seconds
|
||||
[TIME] Simplification in one face: 0.008476 seconds
|
||||
[TIME] Face quadrangulation: 0.00218 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.018229 seconds
|
||||
Initial map: #Darts=38292, #0-cells=5488, #1-cells=19146, #2-cells=12764, #ccs=1
|
||||
Reduced map: #Darts=3584, #0-cells=2, #1-cells=1792, #2-cells=896, #ccs=1
|
||||
Mesh data/big-genus/obj1.off
|
||||
[TIME] Simplification in one vertex: 0.001849 seconds
|
||||
[TIME] Simplification in one face: 0.002086 seconds
|
||||
[TIME] Face quadrangulation: 0.000568 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.004556 seconds
|
||||
Initial map: #Darts=11532, #0-cells=1684, #1-cells=5766, #2-cells=3844, #ccs=1
|
||||
Reduced map: #Darts=960, #0-cells=2, #1-cells=480, #2-cells=240, #ccs=1
|
||||
Mesh data/big-genus/obj2.off
|
||||
[TIME] Simplification in one vertex: 0.002474 seconds
|
||||
[TIME] Simplification in one face: 0.002939 seconds
|
||||
[TIME] Face quadrangulation: 0.000663 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.006134 seconds
|
||||
Initial map: #Darts=16188, #0-cells=2460, #1-cells=8094, #2-cells=5396, #ccs=1
|
||||
Reduced map: #Darts=960, #0-cells=2, #1-cells=480, #2-cells=240, #ccs=1
|
||||
Mesh data/big-genus/obj3.off
|
||||
[TIME] Simplification in one vertex: 0.356866 seconds
|
||||
[TIME] Simplification in one face: 0.519399 seconds
|
||||
[TIME] Face quadrangulation: 0.106446 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.987253 seconds
|
||||
Initial map: #Darts=1037988, #0-cells=172466, #1-cells=518994, #2-cells=345996, #ccs=1
|
||||
Reduced map: #Darts=2136, #0-cells=2, #1-cells=1068, #2-cells=534, #ccs=1
|
||||
Mesh data/big-genus/obj5.off
|
||||
[TIME] Simplification in one vertex: 0.020143 seconds
|
||||
[TIME] Simplification in one face: 0.035718 seconds
|
||||
[TIME] Face quadrangulation: 0.005571 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.061761 seconds
|
||||
Initial map: #Darts=97644, #0-cells=15520, #1-cells=48822, #2-cells=32548, #ccs=1
|
||||
Reduced map: #Darts=3024, #0-cells=2, #1-cells=1512, #2-cells=756, #ccs=1
|
||||
Mesh data/big-genus/obj6.off
|
||||
[TIME] Simplification in one vertex: 0.001718 seconds
|
||||
[TIME] Simplification in one face: 0.00174 seconds
|
||||
[TIME] Face quadrangulation: 0.000691 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.004214 seconds
|
||||
Initial map: #Darts=9186, #0-cells=1311, #1-cells=4593, #2-cells=3062, #ccs=1
|
||||
Reduced map: #Darts=888, #0-cells=2, #1-cells=444, #2-cells=222, #ccs=1
|
||||
Mesh data/big-genus/obj7.off
|
||||
[TIME] Simplification in one vertex: 0.001889 seconds
|
||||
[TIME] Simplification in one face: 0.002058 seconds
|
||||
[TIME] Face quadrangulation: 0.000642 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.00465 seconds
|
||||
Initial map: #Darts=11520, #0-cells=1608, #1-cells=5760, #2-cells=3840, #ccs=1
|
||||
Reduced map: #Darts=1256, #0-cells=2, #1-cells=628, #2-cells=314, #ccs=1
|
||||
Mesh data/big-genus/obj8.off
|
||||
[TIME] Simplification in one vertex: 0.005149 seconds
|
||||
[TIME] Simplification in one face: 0.007093 seconds
|
||||
[TIME] Face quadrangulation: 0.000993 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.013347 seconds
|
||||
Initial map: #Darts=29676, #0-cells=4716, #1-cells=14838, #2-cells=9892, #ccs=1
|
||||
Reduced map: #Darts=928, #0-cells=2, #1-cells=464, #2-cells=232, #ccs=1
|
||||
Mesh data/big-genus/obj9.off
|
||||
[TIME] Simplification in one vertex: 0.105654 seconds
|
||||
[TIME] Simplification in one face: 0.138156 seconds
|
||||
[TIME] Face quadrangulation: 0.031414 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.276585 seconds
|
||||
Initial map: #Darts=334212, #0-cells=55498, #1-cells=167106, #2-cells=111404, #ccs=1
|
||||
Reduced map: #Darts=824, #0-cells=2, #1-cells=412, #2-cells=206, #ccs=1
|
||||
Mesh data/big-genus-with-holes/obj10-1.000000-2.off
|
||||
[TIME] Simplification in one vertex: 0.051923 seconds
|
||||
[TIME] Simplification in one face: 0.07859 seconds
|
||||
[TIME] Face quadrangulation: 0.017452 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.148973 seconds
|
||||
Initial map: #Darts=197493, #0-cells=33955, #1-cells=100736, #2-cells=65831, #ccs=1
|
||||
Reduced map: #Darts=2594, #0-cells=211, #1-cells=1297, #2-cells=690, #ccs=1
|
||||
Mesh data/big-genus-with-holes/obj1-1.000000-2.off
|
||||
[TIME] Simplification in one vertex: 0.001813 seconds
|
||||
[TIME] Simplification in one face: 0.001997 seconds
|
||||
[TIME] Face quadrangulation: 0.000637 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.004537 seconds
|
||||
Initial map: #Darts=11079, #0-cells=1687, #1-cells=5650, #2-cells=3693, #ccs=1
|
||||
Reduced map: #Darts=892, #0-cells=5, #1-cells=446, #2-cells=203, #ccs=1
|
||||
Mesh data/big-genus-with-holes/obj11-1.000000-2.off
|
||||
[TIME] Simplification in one vertex: 0.097106 seconds
|
||||
[TIME] Simplification in one face: 0.14531 seconds
|
||||
[TIME] Face quadrangulation: 0.031042 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.275295 seconds
|
||||
Initial map: #Darts=321591, #0-cells=55737, #1-cells=164019, #2-cells=107197, #ccs=1
|
||||
Reduced map: #Darts=3050, #0-cells=367, #1-cells=1525, #2-cells=956, #ccs=1
|
||||
Mesh data/big-genus-with-holes/obj12-1.000000-2.off
|
||||
[TIME] Simplification in one vertex: 0.088681 seconds
|
||||
[TIME] Simplification in one face: 0.144801 seconds
|
||||
[TIME] Face quadrangulation: 0.031967 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.267131 seconds
|
||||
Initial map: #Darts=298413, #0-cells=50589, #1-cells=152202, #2-cells=99471, #ccs=1
|
||||
Reduced map: #Darts=5672, #0-cells=161, #1-cells=2836, #2-cells=1413, #ccs=1
|
||||
Mesh data/big-genus-with-holes/obj13-1.000000-2.off
|
||||
[TIME] Simplification in one vertex: 0.049629 seconds
|
||||
[TIME] Simplification in one face: 0.075687 seconds
|
||||
[TIME] Face quadrangulation: 0.014603 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.140701 seconds
|
||||
Initial map: #Darts=165912, #0-cells=28588, #1-cells=84592, #2-cells=55304, #ccs=1
|
||||
Reduced map: #Darts=1742, #0-cells=90, #1-cells=871, #2-cells=545, #ccs=1
|
||||
Mesh data/big-genus-with-holes/obj14-1.000000-2.off
|
||||
[TIME] Simplification in one vertex: 0.244695 seconds
|
||||
[TIME] Simplification in one face: 0.340334 seconds
|
||||
[TIME] Face quadrangulation: 0.071015 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.659971 seconds
|
||||
Initial map: #Darts=667356, #0-cells=115730, #1-cells=340370, #2-cells=222452, #ccs=1
|
||||
Reduced map: #Darts=5712, #0-cells=638, #1-cells=2856, #2-cells=1998, #ccs=1
|
||||
Mesh data/big-genus-with-holes/obj15-1.000000-2.off
|
||||
[TIME] Simplification in one vertex: 1.34474 seconds
|
||||
[TIME] Simplification in one face: 1.54192 seconds
|
||||
[TIME] Face quadrangulation: 0.348176 seconds
|
||||
[TIME] Total time for computation of reduced map: 3.25409 seconds
|
||||
Initial map: #Darts=3167334, #0-cells=549481, #1-cells=1615459, #2-cells=1055778, #ccs=1
|
||||
Reduced map: #Darts=26678, #0-cells=3121, #1-cells=13339, #2-cells=9436, #ccs=1
|
||||
Mesh data/big-genus-with-holes/obj16-1.000000-2.off
|
||||
[TIME] Simplification in one vertex: 0.002708 seconds
|
||||
[TIME] Simplification in one face: 0.002982 seconds
|
||||
[TIME] Face quadrangulation: 0.000796 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.006591 seconds
|
||||
Initial map: #Darts=15681, #0-cells=2493, #1-cells=7993, #2-cells=5227, #ccs=1
|
||||
Reduced map: #Darts=880, #0-cells=9, #1-cells=440, #2-cells=201, #ccs=1
|
||||
Mesh data/big-genus-with-holes/obj17-1.000000-2.off
|
||||
[TIME] Simplification in one vertex: 0.007083 seconds
|
||||
[TIME] Simplification in one face: 0.010609 seconds
|
||||
[TIME] Face quadrangulation: 0.002437 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.020382 seconds
|
||||
Initial map: #Darts=36780, #0-cells=5494, #1-cells=18750, #2-cells=12260, #ccs=1
|
||||
Reduced map: #Darts=3372, #0-cells=19, #1-cells=1686, #2-cells=775, #ccs=1
|
||||
Mesh data/big-genus-with-holes/obj2-1.000000-2.off
|
||||
[TIME] Simplification in one vertex: 0.002827 seconds
|
||||
[TIME] Simplification in one face: 0.002946 seconds
|
||||
[TIME] Face quadrangulation: 0.000779 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.006666 seconds
|
||||
Initial map: #Darts=15555, #0-cells=2468, #1-cells=7932, #2-cells=5185, #ccs=1
|
||||
Reduced map: #Darts=948, #0-cells=13, #1-cells=474, #2-cells=225, #ccs=1
|
||||
Mesh data/big-genus-with-holes/obj3-1.000000-2.off
|
||||
[TIME] Simplification in one vertex: 0.385589 seconds
|
||||
[TIME] Simplification in one face: 0.519306 seconds
|
||||
[TIME] Face quadrangulation: 0.111635 seconds
|
||||
[TIME] Total time for computation of reduced map: 1.02332 seconds
|
||||
Initial map: #Darts=996714, #0-cells=172645, #1-cells=508357, #2-cells=332238, #ccs=1
|
||||
Reduced map: #Darts=9820, #0-cells=1247, #1-cells=4910, #2-cells=3131, #ccs=1
|
||||
Mesh data/big-genus-with-holes/obj5-1.000000-2.off
|
||||
[TIME] Simplification in one vertex: 0.019963 seconds
|
||||
[TIME] Simplification in one face: 0.035344 seconds
|
||||
[TIME] Face quadrangulation: 0.0059 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.061693 seconds
|
||||
Initial map: #Darts=93777, #0-cells=15548, #1-cells=47826, #2-cells=31259, #ccs=1
|
||||
Reduced map: #Darts=3200, #0-cells=61, #1-cells=1600, #2-cells=787, #ccs=1
|
||||
Mesh data/big-genus-with-holes/obj6-1.000000-2.off
|
||||
[TIME] Simplification in one vertex: 0.001449 seconds
|
||||
[TIME] Simplification in one face: 0.00172 seconds
|
||||
[TIME] Face quadrangulation: 0.000585 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.003816 seconds
|
||||
Initial map: #Darts=8826, #0-cells=1315, #1-cells=4501, #2-cells=2942, #ccs=1
|
||||
Reduced map: #Darts=822, #0-cells=7, #1-cells=411, #2-cells=186, #ccs=1
|
||||
Mesh data/big-genus-with-holes/obj7-1.000000-2.off
|
||||
[TIME] Simplification in one vertex: 0.001814 seconds
|
||||
[TIME] Simplification in one face: 0.001931 seconds
|
||||
[TIME] Face quadrangulation: 0.000688 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.004506 seconds
|
||||
Initial map: #Darts=11064, #0-cells=1614, #1-cells=5646, #2-cells=3688, #ccs=1
|
||||
Reduced map: #Darts=1146, #0-cells=4, #1-cells=573, #2-cells=257, #ccs=1
|
||||
Mesh data/big-genus-with-holes/obj8-1.000000-2.off
|
||||
[TIME] Simplification in one vertex: 0.004751 seconds
|
||||
[TIME] Simplification in one face: 0.00573 seconds
|
||||
[TIME] Face quadrangulation: 0.00114 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.011759 seconds
|
||||
Initial map: #Darts=28500, #0-cells=4727, #1-cells=14534, #2-cells=9500, #ccs=1
|
||||
Reduced map: #Darts=918, #0-cells=20, #1-cells=459, #2-cells=211, #ccs=1
|
||||
Mesh data/big-genus-with-holes/obj9-1.000000-2.off
|
||||
[TIME] Simplification in one vertex: 0.096304 seconds
|
||||
[TIME] Simplification in one face: 0.148061 seconds
|
||||
[TIME] Face quadrangulation: 0.030264 seconds
|
||||
[TIME] Total time for computation of reduced map: 0.276335 seconds
|
||||
Initial map: #Darts=320889, #0-cells=55616, #1-cells=163663, #2-cells=106963, #ccs=1
|
||||
Reduced map: #Darts=3042, #0-cells=362, #1-cells=1521, #2-cells=959, #ccs=1
|
||||
Mesh data/big/happy.off
|
||||
[TIME] Simplification in one vertex: 1.40868 seconds
|
||||
[TIME] Simplification in one face: 1.77778 seconds
|
||||
[TIME] Face quadrangulation: 0.340586 seconds
|
||||
[TIME] Total time for computation of reduced map: 3.54039 seconds
|
||||
Initial map: #Darts=3263148, #0-cells=543652, #1-cells=1631574, #2-cells=1087716, #ccs=1
|
||||
Reduced map: #Darts=832, #0-cells=2, #1-cells=416, #2-cells=208, #ccs=1
|
||||
Mesh data/big/iphigenia.off
|
||||
[TIME] Simplification in one vertex: 0.760665 seconds
|
||||
[TIME] Simplification in one face: 1.06874 seconds
|
||||
[TIME] Face quadrangulation: 0.192173 seconds
|
||||
[TIME] Total time for computation of reduced map: 2.03018 seconds
|
||||
Initial map: #Darts=2110536, #0-cells=351750, #1-cells=1055268, #2-cells=703512, #ccs=1
|
||||
Reduced map: #Darts=32, #0-cells=2, #1-cells=16, #2-cells=8, #ccs=1
|
||||
Mesh data/big/xyzrgb_statuette.off
|
||||
[TIME] Simplification in one vertex: 14.6903 seconds
|
||||
[TIME] Simplification in one face: 16.1494 seconds
|
||||
[TIME] Face quadrangulation: 2.88612 seconds
|
||||
[TIME] Total time for computation of reduced map: 33.841 seconds
|
||||
Initial map: #Darts=30000000, #0-cells=4999996, #1-cells=15000000, #2-cells=10000000, #ccs=1
|
||||
Reduced map: #Darts=24, #0-cells=2, #1-cells=12, #2-cells=6, #ccs=1
|
||||
|
|
@ -0,0 +1,168 @@
|
|||
#include <CGAL/Curves_on_surface_topology.h>
|
||||
#include <CGAL/Path_on_surface.h>
|
||||
#include <CGAL/Polygonal_schema.h>
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
[[ noreturn ]] void usage(int /*argc*/, char** argv)
|
||||
{
|
||||
std::cout<<"usage: "<<argv[0]<<" scheme [-nbdefo D] [-nbedges E] "
|
||||
<<" [-nbtests N] [-seed S] [-time]"<<std::endl
|
||||
<<" Load the given polygonal scheme (by default \"a b -a -b\"),"
|
||||
<< "compute one random path, deform it "
|
||||
<<"into a second path and test that the two paths are homotope."
|
||||
<<std::endl
|
||||
<<" -nbdefo D: use D deformations to generate the second path (by default a random number between 10 and 100)."<<std::endl
|
||||
<<" -nbedges E: generate paths of length E (by default a random number beween 10 and 100)."<<std::endl
|
||||
<<" -nbtests N: do N tests of homotopy (using 2*N random paths) (by default 1)."<<std::endl
|
||||
<<" -seed S: uses S as seed of random generator. Otherwise use a different seed at each run (based on time)."<<std::endl
|
||||
<<" -time: display computation times."<<std::endl
|
||||
<<std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
[[ noreturn ]] void error_command_line(int argc, char** argv, const char* msg)
|
||||
{
|
||||
std::cout<<"ERROR: "<<msg<<std::endl;
|
||||
usage(argc, argv);
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
void process_command_line(int argc, char** argv,
|
||||
std::string& file,
|
||||
bool& withD,
|
||||
unsigned int& D,
|
||||
bool& withE,
|
||||
unsigned int& E,
|
||||
unsigned int& N,
|
||||
CGAL::Random& random,
|
||||
bool& time)
|
||||
{
|
||||
std::string arg;
|
||||
for (int i=1; i<argc; ++i)
|
||||
{
|
||||
arg=argv[i];
|
||||
if (arg=="-nbdefo")
|
||||
{
|
||||
if (i==argc-1)
|
||||
{ error_command_line(argc, argv, "Error: no number after -nbdefo option."); }
|
||||
withD=true;
|
||||
D=static_cast<unsigned int>(std::stoi(std::string(argv[++i])));
|
||||
}
|
||||
else if (arg=="-nbedges")
|
||||
{
|
||||
if (i==argc-1)
|
||||
{ error_command_line(argc, argv, "Error: no number after -nbedges option."); }
|
||||
withE=true;
|
||||
E=static_cast<unsigned int>(std::stoi(std::string(argv[++i])));
|
||||
}
|
||||
else if (arg=="-nbtests")
|
||||
{
|
||||
if (i==argc-1)
|
||||
{ error_command_line(argc, argv, "Error: no number after -nbtests option."); }
|
||||
N=static_cast<unsigned int>(std::stoi(std::string(argv[++i])));
|
||||
}
|
||||
else if (arg=="-seed")
|
||||
{
|
||||
if (i==argc-1)
|
||||
{ error_command_line(argc, argv, "Error: no number after -seed option."); }
|
||||
random=CGAL::Random(static_cast<unsigned int>(std::stoi(std::string(argv[++i])))); // initialize the random generator with the given seed
|
||||
}
|
||||
else if (arg=="-time")
|
||||
{ time=true; }
|
||||
else if (arg=="-h" || arg=="--help" || arg=="-?")
|
||||
{ usage(argc, argv); }
|
||||
else if (arg[0]=='-')
|
||||
{ std::cout<<"Unknown option "<<arg<<", ignored."<<std::endl; }
|
||||
else
|
||||
{ file=arg; }
|
||||
}
|
||||
|
||||
if (N==0) { N=1; }
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
using namespace CGAL::Surface_mesh_topology;
|
||||
std::string scheme="a b -a -b";
|
||||
bool withD=false;
|
||||
unsigned int D=0;
|
||||
bool withE=false;
|
||||
unsigned int E=0;
|
||||
unsigned int N=1;
|
||||
CGAL::Random random; // Used when user do not provide its own seed.
|
||||
bool time=false;
|
||||
|
||||
process_command_line(argc, argv, scheme, withD, D, withE, E, N, random, time);
|
||||
|
||||
Polygonal_schema_with_combinatorial_map<> cm;
|
||||
cm.add_facet(scheme);
|
||||
std::cout<<"Initial map: ";
|
||||
cm.display_characteristics(std::cout) << ", valid="
|
||||
<< cm.is_valid() << std::endl;
|
||||
|
||||
Curves_on_surface_topology<Polygonal_schema_with_combinatorial_map<> > smct(cm, time);
|
||||
smct.compute_minimal_quadrangulation(time);
|
||||
std::cout<<"Reduced map: ";
|
||||
smct.get_minimal_quadrangulation().display_characteristics(std::cout)
|
||||
<< ", valid="<< smct.get_minimal_quadrangulation().is_valid() << std::endl;
|
||||
|
||||
unsigned int nbcontractible=0;
|
||||
std::vector<std::size_t> errors_seeds;
|
||||
|
||||
for (unsigned int i=0; i<N; ++i)
|
||||
{
|
||||
if (i!=0)
|
||||
{
|
||||
random=CGAL::Random(random.get_int(0, std::numeric_limits<int>::max()));
|
||||
}
|
||||
std::cout<<"Random seed: "<<random.get_seed()<<": ";
|
||||
|
||||
if (!withE)
|
||||
{ E=static_cast<unsigned int>(random.get_int
|
||||
(10, std::max(std::size_t(11),
|
||||
cm.number_of_darts()/10))); }
|
||||
|
||||
if (!withD)
|
||||
{ D=static_cast<unsigned int>(random.get_int
|
||||
(10, std::max(std::size_t(11),
|
||||
cm.number_of_darts()/10))); }
|
||||
|
||||
|
||||
|
||||
Path_on_surface<Polygonal_schema_with_combinatorial_map<>> path1(cm);
|
||||
path1.generate_random_closed_path(E, random);
|
||||
|
||||
std::cout<<"Path1 size: "<<path1.length()<<" (from "<<E<<" darts); ";
|
||||
Path_on_surface<Polygonal_schema_with_combinatorial_map<>> deformed_path1(path1);
|
||||
deformed_path1.update_path_randomly(D, random);
|
||||
std::cout<<"Path2 size: "<<deformed_path1.length()<<" (from "<<D<<" deformations).";
|
||||
std::cout<<std::endl;
|
||||
|
||||
if (smct.is_contractible(path1, time))
|
||||
{ ++nbcontractible; }
|
||||
|
||||
bool res=smct.are_freely_homotopic(path1, deformed_path1, time);
|
||||
if (!res)
|
||||
{ errors_seeds.push_back(random.get_seed()); }
|
||||
}
|
||||
|
||||
if (errors_seeds.empty())
|
||||
{
|
||||
if (N==1) { std::cout<<"Test OK: both paths are homotopic."<<std::endl; }
|
||||
else { std::cout<<"All the "<<N<<" tests OK: each pair of paths were homotopic."<<std::endl; }
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout<<"ERRORS for "<<errors_seeds.size()<<" tests among "<<N
|
||||
<<" (i.e. "<<(double)(errors_seeds.size()*100)/double(N)<<"%)."<<std::endl;
|
||||
std::cout<<"Errors for seeds: ";
|
||||
for (std::size_t i=0; i<errors_seeds.size(); ++i)
|
||||
{ std::cout<<errors_seeds[i]<<" "; }
|
||||
std::cout<<std::endl;
|
||||
}
|
||||
|
||||
std::cout<<"Number of contractible paths: "<<nbcontractible<<" among "<<N
|
||||
<<" (i.e. "<<(double)(nbcontractible*100)/double(N)<<"%)."<< std::endl
|
||||
<< "==============" <<std::endl;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
#include <CGAL/Linear_cell_complex_for_combinatorial_map.h>
|
||||
#include <CGAL/Linear_cell_complex_constructors.h>
|
||||
#include <CGAL/Curves_on_surface_topology.h>
|
||||
#include <CGAL/Path_on_surface.h>
|
||||
|
||||
typedef CGAL::Linear_cell_complex_for_combinatorial_map<2,3> LCC_3_cmap;
|
||||
using namespace CGAL::Surface_mesh_topology;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
std::string file;
|
||||
for (unsigned i=1; i<argc; ++i)
|
||||
{
|
||||
file = argv[i];
|
||||
std::ifstream in(file);
|
||||
if (!in.is_open())
|
||||
{
|
||||
std::cout<<"ERROR reading file " + file<<std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
LCC_3_cmap map;
|
||||
CGAL::load_off(map, file.c_str());
|
||||
Curves_on_surface_topology<LCC_3_cmap> cst(map, true);
|
||||
std::cout << "Mesh " << file << std::endl;
|
||||
cst.compute_minimal_quadrangulation(true);
|
||||
|
||||
std::cout<<"Initial map: ";
|
||||
map.display_characteristics(std::cout)<<std::endl;
|
||||
std::cout<<"Reduced map: ";
|
||||
cst.get_minimal_quadrangulation().display_characteristics(std::cout)
|
||||
<<std::endl;
|
||||
}
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Usage run-benchmarks.sh [1 2 3]
|
||||
# By default, run the three benchmarks.
|
||||
# If 1, 2, or 3, run only the given benchmark.
|
||||
|
||||
# Requirement:
|
||||
# * data: a link to the directory containing /big/*.off big-genus/*.off and big-genus-with-holes/*.off
|
||||
# * quadrangulation_computation_benchmarks: Bench1: a link to the exe of benchmark/quadrangulation_computation_benchmarks.cpp
|
||||
# * path_homotopy: Bench2: a link to the exe of examples/Surface_mesh_topology/path_homotopy.cpp
|
||||
# * path_homotopy_with_schema: Bench3: a link to the exe of benchmark/path_homotopy_with_schema.cpp
|
||||
|
||||
# Output:
|
||||
# 3 files for the 3 benchmarks:
|
||||
# * res-quadrangulation-computation.txt for Bench1
|
||||
# * res-path-homotopy.txt for Bench2
|
||||
# * res-polygonal-schema.txt for Bench3
|
||||
# These files can be transform as data for gnuplot, using the script generate-gnuplot-data.sh
|
||||
|
||||
# You can run all the benchmarks or only one.
|
||||
if [ $# -ge 2 ]
|
||||
then
|
||||
echo "ERROR usage: run-benchmarks.sh [1 2 3]."
|
||||
exit 1
|
||||
elif [ $# -eq 0 ]
|
||||
then
|
||||
BENCH=ALL
|
||||
else
|
||||
BENCH="${1}"
|
||||
fi
|
||||
|
||||
# Bench 1
|
||||
if [ ${BENCH} = ALL -o ${BENCH} = 1 ]
|
||||
then
|
||||
all_files=`ls data/big/*.off data/big-genus/*.off data/big-genus-with-holes/*.off`
|
||||
./quadrangulation_computation_benchmarks ${all_files} > res-quadrangulation-computation.txt
|
||||
fi
|
||||
|
||||
# Bench 2
|
||||
if [ ${BENCH} = ALL -o ${BENCH} = 2 ]
|
||||
then
|
||||
all_files="data/big/happy.off data/big-genus/obj9.off"
|
||||
rm -f res-path-homotopy.txt
|
||||
for file in ${all_files}
|
||||
do
|
||||
./path_homotopy -L 100 10000 -D 100 10000 -N 100 $file -time >> res-path-homotopy.txt
|
||||
done
|
||||
fi
|
||||
|
||||
# Bench 3
|
||||
if [ ${BENCH} = ALL -o ${BENCH} = 3 ]
|
||||
then
|
||||
rm -f res-polygonal-schema.txt
|
||||
for k in 10 20 30 100 200 300 1000 2000 3000 10000 20000 30000 100000 200000 300000 1000000 2000000 3000000 10000000 20000000 30000000
|
||||
do
|
||||
./path_homotopy_with_schema "a b -a -b c d -c -d e f -e -f g h -g -h i j -i -j" -nbedges ${k} -nbdefo 100 -nbtests 10 -time >> res-polygonal-schema.txt
|
||||
done
|
||||
fi
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
|
||||
namespace CGAL {
|
||||
namespace Surface_mesh_topology {
|
||||
/*!
|
||||
\ingroup PkgSurfaceMeshTopologyClasses
|
||||
|
||||
The class `Curves_on_surface_topology` provides methods to test homotopy on paths. Each object of this class is constructed from an external mesh, either a \ref CombinatorialMap "2D combinatorial map" or a model of a FaceGraph. It maintains a correspondence between this mesh and an internal representation, computed the first time an homotopy test is called. The user must not modify the input surface as long as homotopy tests are performed with this `Curves_on_surface_topology`.
|
||||
|
||||
\tparam Mesh a model of `CombinatorialMap` or of `FaceGraph`
|
||||
*/
|
||||
template<typename Mesh>
|
||||
class Curves_on_surface_topology
|
||||
{
|
||||
public:
|
||||
|
||||
/*! creates a `Curves_on_surface_topology` object using `amesh` as input.
|
||||
*/
|
||||
Curves_on_surface_topology(const Mesh& amesh);
|
||||
|
||||
/*! returns `true` if the closed paths `p1` and `p2` are freely homotopic.
|
||||
* @pre `p1` and `p2` must be two paths on `amesh`.
|
||||
*/
|
||||
bool are_freely_homotopic(const Path_on_surface<Mesh>& p1,
|
||||
const Path_on_surface<Mesh>& p2) const;
|
||||
|
||||
/*! returns `true` if the paths `p1` and `p2` are homotopic with fixed endpoints. The paths `p1` and `p2` must have the same endpoints but must not be closed. Equivalent to `Curves_on_surface_topology::is_contractible(q)` where `q` is the concatenation of `p1` and the reverse of `p2`.
|
||||
* @pre `p1` and `p2` must be two paths on `amesh`.
|
||||
*/
|
||||
bool are_homotopic_with_fixed_endpoints(const Path_on_surface<Mesh>& p1,
|
||||
const Path_on_surface<Mesh>& p2) const;
|
||||
|
||||
/*! returns `true` if the closed path `p` is contractible.
|
||||
* @pre `p` must be a closed path on `amesh`.
|
||||
*/
|
||||
bool is_contractible(const Path_on_surface<Mesh>& p) const;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,93 @@
|
|||
|
||||
namespace CGAL {
|
||||
namespace Surface_mesh_topology {
|
||||
/*!
|
||||
\ingroup PkgSurfaceMeshTopologyClasses
|
||||
|
||||
The class `Path_on_surface` represents a walk in a mesh which is either a model of `CombinatorialMap`, a model of `GeneralizedMap` or a model of a `FaceGraph`. Each object of this class is constructed from an external mesh on which the path should lie. A path is represented as a sequence of darts or halfedges, each one representing an oriented edge in the path. The class `Path_on_surface` behaves as a container for this sequence of darts/halfedges. Elements are added in the path one at a time to the path thanks to the `push_back()` method.
|
||||
|
||||
\tparam Mesh a model of `CombinatorialMap`, `GeneralizedMap` or of `FaceGraph`
|
||||
*/
|
||||
template<typename Mesh>
|
||||
class Path_on_surface
|
||||
{
|
||||
public:
|
||||
/*!
|
||||
%halfedge_descriptor type. A handle to Dart for combinatorial/generalized maps, or a halfedge descriptor for models of FaceGraph.
|
||||
*/
|
||||
typedef unspecified_type halfedge_descriptor;
|
||||
|
||||
/// creates an empty path object which lies on `amesh`.
|
||||
Path_on_surface(const Mesh& amesh);
|
||||
|
||||
/// returns `true` iff this path is empty
|
||||
bool is_empty() const;
|
||||
|
||||
/// returns `true` iff this path is closed.
|
||||
bool is_closed() const;
|
||||
|
||||
/// returns `true` iff this path does not pass twice through a same edge or a same vertex.
|
||||
bool is_simple() const;
|
||||
|
||||
/// returns the length of the path, i.e. its number of edges.
|
||||
std::size_t length() const;
|
||||
|
||||
/// returns the ith dart of the path.
|
||||
/// @pre i<`length()`.
|
||||
halfedge_descriptor operator[] (std::size_t i) const;
|
||||
|
||||
/// clears this path.
|
||||
void clear();
|
||||
|
||||
/// returns `true` iff `hd` can be added at the end of this path.
|
||||
bool can_be_pushed(halfedge_descriptor hd) const;
|
||||
|
||||
/// adds `hd` at the end of this path.
|
||||
/// @pre `can_be_pushed(hd)`
|
||||
void push_back(halfedge_descriptor hd);
|
||||
|
||||
/// returns `true` iff the dart/halfedge with index `i` can be added at the end of this path.
|
||||
/// If Mesh is a `Polyhedron_3`, takes time proportional to the number of darts/halfedges.
|
||||
bool can_be_pushed_by_index(std::size_t i) const;
|
||||
|
||||
/// adds the dart/halfedge with index `i` at the end of this path.
|
||||
/// If Mesh is a `Polyhedron_3`, takes time proportional to the number of halfedges.
|
||||
/// @pre `can_be_pushed_by_index(i)`
|
||||
void push_back_by_index(std::size_t i);
|
||||
|
||||
/// adds successively all dart/halfedges in `l` (a sequence of indices), at the end of the path.
|
||||
/// If Mesh is a `Polyhedron_3`, takes time proportional to the number of halfedges.
|
||||
/// For each index `i`, `can_be_pushed_by_index(i)` should be true.
|
||||
void push_back_by_index(std::initializer_list<std::size_t> l);
|
||||
|
||||
/// adds the dart/halfedge obtained by turning `nb` times around the target vertex of the last dart/halfedge in this path, in the positive circular order. To extend with a positive 1 turn thus amounts to extend with the `next()` pointer. (A zero turn corresponds to the `opposite()` pointer.)
|
||||
/// @pre !`is_empty()`
|
||||
void extend_positive_turn(std::size_t nb);
|
||||
|
||||
/// adds the dart/halfedge obtained by turning `nb` times around the target vertex of the last dart/halfedge in this path, in the negative circular order. To extend with a negative 1 turn thus amounts to extend with the composite pointer: `opposite(prev(opposite()))`.
|
||||
/// @pre !`is_empty()`
|
||||
void extend_negative_turn(std::size_t nb);
|
||||
|
||||
/// returns `true` iff the dart/halfedge with label `l` can be added at the end of this path.
|
||||
/// @pre Mesh must be a model of `PolygonalSchema` concept.
|
||||
bool can_be_pushed_by_label(const std::string& l) const;
|
||||
|
||||
/// adds successively all darts/halfedges in `s` (a sequence of labels separated by spaces) at the end of this path. For each label, l, `can_be_pushed_by_label(l)` should be true.
|
||||
/// @pre Mesh must be a model of `PolygonalSchema` concept.
|
||||
void push_back_by_label(const std::string& s);
|
||||
|
||||
/// concatenates `other` to this path.
|
||||
/// @pre the last vertex of this path should coincide with the first vertex of `other`.
|
||||
Self& operator+=(const Self& other);
|
||||
|
||||
/// reverses this path (i.e. negates its orientation).
|
||||
void reverse();
|
||||
|
||||
/// creates a random open path with `length` darts/halfedges.
|
||||
void generate_random_path(std::size_t length, Random& random=get_default_random());
|
||||
|
||||
/// creates a random closed path with at least `length` darts/halfedges.
|
||||
void generate_random_closed_path(std::size_t length, Random& random=get_default_random());
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
|
||||
namespace CGAL {
|
||||
namespace Surface_mesh_topology {
|
||||
/*!
|
||||
\ingroup PkgSurfaceMeshTopologyClasses
|
||||
|
||||
The class `Polygonal_schema_with_combinatorial_map` is a model of `PolygonalSchema` using `Combinatorial_map` as underlying model.
|
||||
|
||||
\tparam Items a model of the `PolygonalSchemaItems` concept. Equal to `Polygonal_schema_min_items` by default.
|
||||
|
||||
\tparam Alloc has to match the standard allocator requirements. The `rebind` mechanism `Alloc` will be used to create appropriate allocators internally with value type `Dart`. Equal to `CGAL_ALLOCATOR(int)` from `<CGAL/memory.h>` by default.
|
||||
*/
|
||||
template<typename Items, typename Alloc>
|
||||
class Polygonal_schema_with_combinatorial_map: public CGAL::Combinatorial_map<2, Items, Alloc>
|
||||
{
|
||||
};
|
||||
|
||||
/*!
|
||||
\ingroup PkgSurfaceMeshTopologyClasses
|
||||
|
||||
The class `Polygonal_schema_with_generalized_map` is a model of `PolygonalSchema` using `Generalized_map` as underlying model.
|
||||
|
||||
\tparam Items a model of the `PolygonalSchemaItems` concept. Equal to `Polygonal_schema_min_items` by default.
|
||||
|
||||
\tparam Alloc has to match the standard allocator requirements. The `rebind` mechanism `Alloc` will be used to create appropriate allocators internally with value type `Dart`. Equal to `CGAL_ALLOCATOR(int)` from `<CGAL/memory.h>` by default.
|
||||
*/
|
||||
template<typename Items, typename Alloc>
|
||||
class Polygonal_schema_with_generalized_map: public CGAL::Generalized_map<2, Items, Alloc>
|
||||
{
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
|
||||
namespace CGAL {
|
||||
namespace Surface_mesh_topology {
|
||||
/*!
|
||||
\ingroup PkgSurfaceMeshTopologyClasses
|
||||
|
||||
The class `Polygonal_schema_min_items` defines a struct with a std::string as the information associated with darts, and no attribute is enabled.
|
||||
|
||||
\cgalModels `PolygonalSchemaItems`
|
||||
|
||||
\cgalHeading{Example}
|
||||
|
||||
The following example shows one implementation of the `Polygonal_schema_min_items` class.
|
||||
|
||||
\code{.cpp}
|
||||
|
||||
struct Polygonal_schema_min_items
|
||||
{
|
||||
template <class PS>
|
||||
struct Dart_wrapper
|
||||
{
|
||||
struct Info_for_darts
|
||||
{ std::string m_label; };
|
||||
typedef Info_for_darts Dart_info;
|
||||
};
|
||||
};
|
||||
|
||||
\endcode
|
||||
|
||||
\sa `CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map<Items,Alloc>`
|
||||
\sa `CGAL::Surface_mesh_topology::Polygonal_schema_with_generalized_map<Items,Alloc>`
|
||||
|
||||
*/
|
||||
struct Polygonal_schema_min_items {
|
||||
|
||||
}; /* end Linear_cell_complex_min_items */
|
||||
|
||||
} /* end namespace Surface_mesh_topology */
|
||||
} /* end namespace CGAL */
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
namespace CGAL {
|
||||
|
||||
/*!
|
||||
\ingroup PkgDrawFaceGraphWithPaths
|
||||
|
||||
opens a new window and draws `amesh`, either a 2D linear cell complex or a model of the FaceGraph concept, plus the paths lying on this mesh given in `paths`.
|
||||
A call to this function is blocking, that is the program continues as soon as the user closes the window. This function requires CGAL_Qt5, and is only available if the flag CGAL_USE_BASIC_VIEWER is defined at compile time.
|
||||
\tparam Mesh either a 2D linear cell complex or a model of the FaceGraph concept.
|
||||
\param amesh the mesh to draw.
|
||||
\param apaths the paths to draw, which should lie on `amesh`.
|
||||
*/
|
||||
template<class Mesh>
|
||||
void draw(const Mesh& amesh,
|
||||
const std::vector<Path_on_surface<Mesh> >& apaths);
|
||||
|
||||
} /* namespace CGAL */
|
||||
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
/*!
|
||||
\ingroup PkgSurfaceMeshTopologyConcepts
|
||||
\cgalConcept
|
||||
|
||||
The concept `PolygonalSchema` defines a 2D polygonal schema, i.e. a combinatorial surface with labeled edges. A PolygonalSchema is created incrementally by adding facets one at a time. A label is any word, that does not contain a space.
|
||||
|
||||
PolygonalSchema::Dart_info should be a class having a public data member std::string m_label.
|
||||
PolygonalSchema::dimension should be equal to 2.
|
||||
|
||||
\cgalRefines GenericMap
|
||||
|
||||
\cgalHasModel \link CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map `CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map<Items,Alloc>`\endlink
|
||||
\cgalHasModel \link CGAL::Surface_mesh_topology::Polygonal_schema_with_generalized_map `CGAL::Surface_mesh_topology::Polygonal_schema_with_generalized_map<Items,Alloc>`\endlink
|
||||
*/
|
||||
|
||||
class PolygonalSchema
|
||||
{
|
||||
public:
|
||||
/// creates an empty `PolygonalSchema` object.
|
||||
PolygonalSchema();
|
||||
|
||||
/// starts a new facet.
|
||||
void init_facet();
|
||||
|
||||
/// finishes the current facet. Returns the first dart of this facet.
|
||||
/// @pre A facet is under creation.
|
||||
Dart_handle finish_facet();
|
||||
|
||||
/// adds one edge to the current facet, given by its label `l` (any string containing no space, using minus sign for orientation).
|
||||
/// Since the surface is oriented, each label can be used only twice with opposite signs. If this method is called with a label already used, with same sign, an error message is given and this label is ignored.
|
||||
/// @pre A facet is under creation.
|
||||
void add_edge_to_facet(const std::string& l);
|
||||
|
||||
/// adds the given edges to the current facet.
|
||||
/// `s` is a sequence of labels, separated by spaces. All the corresponding edges are added into the current facet.
|
||||
/// @pre A facet is under creation.
|
||||
void add_edges_to_facet(const std::string& s);
|
||||
|
||||
/// adds directly one facet giving the sequence of labels `s` of all its edges (labels are separated by spaces).
|
||||
void add_facet(const std::string& s);
|
||||
|
||||
/// returns the label of dart `dh`.
|
||||
std::string get_label(Dart_handle dh) const;
|
||||
|
||||
/// returns dart with label `s`, NULL if this label is not used.
|
||||
Dart_handle get_dart_labeled(const std::string & s) const;
|
||||
|
||||
/// returns true iff the facet containing `dh` is perforated.
|
||||
bool is_perforated(Dart_const_handle dh) const;
|
||||
|
||||
/// Shortcut for is_perforated(get_dart_labeled(s)).
|
||||
bool is_perforated(const std::string & s) const;
|
||||
|
||||
/// perforates the facet containing `dh`. Returns the number of darts of the face; 0 if the facet was already perforated.
|
||||
size_type perforate_facet(Dart_handle dh);
|
||||
|
||||
/// Shortcut for perforate_facet(get_dart_labeled(s)).
|
||||
size_type perforate_facet(const std::string & s);
|
||||
|
||||
/// fills the facet containing `dh`. Returns the number of darts of the face; 0 if the facet was already filled.
|
||||
size_type fill_facet(Dart_handle dh);
|
||||
|
||||
/// Shortcut for fill_facet(get_dart_labeled(s)).
|
||||
size_type fill_facet(const std::string & s);
|
||||
};
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
/*!
|
||||
\ingroup PkgSurfaceMeshTopologyConcepts
|
||||
\cgalConcept
|
||||
|
||||
The concept `PolygonalSchemaItems` allows to customize a PolygonalSchema by choosing the information associated with darts, and by enabling and disabling some attributes. `%Dart_wrapper<Map>::%Dart_info`, should be a class having a public data member std::string m_label.
|
||||
|
||||
\cgalRefines GenericMapItems
|
||||
|
||||
\cgalHasModel \link CGAL::Surface_mesh_topology::Polygonal_schema_min_items `CGAL::Surface_mesh_topology::Polygonal_schema_min_items`\endlink
|
||||
*/
|
||||
|
||||
class PolygonalSchemaItems
|
||||
{
|
||||
public:
|
||||
};
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
@INCLUDE = ${CGAL_DOC_PACKAGE_DEFAULTS}
|
||||
|
||||
PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - Surface Mesh Topology"
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
/// \defgroup PkgSurfaceMeshTopology Surface Mesh Topology Reference
|
||||
|
||||
/// \defgroup PkgSurfaceMeshTopologyConcepts Concepts
|
||||
/// \ingroup PkgSurfaceMeshTopology
|
||||
|
||||
/// \defgroup PkgSurfaceMeshTopologyClasses Classes
|
||||
/// \ingroup PkgSurfaceMeshTopology
|
||||
|
||||
/*!
|
||||
\code
|
||||
#include <CGAL/draw_face_graph_with_paths.h>
|
||||
\endcode
|
||||
*/
|
||||
/// \defgroup PkgDrawFaceGraphWithPaths Draw a Mesh with Paths
|
||||
/// \ingroup PkgSurfaceMeshTopology
|
||||
|
||||
|
||||
/*!
|
||||
\addtogroup PkgSurfaceMeshTopology
|
||||
\cgalPkgDescriptionBegin{Surface Mesh Topology,PkgSurfaceMeshTopologySummary}
|
||||
\cgalPkgPicture{surface-mesh-topology-logo.png}
|
||||
\cgalPkgSummaryBegin
|
||||
\cgalPkgAuthor{Guillaume Damiand, Francis Lazarus}
|
||||
\cgalPkgDesc{This package provides methods for testing if two (closed) paths on a combinatorial surface are homotopic. The user can choose between free homotopy and homotopy with fixed endpoints. A contractibility test is also provided; it amounts to test homotopy with the constant path. After an initialization step that takes linear time in the size of the input surface, the homotopy tests are performed in linear time in the size of the input curves.}
|
||||
\cgalPkgManuals{Chapter_Surface_Mesh_Topology,PkgSurfaceMeshTopology}
|
||||
\cgalPkgSummaryEnd
|
||||
\cgalPkgShortInfoBegin
|
||||
\cgalPkgSince{5.1}
|
||||
\cgalPkgBib{cgal:dl-smtopology}
|
||||
\cgalPkgLicense{\ref licensesGPL "GPL"}
|
||||
\cgalPkgShortInfoEnd
|
||||
\cgalPkgDescriptionEnd
|
||||
|
||||
\cgalClassifedRefPages
|
||||
|
||||
\cgalCRPSection{Concepts}
|
||||
- `PolygonalSchema`
|
||||
- `PolygonalSchemaItems`
|
||||
|
||||
\cgalCRPSection{Classes}
|
||||
- `CGAL::Surface_mesh_topology::Curves_on_surface_topology<Mesh>`
|
||||
- `CGAL::Surface_mesh_topology::Path_on_surface<Mesh>`
|
||||
- `CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map<Items,Alloc>`
|
||||
- `CGAL::Surface_mesh_topology::Polygonal_schema_with_generalized_map<Items,Alloc>`
|
||||
- `CGAL::Surface_mesh_topology::Polygonal_schema_min_items`
|
||||
|
||||
\cgalCRPSubsection{Draw a Mesh with Paths}
|
||||
- \link PkgDrawFaceGraphWithPaths CGAL::draw<Mesh>() \endlink
|
||||
*/
|
||||
|
|
@ -0,0 +1,200 @@
|
|||
namespace CGAL {
|
||||
/*!
|
||||
|
||||
\mainpage User Manual
|
||||
\anchor Chapter_Surface_Mesh_Topology
|
||||
\anchor ChapterSurfaceMeshTopology
|
||||
|
||||
\cgalAutoToc
|
||||
\author Guillaume Damiand and Francis Lazarus
|
||||
|
||||
This package provides an algorithm to test if a curve on a combinatorial surface can be continuously deformed into another curve.
|
||||
|
||||
\section SMTopology Introduction
|
||||
|
||||
Given a curve drawn on a surface one can ask if the curve can be continuously deformed to a point (i.e. a zero length curve). In other words, does there exist a continuous sequence of curves on the surface that starts with the input curve and ends to a point? Curves that deform to a point are said <em>contractible</em>. Any curve on a sphere is contractible but this is not true for all curves on a torus or on a surface with more complicated topology. The algorithms in this package are purely topological and do not assume any geometry on the input surface. In particular, the surface is not necessarily embedded in a Euclidean space.
|
||||
|
||||
The algorithm implemented in this package builds a data structure to efficiently answer queries of the following forms:
|
||||
- Given a combinatorial surface \f$\cal{M}\f$ and a closed curve specified as a sequence of edges of \f$\cal{M}\f$, decide if the curve is contractible on \f$\cal{M}\f$,
|
||||
- Given a combinatorial surface \f$\cal{M}\f$ and two closed curves on \f$\cal{M}\f$, decide if the two curves are related by a continuous transformation,
|
||||
- Given a combinatorial surface \f$\cal{M}\f$ and two non-necessarily closed curves on \f$\cal{M}\f$, decide if the two curves are related by a continuous transformation that fixes the curve extremities. The curves should have common endpoints, otherwise the answer to the query is trivially negative.
|
||||
|
||||
The second query asks if the curves are <em>freely homotopic</em> while the third one asks if the curves are <em>homotopic with fixed endpoints</em>. The three queries are globally referred to as <em>homotopy tests</em>. \cgalFigureRef{fig_sm_topology_homotopy} below illustrates the three types of queries.
|
||||
|
||||
\cgalFigureBegin{fig_sm_topology_homotopy, free-vs-fixed-endpoints.svg}
|
||||
On the upper left surface the green curve is contractible. The red and blue curves share the same (green) endpoint. (Being closed, their two endpoints coincide.) Although these last two curves are not homotopic with fixed endpoints they are freely homotopic as shown by the suggested continuous transformation of the blue curve.
|
||||
\cgalFigureEnd
|
||||
|
||||
The algorithms used are based on a paper by Erickson and Whittlesey \cgalCite{ew-tcsr-13}, providing a linear time algorithm for the above homotopy tests. This is a simplified version of the linear time algorithm by Lazarus and Rivaud \cgalCite{lr-hts-12}.
|
||||
|
||||
\section SMTopology_HowToUse API Description
|
||||
|
||||
\subsection SMTopology_Input Specifying the Input Surface and Curves
|
||||
|
||||
The homotopy tests are performed on a input surface represented as a model of `CombinatorialMap` or any model of `FaceGraph`. Note that combinatorial maps are based on darts and FaceGraphs are based on halfedges. To avoid repetitions we use the terms darts and halfedges interchangeably in the sequel.
|
||||
The input surface is supposed to be connected and orientable.
|
||||
The main class for this package is `Surface_mesh_topology::Curves_on_surface_topology`. Its constructor takes the input surface. An internal representation of the surface (described below) is computed the first time an homotopy test is called.
|
||||
|
||||
Each curve on this surface is contained in an instance of the class `Surface_mesh_topology::Path_on_surface`. An object in this class behaves as a list. This list is initially empty and the halfedges corresponding to the sequence of consecutive oriented edges of an input curve should be pushed back in this list. The class provides four ways for extending a nonempty path.
|
||||
- Simply push the next halfedge using the \ref Surface_mesh_topology::Path_on_surface::push_back "push_back()" member function.
|
||||
- The user may push the index of the next halfedge instead of the halfedge itself with the member function \ref Surface_mesh_topology::Path_on_surface::push_back_by_index "push_back_by_index()". This may however be at the cost of an overhead computation mapping the index to the actual dart.
|
||||
- The path may be extended with the member function \ref Surface_mesh_topology::Path_on_surface::extend_positive_turn "extend_positive_turn()" by specifying the next halfedge thanks to a number of positive turns with respect to the previous dart/halfedge in the path. Calling this previous halfedge `h`, extending by a positive one turn is thus equivalent to extend the path with `next(h)`. An analogous member function \ref Surface_mesh_topology::Path_on_surface::extend_negative_turn "extend_negative_turn()" is provided for convenience.
|
||||
- Finally, when the input surface is a model of `PolygonalSchema`, which is a model of `GenericMap` with labeled edges as explained in section \ref SMTopology_Schema, the user may push the label of the next halfedge instead of the halfedge itself with the member function \ref Surface_mesh_topology::Path_on_surface::push_back_by_label "push_back_by_label()".
|
||||
|
||||
In the first two cases, the source vertex of the added dart should coincide with the target vertex of the last dart in the path. The user is responsible for ensuring this condition. The member functions \ref Surface_mesh_topology::Path_on_surface::can_be_pushed "can_be_pushed()", \ref Surface_mesh_topology::Path_on_surface::can_be_pushed_by_index "can_be_pushed_by_index()" and \ref Surface_mesh_topology::Path_on_surface::can_be_pushed_by_label "can_be_pushed_by_label()" return `true` if and only if the condition is satisfied.
|
||||
|
||||
\subsection SMTopology_Schema Polygonal Schema Helper
|
||||
\subsubsection SMTopology_PL Polygonal Schema
|
||||
Specifying a path on a combinatorial surface might be a tedious task. Indeed, knowing in advance the pointer, index or turn of each consecutive halfedge in a path is not always easy. In order to facilitate this task, we provide an intuitive model of `CombinatorialMap` called `Surface_mesh_topology::Polygonal_schema_with_combinatorial_map`, a model of the `PolygonalSchema` concept. In this model, a surface is viewed as a collection of clockwise oriented polygonal facets with labeled boundary (oriented) edges. Boundary edges with the same label are glued together to form a surface. Each label should appear at most twice in the collection and a label that appears only once corresponds to a boundary edge. The label of the opposite of an oriented edge is preceded by a minus. For example, the opposite of 'a1' is '-a1'. Since we are dealing with orientable surfaces only, each label that appears twice must appear once with a minus.
|
||||
The user can add facets to the surface one at a time. Each facet is specified by the sequence of its oriented edge labels given as a string where the labels are words (any sequence of characters, except space) separated by blank spaces. In the next figure we see three examples of combinatorial maps described by a collection of facets with labeled edges.
|
||||
\cgalFigureBegin{fig_sm_incremental-builder, incremental-builder.svg}
|
||||
Left, a surface described by a single facet with eight edges pairwise identified. The resulting (topological) surface is shown in \cgalFigureRef{fig_cut-open}. Middle, a surface described by three labeled quadrilaterals. Right, a single labeled facet. The corresponding surface is topologically equivalent to the middle example.
|
||||
\cgalFigureEnd
|
||||
The code for creating the above left and middle examples appear in the \ref SMTopology_Example_II "polygonal schema examples" below.
|
||||
The class provides the following functionalities.
|
||||
- \ref PolygonalSchema::add_facet "add_facet(s)" adds a polygon to the current collection of polygons. If the polygon has "n" sides, "s" is a sequence of "n" edge labels possibly preceded by a minus and separated by blanks.
|
||||
- alternatively, the user can add a facet by adding edge labels one at a time using the member functions \ref PolygonalSchema::init_facet "init_facet()", \ref PolygonalSchema::add_edges_to_facet "add_edges_to_facet()" and \ref PolygonalSchema::finish_facet "finish_facet()"
|
||||
|
||||
\subsubsection SMTopology_PL_with_Boundary Polygonal Schema with Boundary
|
||||
As noted in the previous section \ref SMTopology_PL "Polygonal Schema", every label that appears only once in a polygonal schema corresponds to a boundary edge. The Polygonal Schema helper offers another mechanism to create surfaces with boundary. Each facet already added to a polygonal schema may be perforated to create a hole in the surface. The edges of a perforated facet thus becomes boundary edges. The reverse operation consists in filling the supposedly perforated facet. The class provides the following interface.
|
||||
- \ref PolygonalSchema::perforate_facet "perforate_facet (h)" perforates the facet identified by the halfedge `h`. If `s` is the label of the oriented edge corresponding to `h`, one may equivalently call perforate_facet (s).
|
||||
- Similarly, \ref PolygonalSchema::fill_facet "fill_facet (h or s)" turns a facet into a plain one.
|
||||
- The member functions \ref PolygonalSchema::get_dart_labeled "get_dart_labeled(s)" and \ref PolygonalSchema::get_label "get_label(h)" allow to easily pass from a halfedge to its label and vice versa.
|
||||
|
||||
As an example, one may perforate all the facets of a polygonal schema \f$\cal{M}\f$ to obtain a "skeleton" surface equivalent to a thickening of the graph composed of the edges of \f$\cal{M}\f$.
|
||||
|
||||
\subsubsection SMTopology_Curves_on_PS Curves on Polygonal Schema
|
||||
A `Surface_mesh_topology::Curves_on_surface_topology` can be constructed with a `Surface_mesh_topology::Polygonal_schema_with_combinatorial_map` as input surface. In this case, every halfedge has a label (possibly preceded by a minus) and a path can be specified by the sequence of labels corresponding to its halfedge sequence. A repeated call to the function \ref Surface_mesh_topology::Path_on_surface::push_back_by_label "push_back_by_label()" allows the user to specify the path in this way.
|
||||
|
||||
\subsection SMTopology_DS Data Structure Presentation
|
||||
|
||||
\subsubsection SMTopology_Build Building the Internal Surface Representation
|
||||
|
||||
A common first step in the homotopy test algorithms is to simplify the input combinatorial surface. This preprocessing step is done once and for all for a given mesh, the first time an homotopy test is called. The simplified surface is a quadrangulation, every face of which is a quadrilateral, stored in a `Surface_mesh_topology::Curves_on_surface_topology`. It has 2 vertices and \f$2g\f$ quadrilaterals where \f$g\f$ is the genus of
|
||||
the input surface. This is otherwise independent of the size of input surface,
|
||||
\note The user must not modify the input surface as long as homotopy tests are performed with this `Surface_mesh_topology::Curves_on_surface_topology`.
|
||||
|
||||
Each time a `Surface_mesh_topology::Path_on_surface` is provided for a homotopy test, it is first transformed to an equivalent path in the quadrangulation stored by the `Surface_mesh_topology::Curves_on_surface_topology`. This transformation is transparent to the user who has never access to the quadrangulation.
|
||||
|
||||
\subsection SMTopology_Queries Testing Homotopy
|
||||
|
||||
Given two `Surface_mesh_topology::Path_on_surface` \f$p_1\f$ and \f$p_2\f$, the class `Surface_mesh_topology::Curves_on_surface_topology` provides the following three functions:
|
||||
|
||||
- \ref Surface_mesh_topology::Curves_on_surface_topology::is_contractible "is_contractible"(\f$p_1\f$) returns `true` if the closed curve \f$p_1\f$ is contractible.
|
||||
|
||||
- \ref Surface_mesh_topology::Curves_on_surface_topology::are_freely_homotopic "are_freely_homotopic"(\f$p_1\f$, \f$p_2\f$) returns `true` if the closed curves \f$p_1\f$ and \f$p_2\f$ are freely homotopic.
|
||||
|
||||
- \ref Surface_mesh_topology::Curves_on_surface_topology::are_homotopic_with_fixed_endpoints "are_homotopic_with_fixed_endpoints"(\f$p_1\f$, \f$p_2\f$) returns `true` if the paths \f$p_1\f$ and \f$p_2\f$ are homotopic with fixed endpoints. This call is equivalent to \ref Surface_mesh_topology::Curves_on_surface_topology::is_contractible "is_contractible"(\f$p_1\cdot \overline{p_2}\f$), where \f$p_1\cdot \overline{p_2}\f$ is the concatenation of \f$p_1\f$ and the reverse of \f$p_2\f$.
|
||||
|
||||
|
||||
|
||||
\section SMTopology_Examples Examples
|
||||
\subsection SMTopology_Example_I Simple Example
|
||||
The following example shows how to load an off file and how to create three closed paths on this surface. Contractibility and free homotopy tests are then performed. The example also shows how to use the \cgal viewer if \cgal was compiled with Qt5.
|
||||
\cgalExample{Surface_mesh_topology/basic_example_surface_mesh_topology.cpp}
|
||||
|
||||
\subsection SMTopology_Example_II Polygonal Schema Examples
|
||||
Here, we show with two examples how to create a surface from a list of faces specified by edge label sequences.
|
||||
In this first example, we build a genus two torus surface from a single face, also called a polygonal schema. See left \cgalFigureRef{fig_sm_incremental-builder} for an illustration. Two closed paths are then created. The paths are freely homotopic but not homotopic with fixed endpoint.
|
||||
\cgalExample{Surface_mesh_topology/path_homotopy_with_symbols.cpp}
|
||||
|
||||
In this second example, we build a genus two torus surface from a set of three squares. See middle \cgalFigureRef{fig_sm_incremental-builder} for an illustration. The first two faces are added each with a single call to the member function `add_facet()`. The third face is build incrementally by adding its edge labels one at a time. We then create a contractible closed path.
|
||||
\cgalExample{Surface_mesh_topology/path_homotopy_with_symbols_2.cpp}
|
||||
|
||||
\subsection SMTopology_Example_III Open Path Example
|
||||
|
||||
In this third example, we create non closed paths on the same mesh as in the first example and perform homotopy tests with fixed endpoints. Here, a `Surface_mesh` is used as an alternative to a `CombinatorialMap`.
|
||||
\cgalExample{Surface_mesh_topology/open_path_homotopy.cpp}
|
||||
|
||||
\section SMTopology_Benchmarks Benchmarks
|
||||
|
||||
The machine used is a PC running Ubuntu 18.04 with an Intel CPU Core i7-4790 CPU clocked at 3.60GHz with 32GB of RAM.
|
||||
|
||||
\subsection SMTopology_bench1 Combinatorial Surface Topology Computation Time
|
||||
|
||||
The first time an homotopy test is called, we build a special quadrangulation of the surface as internal representation (as explained in Section \ref SMTopology_Theory "Implementation Details"). The complexity of this operation is linear in the number of darts of the input surface, as we can see in \cgalFigureRef{fig_sm_topology_bench1}.
|
||||
|
||||
For this benchmark, we computed 38 `Surface_mesh_topology::Curves_on_surface_topology` objects for different input surfaces with different number of darts (between 8,000 and 30,000,000). We show in the figure the computation time of the quadrangulation according to the number of darts of the input surface. We remind that this computation needs be done only once if you want to perform several path homotopy tests on the same surface.
|
||||
|
||||
\cgalFigureBegin{fig_sm_topology_bench1, computation-time-reduce-surface.svg}
|
||||
Computation time of `Surface_mesh_topology::Curves_on_surface_topology` constructions, according to the number of darts or the input surface.
|
||||
\cgalFigureEnd
|
||||
|
||||
\subsection SMTopology_bench2 Path Homotopy Tests
|
||||
|
||||
In this second benchmark, we use two surfaces as input (with respectively 543,652 vertices, 1,631,574 edges and 1,087,716 faces, and 55,498 vertices, 167,106 edges and 111,404 faces). We generate 100 random pairs of closed paths on each surface. The first path is generated randomly, with a lower bound for its length given by a random number between 100 and 10,000: passed the lower bound, the path is randomly extended until it returns to its origin vertex. The second path is generated from a sequence of elementary deformations of the first path, so that the two paths are homotopic. The number of elementary deformations is a random number between 100 and 10,000.
|
||||
|
||||
The computation time of the 200 `are_freely_homotopic()` tests are given in \cgalFigureRef{fig_sm_topology_bench2}, according to the number of darts of the two input paths.
|
||||
|
||||
\cgalFigureBegin{fig_sm_topology_bench2, computation-time-path-homotopy.svg}
|
||||
Computation time of `are_freely_homotopic()` tests, according to the number of darts or the input paths.
|
||||
\cgalFigureEnd
|
||||
|
||||
The third benchmark is similar to the previous one, except that we use a genus 5 surface with one vertex, 10 edges and 1 face. The length of the paths to be tested is varied between 10 and 30,000,000. The computation time of the `are_freely_homotopic()` tests are given in \cgalFigureRef{fig_sm_topology_bench3}. The free homotopy test takes 17 seconds for paths of length 10,000,000.
|
||||
\cgalFigureBegin{fig_sm_topology_bench3, computation-time-polygonal-schema.svg}
|
||||
Computation time of `are_freely_homotopic()` tests, according to the number of darts or the input paths for random paths on the canonical reduced surface of genus five.
|
||||
\cgalFigureEnd
|
||||
|
||||
Note that the linear time implementation of the algorithms is remarkably observed in each benchmark.
|
||||
|
||||
\section SMTopology_Theory Implementation Details
|
||||
|
||||
\subsection SMTopology_Quad_System Reducing to a Quadrangulation
|
||||
|
||||
A <em>quadrangulation</em> is a combinatorial map whose faces are quadrilaterals, i.e. have four sides.
|
||||
For efficiency of the homotopy test, the input combinatorial surface \f$\cal{M}\f$ is first turned into a quadrangulation with only two vertices. The transformation is performed as follows.
|
||||
-# A spanning tree of the graph composed of the vertices and edges of \f$\cal{M}\f$ is computed. See \cgalFigureRef{fig_spanning_tree}.
|
||||
\cgalFigureBegin{fig_spanning_tree,spanning_tree.svg}
|
||||
Left, a combinatorial map with three faces (red, yellow, green). Right, a spanning tree of its graph.
|
||||
\cgalFigureEnd
|
||||
|
||||
-# The edges of the spanning are contracted. The resulting surface has the same topology as \f$\cal{M}\f$ and has a single vertex.
|
||||
\cgalFigureBegin{fig_contract_tree,contract_tree.svg}
|
||||
The contraction of a spanning tree merges all the vertices into a single vertex.
|
||||
\cgalFigureEnd
|
||||
|
||||
-# The faces are merged into a single face by iteratively erasing edges incident to distinct faces. Those edges corresponds to a spanning tree of the dual combinatorial map.
|
||||
\cgalFigureBegin{fig_merge_faces,merge_faces.svg}
|
||||
The green, red and yellow faces are merged by removing edges. The resulting <em>reduced surface</em> has a single vertex and a single face.
|
||||
\cgalFigureEnd
|
||||
Cutting through the graph of the reduced surface, we obtain a face that can be flattened into the plane.
|
||||
\cgalFigureBegin{fig_cut-open,cut-open.svg}
|
||||
If \f$\cal{M}\f$ is obtained by gluing \f$g\f$ tori, i.e. \f$\cal{M}\f$ has genus \f$g\f$, the cut-open reduced surface has \f$4g\f$ sides.
|
||||
\cgalFigureEnd
|
||||
|
||||
-# A vertex is introduced in the middle of this unique face and joined by new edges to the corners of this face to form a triangulation with \f$4g\f$ triangles. Gluing back along the (old) edges of the reduced surface and deleting them amounts to merge the triangles by pairs. We thus obtain a quadrangulated surface \f$\cal{Q}\f$ with \f$2g\f$ quadrilaterals, \f$4g\f$ edges and 2 vertices.
|
||||
\cgalFigureBegin{fig_quad_mesh,quad_mesh.svg}
|
||||
Triangles of the same color are merged into quadrilaterals. All the light blue vertices correspond to a same vertex on the glued surface.
|
||||
\cgalFigureEnd
|
||||
|
||||
This quadrangulation \f$\cal{Q}\f$ is stored in a `Surface_mesh_topology::Curves_on_surface_topology`. In order to perform a homotopy test, each input curve \f$C\f$ is transformed into a (closed) path in \f$\cal{Q}\f$ as follows. If an edge of \f$C\f$ is part of the contracted spanning tree, we simply ignore that edge. Otherwise the edge can be replaced by two consecutive edges of \f$\cal{Q}\f$ to obtain a new path \f$C'\f$ in the vertex-edge graph of \f$\cal{Q}\f$ so that \f$C'\f$ is a continuous deformation of \f$C\f$. Hence, deciding if \f$C\f$ is contractible in \f$\cal{M}\f$ is equivalent to test if \f$C'\f$ is contractible in \f$\cal{Q}\f$.
|
||||
|
||||
\subsection SMTopology_Canonical Canonical Form
|
||||
|
||||
In order to test if two input curves \f$C\f$ and \f$D\f$ in \f$\cal{M}\f$ are homotopic they are first replaced by curves \f$C'\f$ and \f$D'\f$ in \f$\cal{Q}\f$ as above. Those curves are further transformed into <em>canonical forms</em> that only depend on their homotopy classes. The transformation to canonical form relies on three basic operations that we now describe.
|
||||
-# A <em>bracket</em> in a curve is a subsequence of edges along a row of quadrilaterals, surrounded by two edges along the end sides of the row. A bracket can be flattened by replacing the corresponding subpath with a shorter subpath going along the other long side of the row. See \cgalFigureRef{fig_bracket}.
|
||||
\cgalFigureBegin{fig_bracket,bracket.svg}
|
||||
Left, a blue curve in a quadrangulation (for clarity the quadrangulation has more than two vertices). Middle, a bracket of the blue curve. Right, the bracket has been flattened.
|
||||
\cgalFigureEnd
|
||||
|
||||
-# A <em>spur</em> in a curve is a subsequence of two opposite edges. A spur can be deleted to shorten the curve. See \cgalFigureRef{fig_spur}.
|
||||
\cgalFigureBegin{fig_spur,spur.svg}
|
||||
Removing a spur.
|
||||
\cgalFigureEnd
|
||||
|
||||
-# A <em>right L-shape</em> in a curve is a subsequence of edges going along the exterior side of a sequence of quadrilaterals forming an L, with the interior of the L to its right. This notion takes into account the traversal direction of the curve. A right L-shape subpath can be pushed to the right by replacing it with the other side of the L-shaped sequence of quadrilaterals. See \cgalFigureRef{fig_push_right}
|
||||
\cgalFigureBegin{fig_push_right,push_right.svg}
|
||||
Pushing an L-shaped subpath to its right.
|
||||
\cgalFigureEnd
|
||||
|
||||
The canonical form of a curve is obtained by flattening its brackets, removing its spurs and pushing its right L-shapes to the right until the curve has no more brackets, spurs or L-shapes. This can be done in time proportional to the number of edges of the curve. Note that the above three operations preserve the homotopy class of the curve.
|
||||
|
||||
\subsection SMTopology_Homotopy_Test Homotopy Test
|
||||
It can be proven that the canonical form is uniquely defined and only depends on the homotopy class of the curve. Hence, the curves \f$C'\f$ and \f$D'\f$ in \f$\cal{Q}\f$ are homotopic if and only if their canonical forms are equal. Since each curve is defined as a sequence of (oriented) edges up to a cyclic permutation, we resort to the Knuth-Morris-Pratt algorithm to decide in linear time if the canonical forms are the same up to a cyclic permutation.
|
||||
|
||||
\section Implementation History
|
||||
|
||||
The code was developed in 2018 by Guillaume Damiand and Francis Lazarus. Felix Castillon contributed to the extension of the homotopy test to the case of surfaces with boundaries.
|
||||
|
||||
*/
|
||||
} /* namespace CGAL */
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
Combinatorial_map
|
||||
Generalized_map
|
||||
Linear_cell_complex
|
||||
BGL
|
||||
Surface_mesh
|
||||
Polyhedron
|
||||
Manual
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
/*!
|
||||
\example Surface_mesh_topology/path_homotopy.cpp
|
||||
\example Surface_mesh_topology/basic_example_surface_mesh_topology.cpp
|
||||
\example Surface_mesh_topology/path_homotopy_with_symbols.cpp
|
||||
\example Surface_mesh_topology/path_homotopy_with_symbols_2.cpp
|
||||
\example Surface_mesh_topology/open_path_homotopy.cpp
|
||||
*/
|
||||
|
|
@ -0,0 +1,383 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="278.62531mm"
|
||||
height="68.910095mm"
|
||||
viewBox="0 0 278.62531 68.910095"
|
||||
version="1.1"
|
||||
id="svg12055"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="bracket.svg">
|
||||
<defs
|
||||
id="defs12049">
|
||||
<clipPath
|
||||
id="clip1">
|
||||
<path
|
||||
id="path12057"
|
||||
d="M 0,0 H 230.52344 V 195.35156 H 0 Z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<g
|
||||
id="g12114">
|
||||
<symbol
|
||||
id="glyph0-0"
|
||||
overflow="visible"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path12105"
|
||||
d="M 1.40625,0 V -7 H 7 v 7 z m 0.171875,-0.171875 h 5.25 v -6.65625 h -5.25 z m 0,0"
|
||||
style="stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
</symbol>
|
||||
<symbol
|
||||
id="glyph0-1"
|
||||
overflow="visible"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path12108"
|
||||
d="M 4.171875,0 H 3.1875 v -6.28125 c -0.242188,0.230469 -0.554688,0.460938 -0.9375,0.6875 -0.386719,0.230469 -0.730469,0.398438 -1.03125,0.5 v -0.953125 c 0.550781,-0.25 1.03125,-0.554687 1.4375,-0.921875 0.414062,-0.375 0.710938,-0.734375 0.890625,-1.078125 h 0.625 z m 0,0"
|
||||
style="stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
</symbol>
|
||||
<symbol
|
||||
id="glyph0-2"
|
||||
overflow="visible"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path12111"
|
||||
d="M 5.640625,-0.953125 V 0 H 0.34375 C 0.332031,-0.238281 0.367188,-0.46875 0.453125,-0.6875 0.585938,-1.039062 0.800781,-1.394531 1.09375,-1.75 c 0.300781,-0.351562 0.734375,-0.757812 1.296875,-1.21875 0.875,-0.707031 1.460937,-1.269531 1.765625,-1.6875 0.300781,-0.425781 0.453125,-0.820312 0.453125,-1.1875 0,-0.394531 -0.140625,-0.722656 -0.421875,-0.984375 C 3.914062,-7.097656 3.554688,-7.234375 3.109375,-7.234375 2.628906,-7.234375 2.25,-7.09375 1.96875,-6.8125 1.6875,-6.53125 1.539062,-6.132812 1.53125,-5.625 l -1,-0.109375 c 0.0625,-0.75 0.316406,-1.320313 0.765625,-1.71875 0.457031,-0.394531 1.066406,-0.59375 1.828125,-0.59375 0.769531,0 1.378906,0.214844 1.828125,0.640625 0.445313,0.429688 0.671875,0.953125 0.671875,1.578125 0,0.324219 -0.070312,0.640625 -0.203125,0.953125 -0.125,0.304688 -0.339844,0.625 -0.640625,0.96875 -0.304688,0.34375 -0.808594,0.820312 -1.515625,1.421875 -0.59375,0.492187 -0.976563,0.824219 -1.140625,1 -0.167969,0.179687 -0.308594,0.355469 -0.421875,0.53125 z m 0,0"
|
||||
style="stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
</symbol>
|
||||
</g>
|
||||
<clipPath
|
||||
id="clip1-8">
|
||||
<path
|
||||
id="path12116"
|
||||
d="M 0,0 H 230.52344 V 195.35156 H 0 Z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clip1-5">
|
||||
<path
|
||||
id="path12225"
|
||||
d="M 0,0 H 230.52344 V 195.35156 H 0 Z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.98994949"
|
||||
inkscape:cx="552.72526"
|
||||
inkscape:cy="19.527566"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1268"
|
||||
inkscape:window-height="858"
|
||||
inkscape:window-x="16"
|
||||
inkscape:window-y="112"
|
||||
inkscape:window-maximized="0"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" />
|
||||
<metadata
|
||||
id="metadata12052">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(59.559694,-120.4259)">
|
||||
<g
|
||||
id="surface593706"
|
||||
transform="matrix(0.35277778,0,0,0.35277778,-59.561464,120.42325)">
|
||||
<path
|
||||
id="path12062"
|
||||
d="M 157.5625,40.5 143.83594,21.382812 125.62891,37.976562 115.73047,31.703125 117.5,17.972656 98.726562,19.277344 85.234375,1.710938 73.460938,25.636719 64.550781,45.875 38.328125,46.394531 46.742188,72.242188 30.285156,94.265625 1.191406,103.9375 l 22.019532,28.69141 1.820312,39.1914 28.5625,-13.03125 16.613281,1.9375 8.199219,14.09375 11.25,-8.84765 11.09766,2.79296 5.62109,23.0586 11.73047,-17.59766 18.85156,13.75781 6.56641,-21.67187 18.30859,-10.66016 28.25781,-21.8125 39.19532,-1.82031 -13.73829,-35.152342 10.91016,-35.960938 -38.38672,2.222656 -9.23047,33.910156 -4.69531,-17.183593 -16.19531,4.875 -11.6211,-8.109375 3.55079,-9.488282 14.26562,-11.328124 -6.78516,-15.101563"
|
||||
style="fill:#ffca00;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
id="g12066"
|
||||
clip-path="url(#clip1)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path12064"
|
||||
d="m 122.10547,145.05859 21.62109,21.19922 18.02735,-10.8125 m -39.73047,-10.41015 -3.67578,28.97265 -11.51953,19.25781 -6.02735,-24.38671 22.00391,-23.53907 m -4.73828,28.70313 18.99218,13.73828 6.46485,-21.82031 M 73.5,25.515625 85.335938,1.507812 98.8125,18.859375 m 58.85156,21.441406 -13.72656,-19.121093 -18.20703,16.59375 -9.54297,-6.1875 1.11719,-13.863282 L 98.609375,18.921875 90.589844,54.84375 73.621094,25.347656 65.625,45.621094 79.085938,88.359375 M 157.66406,40.300781 125.33984,65.351562 V 37.066406 M 79.277344,88.382812 c 0.808594,-2.019531 11.3125,-33.539062 11.3125,-33.539062 l 34.749996,10.507812 -5.89453,32.410157 m 27.10547,-20.894531 10.3125,7.703124 17.27734,-4.601562 5.03907,17.808594 -30.50782,23.031246 -26.5664,24.54688 -28.082032,-14.94922 -34.734376,-9.89844 -5.828124,38.07813 m 134.710932,-95.859378 -8.71875,35.171876 36.19532,-1.234376 m -36.16797,1.046876 10.30469,36.128902 39.60156,-2.01953 -13.73828,-35.156248 10.90625,-35.960937 -38.38282,1.617187 M 157.46094,40.5 l 6.47265,15.675781 -13.99609,11.109375 -3.78906,9.984375 -26.66797,20.8125 28.6875,22.828129 13.33594,34.75 29.08984,-22.22657 M 30.121094,93.207031 59.882812,120.70703 78.941406,87.644531 m -19.464844,32.660159 -36.363281,11.71484 2.019531,39.60156 28.09375,-13.03515 17.910157,1.39453 L 93.925781,130.875 119.27734,98.28125 79.679688,88.382812 47.425781,73.765625 30.382812,92.734375 1.292969,103.73828 23.515625,132.82812"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<path
|
||||
id="path12068"
|
||||
d="M 47.5625,74.199219 38.914062,46.246094 64.867188,46.578125"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12070"
|
||||
d="M 70.105469,160.38281 78.578125,176.61719 89.636719,166.5 94.578125,130.96875"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12072"
|
||||
d="m 90.109375,166.02734 9.882813,2.82422"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12074"
|
||||
d="m 147.52344,121.32031 9.88281,-37.41406"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12076"
|
||||
d="m 124.93359,65.199219 25.41407,1.644531"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12078"
|
||||
d="M 91.519531,54.136719 116.22656,31.546875"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12080"
|
||||
d="m 53.714844,158.25391 5.214844,-36.64063 21.300781,-34.855468 9.96875,-31.457031"
|
||||
style="fill:none;stroke:#ff0000;stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12082"
|
||||
d="m 53.785156,158.78516 5.175782,-37.29297 21.542968,-35.257815 9.972656,-31.457031 35.078128,10.457031 32.125,-25.457031 28.1875,7.671875 24.61328,-13.007813 m -11.78906,144.363284 3.49218,-26.74219 -12.58203,-18.94531 -28.08594,22.01953 -17.77734,10.50781 -22.39062,-21.20312 -26.683598,-13.33594 -24.292968,28.80859 -16.9375,-1.94531"
|
||||
style="fill:none;stroke:#0000ff;stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="surface599454"
|
||||
transform="matrix(0.35277778,0,0,0.35277778,39.090313,120.42325)">
|
||||
<path
|
||||
id="path12121"
|
||||
d="M 157.5625,40.5 143.83594,21.382812 125.62891,37.976562 115.73047,31.703125 117.5,17.972656 98.726562,19.277344 85.234375,1.710938 73.460938,25.636719 64.550781,45.875 38.328125,46.394531 46.742188,72.242188 30.285156,94.265625 1.191406,103.9375 l 22.019532,28.69141 1.820312,39.1914 28.5625,-13.03125 16.613281,1.9375 8.199219,14.09375 11.25,-8.84765 11.09766,2.79296 5.62109,23.0586 11.73047,-17.59766 18.85156,13.75781 6.56641,-21.67187 18.30859,-10.66016 28.25781,-21.8125 39.19532,-1.82031 -13.73829,-35.152342 10.91016,-35.960938 -38.38672,2.222656 -9.23047,33.910156 -4.69531,-17.183593 -16.19531,4.875 -11.6211,-8.109375 3.55079,-9.488282 14.26562,-11.328124 -6.78516,-15.101563"
|
||||
style="fill:#ffca00;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
id="g12125"
|
||||
clip-path="url(#clip1-8)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path12123"
|
||||
d="m 122.10547,145.05859 21.62109,21.19922 18.02735,-10.8125 m -39.73047,-10.41015 -3.67578,28.97265 -11.51953,19.25781 -6.02735,-24.38671 22.00391,-23.53907 m -4.73828,28.70313 18.99218,13.73828 6.46485,-21.82031 M 73.5,25.515625 85.335938,1.507812 98.8125,18.859375 m 58.85156,21.441406 -13.72656,-19.121093 -18.20703,16.59375 -9.54297,-6.1875 1.11719,-13.863282 L 98.609375,18.921875 90.589844,54.84375 73.621094,25.347656 65.625,45.621094 79.085938,88.359375 M 157.66406,40.300781 125.33984,65.351562 V 37.066406 M 79.277344,88.382812 c 0.808594,-2.019531 11.3125,-33.539062 11.3125,-33.539062 l 34.749996,10.507812 -5.89453,32.410157 m 27.10547,-20.894531 10.3125,7.703124 17.27734,-4.601562 5.03907,17.808594 -30.50782,23.031246 -26.5664,24.54688 -28.082032,-14.94922 -34.734376,-9.89844 -5.828124,38.07813 m 134.710932,-95.859378 -8.71875,35.171876 36.19532,-1.234376 m -36.16797,1.046876 10.30469,36.128902 39.60156,-2.01953 -13.73828,-35.156248 10.90625,-35.960937 -38.38282,1.617187 M 157.46094,40.5 l 6.47265,15.675781 -13.99609,11.109375 -3.78906,9.984375 -26.66797,20.8125 28.6875,22.828129 13.33594,34.75 29.08984,-22.22657 M 30.121094,93.207031 59.882812,120.70703 78.941406,87.644531 m -19.464844,32.660159 -36.363281,11.71484 2.019531,39.60156 28.09375,-13.03515 17.910157,1.39453 L 93.925781,130.875 119.27734,98.28125 79.679688,88.382812 47.425781,73.765625 30.382812,92.734375 1.292969,103.73828 23.515625,132.82812"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<path
|
||||
id="path12127"
|
||||
d="M 47.5625,74.199219 38.914062,46.246094 64.867188,46.578125"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12129"
|
||||
d="M 70.105469,160.38281 78.578125,176.61719 89.636719,166.5 94.578125,130.96875"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12131"
|
||||
d="m 90.109375,166.02734 9.882813,2.82422"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12133"
|
||||
d="m 147.52344,121.32031 9.88281,-37.41406"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12135"
|
||||
d="m 124.93359,65.199219 25.41407,1.644531"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12137"
|
||||
d="M 91.519531,54.136719 116.22656,31.546875"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12139"
|
||||
d="m 53.785156,158.78516 5.175782,-37.29297 21.542968,-35.257815 9.972656,-31.457031 35.078128,10.457031 32.125,-25.457031 28.1875,7.671875 24.61328,-13.007813 m -11.78906,144.363284 3.49218,-26.74219 -12.58203,-18.94531 -28.08594,22.01953 -17.77734,10.50781 -22.39062,-21.20312 -26.683598,-13.33594 -24.292968,28.80859 -16.9375,-1.94531"
|
||||
style="fill:none;stroke:#0000ff;stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12141"
|
||||
d="m 53.714844,158.25391 5.214844,-36.64063 21.300781,-34.855468 9.96875,-31.457031"
|
||||
style="fill:none;stroke:#ff0000;stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12143"
|
||||
d="m 57.800781,137.59766 c 8.191407,8.24609 11.039063,13.86328 4.257813,19.97265"
|
||||
style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12145"
|
||||
d="m 61.308594,146.16797 -4.265625,-9.3125 9.28125,4.32812 c -2.5625,0.38282 -4.582031,2.39844 -5.015625,4.98438 z m 0,0"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
id="g12149"
|
||||
style="fill:#ff0000;fill-opacity:1">
|
||||
<use
|
||||
id="use12147"
|
||||
y="155.3895"
|
||||
x="66.527443"
|
||||
xlink:href="#glyph0-1"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
<path
|
||||
id="path12151"
|
||||
d="m 85.835938,80.464844 c 9.246093,13.949218 2.230468,21.652346 -9.761719,18.539062"
|
||||
style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12153"
|
||||
d="m 87.601562,89.558594 -2.363281,-9.96875 8.257813,6.0625 c -2.585938,-0.128906 -4.964844,1.457031 -5.894532,3.90625 z m 0,0"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
id="g12157"
|
||||
style="fill:#ff0000;fill-opacity:1">
|
||||
<use
|
||||
id="use12155"
|
||||
y="88.932541"
|
||||
x="95.013283"
|
||||
xlink:href="#glyph0-2"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
<path
|
||||
id="path12159"
|
||||
d="m 67.378906,112.66406 c 10.878906,12.71094 4.859375,21.21485 -7.421875,19.59375"
|
||||
style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12161"
|
||||
d="m 70.242188,121.46875 -3.566407,-9.60156 8.9375,5.0039 c -2.585937,0.19141 -4.75,2.05469 -5.371093,4.59766 z m 0,0"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
id="g12165"
|
||||
style="fill:#ff0000;fill-opacity:1">
|
||||
<use
|
||||
id="use12163"
|
||||
y="121.54497"
|
||||
x="76.710403"
|
||||
xlink:href="#glyph0-2"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
<path
|
||||
id="path12167"
|
||||
d="m 108.43359,60.664062 c -8.24218,8.191407 -13.859371,11.042969 -19.968746,4.257813"
|
||||
style="fill:none;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12169"
|
||||
d="m 99.867188,64.175781 9.312502,-4.269531 -4.33203,9.285156 c -0.37891,-2.5625 -2.39844,-4.582031 -4.980472,-5.015625 z m 0,0"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
id="g12173"
|
||||
style="fill:#ff0000;fill-opacity:1">
|
||||
<use
|
||||
id="use12171"
|
||||
y="75.189575"
|
||||
x="106.46101"
|
||||
xlink:href="#glyph0-1"
|
||||
width="100%"
|
||||
height="100%" />
|
||||
</g>
|
||||
<path
|
||||
id="path12175"
|
||||
d="M 89.636719,54.257812 125.17188,65.550781"
|
||||
style="fill:none;stroke:#007f00;stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12177"
|
||||
d="m 53.871094,158.26172 16.707031,1.88281"
|
||||
style="fill:none;stroke:#007f00;stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="surface619069"
|
||||
transform="matrix(0.35277778,0,0,0.35277778,137.74208,120.42325)">
|
||||
<path
|
||||
id="path12230"
|
||||
d="M 157.5625,40.5 143.83594,21.382812 125.62891,37.976562 115.73047,31.703125 117.5,17.972656 98.726562,19.277344 85.234375,1.710938 73.460938,25.636719 64.550781,45.875 38.328125,46.394531 46.742188,72.242188 30.285156,94.265625 1.191406,103.9375 l 22.019532,28.69141 1.820312,39.1914 28.5625,-13.03125 16.613281,1.9375 8.199219,14.09375 11.25,-8.84765 11.09766,2.79296 5.62109,23.0586 11.73047,-17.59766 18.85156,13.75781 6.56641,-21.67187 18.30859,-10.66016 28.25781,-21.8125 39.19532,-1.82031 -13.73829,-35.152342 10.91016,-35.960938 -38.38672,2.222656 -9.23047,33.910156 -4.69531,-17.183593 -16.19531,4.875 -11.6211,-8.109375 3.55079,-9.488282 14.26562,-11.328124 -6.78516,-15.101563"
|
||||
style="fill:#ffca00;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
id="g12234"
|
||||
clip-path="url(#clip1-5)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path12232"
|
||||
d="m 122.10547,145.05859 21.62109,21.19922 18.02735,-10.8125 m -39.73047,-10.41015 -3.67578,28.97265 -11.51953,19.25781 -6.02735,-24.38671 22.00391,-23.53907 m -4.73828,28.70313 18.99218,13.73828 6.46485,-21.82031 M 73.5,25.515625 85.335938,1.507812 98.8125,18.859375 m 58.85156,21.441406 -13.72656,-19.121093 -18.20703,16.59375 -9.54297,-6.1875 1.11719,-13.863282 L 98.609375,18.921875 90.589844,54.84375 73.621094,25.347656 65.625,45.621094 79.085938,88.359375 M 157.66406,40.300781 125.33984,65.351562 V 37.066406 M 79.277344,88.382812 c 0.808594,-2.019531 11.3125,-33.539062 11.3125,-33.539062 l 34.749996,10.507812 -5.89453,32.410157 m 27.10547,-20.894531 10.3125,7.703124 17.27734,-4.601562 5.03907,17.808594 -30.50782,23.031246 -26.5664,24.54688 -28.082032,-14.94922 -34.734376,-9.89844 -5.828124,38.07813 m 134.710932,-95.859378 -8.71875,35.171876 36.19532,-1.234376 m -36.16797,1.046876 10.30469,36.128902 39.60156,-2.01953 -13.73828,-35.156248 10.90625,-35.960937 -38.38282,1.617187 M 157.46094,40.5 l 6.47265,15.675781 -13.99609,11.109375 -3.78906,9.984375 -26.66797,20.8125 28.6875,22.828129 13.33594,34.75 29.08984,-22.22657 M 30.121094,93.207031 59.882812,120.70703 78.941406,87.644531 m -19.464844,32.660159 -36.363281,11.71484 2.019531,39.60156 28.09375,-13.03515 17.910157,1.39453 L 93.925781,130.875 119.27734,98.28125 79.679688,88.382812 47.425781,73.765625 30.382812,92.734375 1.292969,103.73828 23.515625,132.82812"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<path
|
||||
id="path12236"
|
||||
d="M 47.5625,74.199219 38.914062,46.246094 64.867188,46.578125"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12238"
|
||||
d="M 70.105469,160.38281 78.578125,176.61719 89.636719,166.5 94.578125,130.96875"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12240"
|
||||
d="m 90.109375,166.02734 9.882813,2.82422"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12242"
|
||||
d="m 147.52344,121.32031 9.88281,-37.41406"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12244"
|
||||
d="m 124.93359,65.199219 25.41407,1.644531"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12246"
|
||||
d="M 91.519531,54.136719 116.22656,31.546875"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12248"
|
||||
d="m 198.58594,178.66016 3.49218,-26.7461 -12.58593,-18.94531 -28.08203,22.02344 -17.77735,10.5039 -22.39062,-21.20312 -24.566409,-12.86328 -26.242187,28.33984 21.648437,-30.35937 27.703129,-31.480472 5.66406,-32.839844 32.125,-25.457032 28.1875,7.671876 24.61328,-13.011719"
|
||||
style="fill:none;stroke:#0000ff;stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 24 KiB |
|
|
@ -0,0 +1,378 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<svg
|
||||
width="600" height="480"
|
||||
viewBox="0 0 600 480"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
>
|
||||
|
||||
<title>Gnuplot</title>
|
||||
<desc>Produced by GNUPLOT 5.2 patchlevel 2 </desc>
|
||||
|
||||
<g id="gnuplot_canvas">
|
||||
|
||||
<rect x="0" y="0" width="600" height="480" fill="none"/>
|
||||
<defs>
|
||||
|
||||
<circle id='gpDot' r='0.5' stroke-width='0.5'/>
|
||||
<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
|
||||
<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
|
||||
<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
|
||||
<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
|
||||
<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
|
||||
<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
|
||||
<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
|
||||
<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
|
||||
<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
|
||||
<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
|
||||
<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
|
||||
<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
|
||||
<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
|
||||
<path id='gpPt13' stroke-width='0.222' stroke='currentColor' d='M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z'/>
|
||||
<use xlink:href='#gpPt13' id='gpPt14' fill='currentColor' stroke='none'/>
|
||||
<filter id='textbox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
|
||||
<feFlood flood-color='white' flood-opacity='1' result='bgnd'/>
|
||||
<feComposite in='SourceGraphic' in2='bgnd' operator='atop'/>
|
||||
</filter>
|
||||
<filter id='greybox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
|
||||
<feFlood flood-color='lightgrey' flood-opacity='1' result='grey'/>
|
||||
<feComposite in='SourceGraphic' in2='grey' operator='atop'/>
|
||||
</filter>
|
||||
</defs>
|
||||
<g fill="none" color="white" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,422.4 L72.6,422.4 M552.8,422.4 L543.8,422.4 '/> <g transform="translate(55.3,426.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 0</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,382.0 L72.6,382.0 M552.8,382.0 L543.8,382.0 '/> <g transform="translate(55.3,385.9)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 5</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,341.5 L72.6,341.5 M552.8,341.5 L543.8,341.5 '/> <g transform="translate(55.3,345.4)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 10</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,301.1 L72.6,301.1 M552.8,301.1 L543.8,301.1 '/> <g transform="translate(55.3,305.0)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 15</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,260.7 L72.6,260.7 M552.8,260.7 L543.8,260.7 '/> <g transform="translate(55.3,264.6)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 20</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,220.2 L72.6,220.2 M552.8,220.2 L543.8,220.2 '/> <g transform="translate(55.3,224.1)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 25</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,179.8 L72.6,179.8 M552.8,179.8 L543.8,179.8 '/> <g transform="translate(55.3,183.7)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 30</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,139.4 L72.6,139.4 M552.8,139.4 L543.8,139.4 '/> <g transform="translate(55.3,143.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 35</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,99.0 L72.6,99.0 M552.8,99.0 L543.8,99.0 '/> <g transform="translate(55.3,102.9)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 40</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,58.5 L72.6,58.5 M552.8,58.5 L543.8,58.5 '/> <g transform="translate(55.3,62.4)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 45</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,18.1 L72.6,18.1 M552.8,18.1 L543.8,18.1 '/> <g transform="translate(55.3,22.0)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 50</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M185.3,422.4 L185.3,413.4 M185.3,18.1 L185.3,27.1 '/> <g transform="translate(185.3,444.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >5,000,000</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M307.0,422.4 L307.0,413.4 M307.0,18.1 L307.0,27.1 '/> <g transform="translate(307.0,444.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >10,000,000</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M428.7,422.4 L428.7,413.4 M428.7,18.1 L428.7,27.1 '/> <g transform="translate(428.7,444.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >15,000,000</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M550.4,422.4 L550.4,413.4 M550.4,18.1 L550.4,27.1 '/> <g transform="translate(550.4,444.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >20,000,000</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,18.1 L63.6,422.4 L552.8,422.4 L552.8,18.1 L63.6,18.1 Z '/></g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<g transform="translate(16.3,220.3) rotate(270)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >Time (sec)</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<g transform="translate(308.2,471.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >Path lengths</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
<g id="gnuplot_plot_1" ><title>Homotopy test</title>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<g transform="translate(179.8,40.0)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" >Homotopy test</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<use xlink:href='#gpPt0' transform='translate(137.9,359.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(114.7,377.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(185.8,320.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(172.1,337.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(112.9,383.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(128.6,370.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(237.0,292.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(182.4,329.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(156.9,344.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(187.9,320.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.9,419.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(87.7,401.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(91.7,399.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.6,420.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.5,421.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(548.0,46.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(118.3,383.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(134.7,367.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(128.4,365.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(69.5,417.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(114.8,379.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(382.0,180.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(82.2,408.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.8,420.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(253.6,276.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(90.9,399.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(288.7,229.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(191.6,314.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(78.8,409.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.2,420.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(313.4,231.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.1,421.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.0,418.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(79.5,408.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.8,422.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(163.4,336.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(206.3,304.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(175.0,334.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.7,421.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.4,421.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.1,421.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(119.0,375.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(106.9,387.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(73.0,415.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(102.0,390.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.2,420.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(71.9,414.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(143.3,356.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(101.9,387.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(212.7,301.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(105.2,391.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(108.4,386.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(164.2,349.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(136.7,365.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.2,421.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.8,422.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(134.8,365.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(254.4,263.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(71.3,415.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.1,422.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(443.0,128.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(210.6,305.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.9,422.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(129.2,371.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(74.4,414.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.7,421.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(140.1,362.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(119.7,371.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.0,422.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(102.5,390.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(215.5,302.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(80.5,406.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(319.4,225.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(84.5,404.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(113.7,382.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(193.5,324.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.9,422.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.8,420.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(141.0,358.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(178.5,328.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(97.7,392.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(136.6,362.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(67.2,418.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(219.8,299.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(70.4,416.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(72.8,414.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.2,421.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(76.3,411.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(72.8,413.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(144.3,356.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.8,421.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.1,421.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(74.9,413.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(77.3,411.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(133.0,367.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(394.8,170.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(275.0,247.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.1,422.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(87.5,404.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(73.2,414.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(70.4,417.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(67.2,419.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(120.3,381.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.4,418.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.3,418.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(142.6,363.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.8,422.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(71.9,416.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.3,420.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(79.6,410.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(70.9,417.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(92.5,400.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(70.7,416.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.1,420.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.8,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(101.4,395.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(73.8,413.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.4,421.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(71.0,416.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.5,421.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(80.3,409.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(69.1,417.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(77.6,412.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.3,421.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(76.4,412.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.7,421.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(71.4,416.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.6,417.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.6,421.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(94.6,398.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.0,421.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.2,421.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.1,421.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.3,421.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.4,420.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(70.1,417.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.4,421.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(122.1,379.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.9,420.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.0,420.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(128.4,371.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(83.0,407.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.2,422.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.7,420.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(98.5,395.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.5,421.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.6,421.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(84.3,406.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(96.9,397.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.5,421.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(67.0,419.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(69.9,417.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(72.3,415.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(74.3,413.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.3,421.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.0,421.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(77.7,411.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.4,421.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.9,420.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.6,420.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.4,420.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.1,421.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.8,421.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.5,420.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.7,421.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.4,421.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.9,422.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(67.8,419.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.6,421.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.6,420.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(69.1,417.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(76.9,412.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(70.4,417.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.9,420.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.6,421.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.6,421.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(83.3,408.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(67.1,419.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(74.6,413.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(190.3,334.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(88.9,403.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(114.4,385.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.9,418.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.9,422.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(70.6,416.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.0,422.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(85.5,406.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(74.4,413.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(81.7,408.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.5,421.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.5,421.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.6,421.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.2,422.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.9,420.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.4,421.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(67.3,419.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(70.4,417.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.1,421.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(99.7,394.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.4,421.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(209.2,36.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="gnuplot_plot_2" ><title>Model Fit</title>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<g transform="translate(179.8,58.0)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" >Model Fit</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='rgb( 0, 158, 115)' d='M188.1,54.1 L230.3,54.1 M63.6,422.0 L68.5,418.1 L73.5,414.2 L78.4,410.4 L83.4,406.5 L88.3,402.6
|
||||
L93.2,398.8 L98.2,394.9 L103.1,391.0 L108.1,387.2 L113.0,383.3 L118.0,379.4 L122.9,375.6 L127.8,371.7
|
||||
L132.8,367.8 L137.7,364.0 L142.7,360.1 L147.6,356.2 L152.5,352.4 L157.5,348.5 L162.4,344.6 L167.4,340.7
|
||||
L172.3,336.9 L177.3,333.0 L182.2,329.1 L187.1,325.3 L192.1,321.4 L197.0,317.5 L202.0,313.7 L206.9,309.8
|
||||
L211.8,305.9 L216.8,302.1 L221.7,298.2 L226.7,294.3 L231.6,290.5 L236.5,286.6 L241.5,282.7 L246.4,278.9
|
||||
L251.4,275.0 L256.3,271.1 L261.3,267.3 L266.2,263.4 L271.1,259.5 L276.1,255.7 L281.0,251.8 L286.0,247.9
|
||||
L290.9,244.1 L295.8,240.2 L300.8,236.3 L305.7,232.5 L310.7,228.6 L315.6,224.7 L320.6,220.9 L325.5,217.0
|
||||
L330.4,213.1 L335.4,209.3 L340.3,205.4 L345.3,201.5 L350.2,197.6 L355.1,193.8 L360.1,189.9 L365.0,186.0
|
||||
L370.0,182.2 L374.9,178.3 L379.9,174.4 L384.8,170.6 L389.7,166.7 L394.7,162.8 L399.6,159.0 L404.6,155.1
|
||||
L409.5,151.2 L414.4,147.4 L419.4,143.5 L424.3,139.6 L429.3,135.8 L434.2,131.9 L439.1,128.0 L444.1,124.2
|
||||
L449.0,120.3 L454.0,116.4 L458.9,112.6 L463.9,108.7 L468.8,104.8 L473.7,101.0 L478.7,97.1 L483.6,93.2
|
||||
L488.6,89.4 L493.5,85.5 L498.4,81.6 L503.4,77.8 L508.3,73.9 L513.3,70.0 L518.2,66.1 L523.2,62.3
|
||||
L528.1,58.4 L533.0,54.5 L538.0,50.7 L542.9,46.8 L547.9,42.9 L552.8,39.1 '/></g>
|
||||
</g>
|
||||
<g fill="none" color="white" stroke="rgb( 0, 158, 115)" stroke-width="4.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="4.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="black" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,18.1 L63.6,422.4 L552.8,422.4 L552.8,18.1 L63.6,18.1 Z '/></g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
After Width: | Height: | Size: 32 KiB |
|
|
@ -0,0 +1,378 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<svg
|
||||
width="600" height="480"
|
||||
viewBox="0 0 600 480"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
>
|
||||
|
||||
<title>Gnuplot</title>
|
||||
<desc>Produced by GNUPLOT 5.2 patchlevel 2 </desc>
|
||||
|
||||
<g id="gnuplot_canvas">
|
||||
|
||||
<rect x="0" y="0" width="600" height="480" fill="none"/>
|
||||
<defs>
|
||||
|
||||
<circle id='gpDot' r='0.5' stroke-width='0.5'/>
|
||||
<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
|
||||
<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
|
||||
<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
|
||||
<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
|
||||
<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
|
||||
<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
|
||||
<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
|
||||
<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
|
||||
<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
|
||||
<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
|
||||
<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
|
||||
<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
|
||||
<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
|
||||
<path id='gpPt13' stroke-width='0.222' stroke='currentColor' d='M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z'/>
|
||||
<use xlink:href='#gpPt13' id='gpPt14' fill='currentColor' stroke='none'/>
|
||||
<filter id='textbox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
|
||||
<feFlood flood-color='white' flood-opacity='1' result='bgnd'/>
|
||||
<feComposite in='SourceGraphic' in2='bgnd' operator='atop'/>
|
||||
</filter>
|
||||
<filter id='greybox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
|
||||
<feFlood flood-color='lightgrey' flood-opacity='1' result='grey'/>
|
||||
<feComposite in='SourceGraphic' in2='grey' operator='atop'/>
|
||||
</filter>
|
||||
</defs>
|
||||
<g fill="none" color="white" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,422.4 L72.6,422.4 M567.0,422.4 L558.0,422.4 '/> <g transform="translate(55.3,426.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 0</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,355.0 L72.6,355.0 M567.0,355.0 L558.0,355.0 '/> <g transform="translate(55.3,358.9)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 10</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,287.6 L72.6,287.6 M567.0,287.6 L558.0,287.6 '/> <g transform="translate(55.3,291.5)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 20</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,220.2 L72.6,220.2 M567.0,220.2 L558.0,220.2 '/> <g transform="translate(55.3,224.1)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 30</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,152.9 L72.6,152.9 M567.0,152.9 L558.0,152.9 '/> <g transform="translate(55.3,156.8)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 40</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,85.5 L72.6,85.5 M567.0,85.5 L558.0,85.5 '/> <g transform="translate(55.3,89.4)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 50</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,18.1 L72.6,18.1 M567.0,18.1 L558.0,18.1 '/> <g transform="translate(55.3,22.0)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 60</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M144.8,422.4 L144.8,413.4 M144.8,18.1 L144.8,27.1 '/> <g transform="translate(144.8,444.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >10,000,000</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M226.0,422.4 L226.0,413.4 M226.0,18.1 L226.0,27.1 '/> <g transform="translate(226.0,444.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >20,000,000</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M307.2,422.4 L307.2,413.4 M307.2,18.1 L307.2,27.1 '/> <g transform="translate(307.2,444.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >30,000,000</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M388.4,422.4 L388.4,413.4 M388.4,18.1 L388.4,27.1 '/> <g transform="translate(388.4,444.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >40,000,000</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M469.6,422.4 L469.6,413.4 M469.6,18.1 L469.6,27.1 '/> <g transform="translate(469.6,444.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >50,000,000</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M550.8,422.4 L550.8,413.4 M550.8,18.1 L550.8,27.1 '/> <g transform="translate(550.8,444.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >60,000,000</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,18.1 L63.6,422.4 L567.0,422.4 L567.0,18.1 L63.6,18.1 Z '/></g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<g transform="translate(16.3,220.3) rotate(270)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >Time (sec)</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<g transform="translate(315.3,471.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >Path lengths</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
<g id="gnuplot_plot_1" ><title>Homotopy test</title>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<g transform="translate(179.8,40.0)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" >Homotopy test</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.6,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.7,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.7,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.7,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.7,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.7,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.7,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.7,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.7,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.7,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.7,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.8,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.8,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.8,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.8,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.8,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.8,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.8,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.8,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.8,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.8,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.9,422.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.9,422.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.9,422.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.9,422.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.9,422.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.9,422.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.9,422.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.9,422.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.9,422.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.9,422.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.1,422.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.1,422.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.1,422.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.1,422.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.1,422.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.1,422.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.1,422.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.1,422.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.1,422.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.1,422.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.2,421.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.2,421.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.2,421.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.2,421.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.2,421.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.2,421.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.2,421.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.2,421.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.2,421.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.2,421.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.9,420.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.9,421.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.9,420.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.9,420.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.9,420.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.9,420.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.9,420.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.9,419.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.9,419.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.9,420.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.5,418.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.5,418.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.5,418.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.5,418.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.5,418.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.5,418.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.5,418.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.5,418.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.5,418.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.5,418.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(79.9,410.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(79.9,410.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(79.9,410.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(79.9,410.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(79.9,410.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(79.9,410.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(79.9,411.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(79.9,410.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(79.9,411.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(79.9,410.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(96.1,400.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(96.1,400.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(96.1,399.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(96.1,399.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(96.1,398.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(96.1,398.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(96.1,399.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(96.1,398.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(96.1,399.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(96.1,399.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(112.3,387.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(112.3,386.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(112.3,386.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(112.3,385.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(112.3,384.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(112.3,385.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(112.3,385.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(112.3,385.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(112.3,387.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(112.3,389.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(226.0,302.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(226.0,307.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(226.0,306.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(226.0,311.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(226.0,303.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(226.0,311.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(226.0,302.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(226.0,313.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(226.0,305.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(226.0,313.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(388.4,198.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(388.4,201.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(388.4,202.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(388.4,201.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(388.4,196.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(388.4,197.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(388.4,194.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(388.4,201.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(388.4,202.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(388.4,198.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(550.8,77.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(550.8,84.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(550.8,77.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(550.8,75.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(550.8,89.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(550.8,82.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(550.8,77.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(550.8,72.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(550.8,76.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(550.8,76.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(209.2,36.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="gnuplot_plot_2" ><title>Model Fit</title>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<g transform="translate(179.8,58.0)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" >Model Fit</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='rgb( 0, 158, 115)' d='M188.1,54.1 L230.3,54.1 M63.6,422.3 L68.7,418.8 L73.8,415.2 L78.9,411.6 L83.9,408.1 L89.0,404.5
|
||||
L94.1,401.0 L99.2,397.4 L104.3,393.9 L109.4,390.3 L114.4,386.7 L119.5,383.2 L124.6,379.6 L129.7,376.1
|
||||
L134.8,372.5 L139.9,368.9 L145.0,365.4 L150.0,361.8 L155.1,358.3 L160.2,354.7 L165.3,351.2 L170.4,347.6
|
||||
L175.5,344.0 L180.6,340.5 L185.6,336.9 L190.7,333.4 L195.8,329.8 L200.9,326.3 L206.0,322.7 L211.1,319.1
|
||||
L216.1,315.6 L221.2,312.0 L226.3,308.5 L231.4,304.9 L236.5,301.3 L241.6,297.8 L246.7,294.2 L251.7,290.7
|
||||
L256.8,287.1 L261.9,283.6 L267.0,280.0 L272.1,276.4 L277.2,272.9 L282.2,269.3 L287.3,265.8 L292.4,262.2
|
||||
L297.5,258.6 L302.6,255.1 L307.7,251.5 L312.8,248.0 L317.8,244.4 L322.9,240.9 L328.0,237.3 L333.1,233.7
|
||||
L338.2,230.2 L343.3,226.6 L348.4,223.1 L353.4,219.5 L358.5,215.9 L363.6,212.4 L368.7,208.8 L373.8,205.3
|
||||
L378.9,201.7 L383.9,198.2 L389.0,194.6 L394.1,191.0 L399.2,187.5 L404.3,183.9 L409.4,180.4 L414.5,176.8
|
||||
L419.5,173.2 L424.6,169.7 L429.7,166.1 L434.8,162.6 L439.9,159.0 L445.0,155.5 L450.0,151.9 L455.1,148.3
|
||||
L460.2,144.8 L465.3,141.2 L470.4,137.7 L475.5,134.1 L480.6,130.5 L485.6,127.0 L490.7,123.4 L495.8,119.9
|
||||
L500.9,116.3 L506.0,112.8 L511.1,109.2 L516.2,105.6 L521.2,102.1 L526.3,98.5 L531.4,95.0 L536.5,91.4
|
||||
L541.6,87.8 L546.7,84.3 L551.7,80.7 L556.8,77.2 L561.9,73.6 L567.0,70.1 '/></g>
|
||||
</g>
|
||||
<g fill="none" color="white" stroke="rgb( 0, 158, 115)" stroke-width="4.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="4.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="black" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,18.1 L63.6,422.4 L567.0,422.4 L567.0,18.1 L63.6,18.1 Z '/></g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
After Width: | Height: | Size: 32 KiB |
|
|
@ -0,0 +1,210 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<svg
|
||||
width="600" height="480"
|
||||
viewBox="0 0 600 480"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
>
|
||||
|
||||
<title>Gnuplot</title>
|
||||
<desc>Produced by GNUPLOT 5.2 patchlevel 2 </desc>
|
||||
|
||||
<g id="gnuplot_canvas">
|
||||
|
||||
<rect x="0" y="0" width="600" height="480" fill="none"/>
|
||||
<defs>
|
||||
|
||||
<circle id='gpDot' r='0.5' stroke-width='0.5'/>
|
||||
<path id='gpPt0' stroke-width='0.222' stroke='currentColor' d='M-1,0 h2 M0,-1 v2'/>
|
||||
<path id='gpPt1' stroke-width='0.222' stroke='currentColor' d='M-1,-1 L1,1 M1,-1 L-1,1'/>
|
||||
<path id='gpPt2' stroke-width='0.222' stroke='currentColor' d='M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1'/>
|
||||
<rect id='gpPt3' stroke-width='0.222' stroke='currentColor' x='-1' y='-1' width='2' height='2'/>
|
||||
<rect id='gpPt4' stroke-width='0.222' stroke='currentColor' fill='currentColor' x='-1' y='-1' width='2' height='2'/>
|
||||
<circle id='gpPt5' stroke-width='0.222' stroke='currentColor' cx='0' cy='0' r='1'/>
|
||||
<use xlink:href='#gpPt5' id='gpPt6' fill='currentColor' stroke='none'/>
|
||||
<path id='gpPt7' stroke-width='0.222' stroke='currentColor' d='M0,-1.33 L-1.33,0.67 L1.33,0.67 z'/>
|
||||
<use xlink:href='#gpPt7' id='gpPt8' fill='currentColor' stroke='none'/>
|
||||
<use xlink:href='#gpPt7' id='gpPt9' stroke='currentColor' transform='rotate(180)'/>
|
||||
<use xlink:href='#gpPt9' id='gpPt10' fill='currentColor' stroke='none'/>
|
||||
<use xlink:href='#gpPt3' id='gpPt11' stroke='currentColor' transform='rotate(45)'/>
|
||||
<use xlink:href='#gpPt11' id='gpPt12' fill='currentColor' stroke='none'/>
|
||||
<path id='gpPt13' stroke-width='0.222' stroke='currentColor' d='M0,1.330 L1.265,0.411 L0.782,-1.067 L-0.782,-1.076 L-1.265,0.411 z'/>
|
||||
<use xlink:href='#gpPt13' id='gpPt14' fill='currentColor' stroke='none'/>
|
||||
<filter id='textbox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
|
||||
<feFlood flood-color='white' flood-opacity='1' result='bgnd'/>
|
||||
<feComposite in='SourceGraphic' in2='bgnd' operator='atop'/>
|
||||
</filter>
|
||||
<filter id='greybox' filterUnits='objectBoundingBox' x='0' y='0' height='1' width='1'>
|
||||
<feFlood flood-color='lightgrey' flood-opacity='1' result='grey'/>
|
||||
<feComposite in='SourceGraphic' in2='grey' operator='atop'/>
|
||||
</filter>
|
||||
</defs>
|
||||
<g fill="none" color="white" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,422.4 L72.6,422.4 M558.7,422.4 L549.7,422.4 '/> <g transform="translate(55.3,426.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 0</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,364.6 L72.6,364.6 M558.7,364.6 L549.7,364.6 '/> <g transform="translate(55.3,368.5)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 5</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,306.9 L72.6,306.9 M558.7,306.9 L549.7,306.9 '/> <g transform="translate(55.3,310.8)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 10</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,249.1 L72.6,249.1 M558.7,249.1 L549.7,249.1 '/> <g transform="translate(55.3,253.0)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 15</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,191.4 L72.6,191.4 M558.7,191.4 L549.7,191.4 '/> <g transform="translate(55.3,195.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 20</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,133.6 L72.6,133.6 M558.7,133.6 L549.7,133.6 '/> <g transform="translate(55.3,137.5)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 25</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,75.9 L72.6,75.9 M558.7,75.9 L549.7,75.9 '/> <g transform="translate(55.3,79.8)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 30</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,18.1 L72.6,18.1 M558.7,18.1 L549.7,18.1 '/> <g transform="translate(55.3,22.0)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" > 35</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M144.8,422.4 L144.8,413.4 M144.8,18.1 L144.8,27.1 '/> <g transform="translate(144.8,444.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >5,000,000</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M225.9,422.4 L225.9,413.4 M225.9,18.1 L225.9,27.1 '/> <g transform="translate(225.9,444.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >10,000,000</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M307.1,422.4 L307.1,413.4 M307.1,18.1 L307.1,27.1 '/> <g transform="translate(307.1,444.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >15,000,000</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M388.3,422.4 L388.3,413.4 M388.3,18.1 L388.3,27.1 '/> <g transform="translate(388.3,444.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >20,000,000</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M469.4,422.4 L469.4,413.4 M469.4,18.1 L469.4,27.1 '/> <g transform="translate(469.4,444.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >25,000,000</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M550.6,422.4 L550.6,413.4 M550.6,18.1 L550.6,27.1 '/> <g transform="translate(550.6,444.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >30,000,000</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,18.1 L63.6,422.4 L558.7,422.4 L558.7,18.1 L63.6,18.1 Z '/></g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<g transform="translate(16.3,220.3) rotate(270)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >Time (sec)</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<g transform="translate(311.1,471.3)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="middle">
|
||||
<text><tspan font-family="Verdana" >#Darts</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
<g id="gnuplot_plot_1" ><title>Reduce surface computation</title>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<g transform="translate(287.7,40.0)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" >Reduce surface computation</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<use xlink:href='#gpPt0' transform='translate(149.6,360.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(193.7,367.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.9,420.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(69.0,419.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.6,419.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.4,420.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(74.9,414.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(117.1,386.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.9,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.2,422.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.8,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.9,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(80.4,411.0) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.2,421.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.7,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.8,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.1,422.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(69.0,419.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.8,420.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.8,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.8,419.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.4,419.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(66.3,420.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(74.4,414.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(115.0,384.8) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.9,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.2,422.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.9,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(79.8,410.6) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(65.1,421.7) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.7,422.4) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(63.8,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(64.1,422.3) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(68.8,419.2) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(116.6,381.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(97.9,398.9) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(550.6,31.5) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
<use xlink:href='#gpPt0' transform='translate(317.1,36.1) scale(4.50)' color='rgb(148, 0, 211)'/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="gnuplot_plot_2" ><title>Model Fit</title>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<g transform="translate(287.7,58.0)" stroke="none" fill="black" font-family="Verdana" font-size="12.00" text-anchor="end">
|
||||
<text><tspan font-family="Verdana" >Model Fit</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='rgb( 0, 158, 115)' d='M296.0,54.1 L338.2,54.1 M65.9,422.4 L68.6,420.3 L73.6,416.4 L78.6,412.5 L83.6,408.6 L88.6,404.7
|
||||
L93.6,400.8 L98.6,396.9 L103.6,393.0 L108.6,389.1 L113.6,385.2 L118.6,381.3 L123.6,377.4 L128.6,373.5
|
||||
L133.6,369.6 L138.6,365.7 L143.6,361.8 L148.6,357.9 L153.6,354.0 L158.6,350.1 L163.6,346.2 L168.6,342.3
|
||||
L173.6,338.4 L178.6,334.5 L183.6,330.6 L188.6,326.7 L193.6,322.8 L198.6,318.9 L203.6,315.0 L208.6,311.1
|
||||
L213.6,307.2 L218.6,303.3 L223.6,299.4 L228.6,295.5 L233.6,291.6 L238.6,287.7 L243.6,283.8 L248.6,279.9
|
||||
L253.6,276.0 L258.6,272.1 L263.6,268.2 L268.6,264.3 L273.6,260.4 L278.6,256.5 L283.6,252.6 L288.6,248.7
|
||||
L293.6,244.8 L298.6,240.9 L303.6,237.0 L308.6,233.1 L313.7,229.2 L318.7,225.2 L323.7,221.3 L328.7,217.4
|
||||
L333.7,213.5 L338.7,209.6 L343.7,205.7 L348.7,201.8 L353.7,197.9 L358.7,194.0 L363.7,190.1 L368.7,186.2
|
||||
L373.7,182.3 L378.7,178.4 L383.7,174.5 L388.7,170.6 L393.7,166.7 L398.7,162.8 L403.7,158.9 L408.7,155.0
|
||||
L413.7,151.1 L418.7,147.2 L423.7,143.3 L428.7,139.4 L433.7,135.5 L438.7,131.6 L443.7,127.7 L448.7,123.8
|
||||
L453.7,119.9 L458.7,116.0 L463.7,112.1 L468.7,108.2 L473.7,104.3 L478.7,100.4 L483.7,96.5 L488.7,92.6
|
||||
L493.7,88.7 L498.7,84.8 L503.7,80.9 L508.7,77.0 L513.7,73.1 L518.7,69.2 L523.7,65.3 L528.7,61.4
|
||||
L533.7,57.5 L538.7,53.6 L543.7,49.7 L548.7,45.8 L553.7,41.9 L558.7,38.0 '/></g>
|
||||
</g>
|
||||
<g fill="none" color="white" stroke="rgb( 0, 158, 115)" stroke-width="4.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="4.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="black" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
<path stroke='black' d='M63.6,18.1 L63.6,422.4 L558.7,422.4 L558.7,18.1 L63.6,18.1 Z '/></g>
|
||||
<g fill="none" color="black" stroke="currentColor" stroke-width="2.00" stroke-linecap="butt" stroke-linejoin="miter">
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 282 KiB |
|
After Width: | Height: | Size: 390 KiB |
|
|
@ -0,0 +1,831 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
inkscape:export-ydpi="150.00000"
|
||||
inkscape:export-xdpi="150.00000"
|
||||
inkscape:export-filename="/home/lazarus/PRESENTATION/JGA06/figures/fig1.png"
|
||||
sodipodi:docname="free-vs-fixed-endpoints.svg"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:version="0.32"
|
||||
id="svg2"
|
||||
height="75.385918mm"
|
||||
width="190mm"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
version="1.1">
|
||||
<defs
|
||||
id="defs3">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 396.85039 : 1"
|
||||
inkscape:vp_y="0 : 1066.6667 : 0"
|
||||
inkscape:vp_z="1122.5197 : 396.85039 : 1"
|
||||
inkscape:persp3d-origin="561.25983 : 264.56692 : 1"
|
||||
id="perspective2473" />
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Lstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow2Lstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
sodipodi:nodetypes="cccc"
|
||||
id="path14123"
|
||||
style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
transform="matrix(1.1,0,0,1.1,-5.5,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Mstart"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Mstart"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
sodipodi:nodetypes="ccccc"
|
||||
id="path14137"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 Z"
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;marker-start:none"
|
||||
transform="scale(0.4)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter4970"
|
||||
inkscape:label="Combined lighting"
|
||||
inkscape:menu="Bevels"
|
||||
inkscape:menu-tooltip="Basic specular bevel to use for building textures">
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur4972"
|
||||
stdDeviation="6"
|
||||
in="SourceGraphic"
|
||||
result="result0" />
|
||||
<feDiffuseLighting
|
||||
id="feDiffuseLighting4974"
|
||||
lighting-color="#ffffff"
|
||||
diffuseConstant="1"
|
||||
surfaceScale="4"
|
||||
result="result5">
|
||||
<feDistantLight
|
||||
id="feDistantLight4976"
|
||||
elevation="45"
|
||||
azimuth="235" />
|
||||
</feDiffuseLighting>
|
||||
<feComposite
|
||||
k4="0"
|
||||
k3="0"
|
||||
k2="0"
|
||||
id="feComposite4978"
|
||||
in2="SourceGraphic"
|
||||
k1="1.4"
|
||||
in="result5"
|
||||
result="fbSourceGraphic"
|
||||
operator="arithmetic" />
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur4980"
|
||||
result="result0"
|
||||
in="fbSourceGraphic"
|
||||
stdDeviation="6" />
|
||||
<feSpecularLighting
|
||||
id="feSpecularLighting4982"
|
||||
specularExponent="25"
|
||||
specularConstant="1"
|
||||
surfaceScale="4"
|
||||
lighting-color="#ffffff"
|
||||
result="result1"
|
||||
in="result0">
|
||||
<feDistantLight
|
||||
id="feDistantLight4984"
|
||||
azimuth="235"
|
||||
elevation="45" />
|
||||
</feSpecularLighting>
|
||||
<feComposite
|
||||
k4="0"
|
||||
k1="0"
|
||||
id="feComposite4986"
|
||||
in2="result1"
|
||||
k3="1"
|
||||
k2="1"
|
||||
operator="arithmetic"
|
||||
result="result4"
|
||||
in="fbSourceGraphic" />
|
||||
<feComposite
|
||||
id="feComposite4988"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="result2"
|
||||
in="result4" />
|
||||
</filter>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter4970-3"
|
||||
inkscape:label="Combined lighting"
|
||||
inkscape:menu="Bevels"
|
||||
inkscape:menu-tooltip="Basic specular bevel to use for building textures">
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur4972-6"
|
||||
stdDeviation="6"
|
||||
in="SourceGraphic"
|
||||
result="result0" />
|
||||
<feDiffuseLighting
|
||||
id="feDiffuseLighting4974-7"
|
||||
lighting-color="#ffffff"
|
||||
diffuseConstant="1"
|
||||
surfaceScale="4"
|
||||
result="result5">
|
||||
<feDistantLight
|
||||
id="feDistantLight4976-5"
|
||||
elevation="45"
|
||||
azimuth="235" />
|
||||
</feDiffuseLighting>
|
||||
<feComposite
|
||||
k4="0"
|
||||
k3="0"
|
||||
k2="0"
|
||||
id="feComposite4978-3"
|
||||
in2="SourceGraphic"
|
||||
k1="1.4"
|
||||
in="result5"
|
||||
result="fbSourceGraphic"
|
||||
operator="arithmetic" />
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur4980-5"
|
||||
result="result0"
|
||||
in="fbSourceGraphic"
|
||||
stdDeviation="6" />
|
||||
<feSpecularLighting
|
||||
id="feSpecularLighting4982-6"
|
||||
specularExponent="25"
|
||||
specularConstant="1"
|
||||
surfaceScale="4"
|
||||
lighting-color="#ffffff"
|
||||
result="result1"
|
||||
in="result0">
|
||||
<feDistantLight
|
||||
id="feDistantLight4984-2"
|
||||
azimuth="235"
|
||||
elevation="45" />
|
||||
</feSpecularLighting>
|
||||
<feComposite
|
||||
k4="0"
|
||||
k1="0"
|
||||
id="feComposite4986-9"
|
||||
in2="result1"
|
||||
k3="1"
|
||||
k2="1"
|
||||
operator="arithmetic"
|
||||
result="result4"
|
||||
in="fbSourceGraphic" />
|
||||
<feComposite
|
||||
id="feComposite4988-1"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="result2"
|
||||
in="result4" />
|
||||
</filter>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter4970-7"
|
||||
inkscape:label="Combined lighting"
|
||||
inkscape:menu="Bevels"
|
||||
inkscape:menu-tooltip="Basic specular bevel to use for building textures">
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur4972-9"
|
||||
stdDeviation="6"
|
||||
in="SourceGraphic"
|
||||
result="result0" />
|
||||
<feDiffuseLighting
|
||||
id="feDiffuseLighting4974-2"
|
||||
lighting-color="#ffffff"
|
||||
diffuseConstant="1"
|
||||
surfaceScale="4"
|
||||
result="result5">
|
||||
<feDistantLight
|
||||
id="feDistantLight4976-0"
|
||||
elevation="45"
|
||||
azimuth="235" />
|
||||
</feDiffuseLighting>
|
||||
<feComposite
|
||||
k4="0"
|
||||
k3="0"
|
||||
k2="0"
|
||||
id="feComposite4978-2"
|
||||
in2="SourceGraphic"
|
||||
k1="1.4"
|
||||
in="result5"
|
||||
result="fbSourceGraphic"
|
||||
operator="arithmetic" />
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur4980-3"
|
||||
result="result0"
|
||||
in="fbSourceGraphic"
|
||||
stdDeviation="6" />
|
||||
<feSpecularLighting
|
||||
id="feSpecularLighting4982-7"
|
||||
specularExponent="25"
|
||||
specularConstant="1"
|
||||
surfaceScale="4"
|
||||
lighting-color="#ffffff"
|
||||
result="result1"
|
||||
in="result0">
|
||||
<feDistantLight
|
||||
id="feDistantLight4984-5"
|
||||
azimuth="235"
|
||||
elevation="45" />
|
||||
</feSpecularLighting>
|
||||
<feComposite
|
||||
k4="0"
|
||||
k1="0"
|
||||
id="feComposite4986-92"
|
||||
in2="result1"
|
||||
k3="1"
|
||||
k2="1"
|
||||
operator="arithmetic"
|
||||
result="result4"
|
||||
in="fbSourceGraphic" />
|
||||
<feComposite
|
||||
id="feComposite4988-2"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="result2"
|
||||
in="result4" />
|
||||
</filter>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter4970-5"
|
||||
inkscape:label="Combined lighting"
|
||||
inkscape:menu="Bevels"
|
||||
inkscape:menu-tooltip="Basic specular bevel to use for building textures">
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur4972-0"
|
||||
stdDeviation="6"
|
||||
in="SourceGraphic"
|
||||
result="result0" />
|
||||
<feDiffuseLighting
|
||||
id="feDiffuseLighting4974-3"
|
||||
lighting-color="#ffffff"
|
||||
diffuseConstant="1"
|
||||
surfaceScale="4"
|
||||
result="result5">
|
||||
<feDistantLight
|
||||
id="feDistantLight4976-6"
|
||||
elevation="45"
|
||||
azimuth="235" />
|
||||
</feDiffuseLighting>
|
||||
<feComposite
|
||||
k4="0"
|
||||
k3="0"
|
||||
k2="0"
|
||||
id="feComposite4978-1"
|
||||
in2="SourceGraphic"
|
||||
k1="1.4"
|
||||
in="result5"
|
||||
result="fbSourceGraphic"
|
||||
operator="arithmetic" />
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur4980-0"
|
||||
result="result0"
|
||||
in="fbSourceGraphic"
|
||||
stdDeviation="6" />
|
||||
<feSpecularLighting
|
||||
id="feSpecularLighting4982-63"
|
||||
specularExponent="25"
|
||||
specularConstant="1"
|
||||
surfaceScale="4"
|
||||
lighting-color="#ffffff"
|
||||
result="result1"
|
||||
in="result0">
|
||||
<feDistantLight
|
||||
id="feDistantLight4984-20"
|
||||
azimuth="235"
|
||||
elevation="45" />
|
||||
</feSpecularLighting>
|
||||
<feComposite
|
||||
k4="0"
|
||||
k1="0"
|
||||
id="feComposite4986-6"
|
||||
in2="result1"
|
||||
k3="1"
|
||||
k2="1"
|
||||
operator="arithmetic"
|
||||
result="result4"
|
||||
in="fbSourceGraphic" />
|
||||
<feComposite
|
||||
id="feComposite4988-15"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="result2"
|
||||
in="result4" />
|
||||
</filter>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter4970-78"
|
||||
inkscape:label="Combined lighting"
|
||||
inkscape:menu="Bevels"
|
||||
inkscape:menu-tooltip="Basic specular bevel to use for building textures">
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur4972-68"
|
||||
stdDeviation="6"
|
||||
in="SourceGraphic"
|
||||
result="result0" />
|
||||
<feDiffuseLighting
|
||||
id="feDiffuseLighting4974-8"
|
||||
lighting-color="#ffffff"
|
||||
diffuseConstant="1"
|
||||
surfaceScale="4"
|
||||
result="result5">
|
||||
<feDistantLight
|
||||
id="feDistantLight4976-4"
|
||||
elevation="45"
|
||||
azimuth="235" />
|
||||
</feDiffuseLighting>
|
||||
<feComposite
|
||||
k4="0"
|
||||
k3="0"
|
||||
k2="0"
|
||||
id="feComposite4978-31"
|
||||
in2="SourceGraphic"
|
||||
k1="1.4"
|
||||
in="result5"
|
||||
result="fbSourceGraphic"
|
||||
operator="arithmetic" />
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur4980-4"
|
||||
result="result0"
|
||||
in="fbSourceGraphic"
|
||||
stdDeviation="6" />
|
||||
<feSpecularLighting
|
||||
id="feSpecularLighting4982-9"
|
||||
specularExponent="25"
|
||||
specularConstant="1"
|
||||
surfaceScale="4"
|
||||
lighting-color="#ffffff"
|
||||
result="result1"
|
||||
in="result0">
|
||||
<feDistantLight
|
||||
id="feDistantLight4984-206"
|
||||
azimuth="235"
|
||||
elevation="45" />
|
||||
</feSpecularLighting>
|
||||
<feComposite
|
||||
k4="0"
|
||||
k1="0"
|
||||
id="feComposite4986-8"
|
||||
in2="result1"
|
||||
k3="1"
|
||||
k2="1"
|
||||
operator="arithmetic"
|
||||
result="result4"
|
||||
in="fbSourceGraphic" />
|
||||
<feComposite
|
||||
id="feComposite4988-9"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="result2"
|
||||
in="result4" />
|
||||
</filter>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Send"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow2Send-4"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path7905-8"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Send"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow2Send-2"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path7905-9"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow2Send"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow2Send"
|
||||
style="overflow:visible"
|
||||
inkscape:isstock="true">
|
||||
<path
|
||||
id="path7905"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
|
||||
transform="matrix(-0.3,0,0,-0.3,0.69,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:grid-bbox="false"
|
||||
guidetolerance="0.10000000cm"
|
||||
inkscape:guide-points="true"
|
||||
inkscape:guide-bbox="true"
|
||||
gridtolerance="0.10000000cm"
|
||||
inkscape:grid-points="false"
|
||||
showguides="true"
|
||||
showgrid="true"
|
||||
inkscape:window-y="36"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-height="980"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:current-layer="layer4"
|
||||
inkscape:document-units="cm"
|
||||
inkscape:cy="131.52113"
|
||||
inkscape:cx="373.4425"
|
||||
inkscape:zoom="1.6747942"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
inkscape:snap-global="false"
|
||||
inkscape:window-maximized="1"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
units="mm" />
|
||||
<metadata
|
||||
id="metadata4">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer8"
|
||||
inkscape:label="surface"
|
||||
style="display:inline"
|
||||
transform="translate(-147.62387,96.570009)" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer4"
|
||||
inkscape:label="curves"
|
||||
style="display:inline"
|
||||
transform="translate(-147.62387,96.570009)">
|
||||
<g
|
||||
id="g396"
|
||||
transform="matrix(1.8863177,0,0,1.8863177,-130.84168,-163.94689)">
|
||||
<path
|
||||
style="display:inline;fill:#ffd22f;fill-opacity:1;stroke:none;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter4970-7)"
|
||||
d="m 385.11804,41.387491 c -14.17324,0 -28.36639,13.89887 -28.46875,28.34375 -0.10237,14.44488 14.29552,28.343761 28.46875,28.343761 14.15454,0 35.35807,-7.075121 49.53125,-7.093761 14.17322,0 35.45176,7.093761 49.62499,7.093761 14.17323,0 28.33514,-14.170531 28.4375,-28.343761 -0.10236,-14.17322 -14.26427,-28.34375 -28.4375,-28.34375 -14.15454,0 -35.38931,7.04387 -49.56249,7.0625 -14.17323,0 -35.42052,-7.0625 -49.59375,-7.0625 z m 10.0625,22.75 c 7.69467,0 14.24184,2.43525 16.90625,5.84375 -1.01621,0.91796 -2.50254,1.76236 -4.59375,2.46875 -7.50002,2.53346 -19.02782,2.30857 -25.71875,-0.53125 -1.51665,-0.6437 -2.63046,-1.36614 -3.40625,-2.125 2.74872,-3.3176 9.24764,-5.65625 16.8125,-5.65625 z m 78.84374,0 c 7.69467,0 14.24183,2.43525 16.90625,5.84375 -1.01621,0.91796 -2.50255,1.76236 -4.59375,2.46875 -7.50002,2.53346 -19.02783,2.30857 -25.71875,-0.53125 -1.51665,-0.6437 -2.63047,-1.36614 -3.40625,-2.125 2.74872,-3.3176 9.24763,-5.65625 16.8125,-5.65625 z"
|
||||
id="path2522-3-8"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="display:inline;opacity:0;fill:#ffd22f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.74409449;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 384.80832,40.944122 c -14.17324,-10e-7 -28.36639,13.898869 -28.46875,28.343751 -0.10237,14.44488 14.29552,28.34375 28.46875,28.34375 14.15454,0 35.35807,-7.075114 49.53125,-7.09375 14.17322,10e-7 35.45177,7.09375 49.625,7.09375 14.17323,0 28.33514,-14.170522 28.4375,-28.34375 -0.10236,-14.173227 -14.26427,-28.343751 -28.4375,-28.343751 -14.15454,-10e-7 -35.38932,7.043865 -49.5625,7.062501 -14.17323,1e-6 -35.42052,-7.062501 -49.59375,-7.062501 z m 10.0625,22.750001 c 7.69467,-2e-6 14.24184,2.435251 16.90625,5.84375 -1.01621,0.91796 -2.50254,1.762354 -4.59375,2.46875 -7.50002,2.533462 -19.02782,2.308566 -25.71875,-0.53125 -1.51665,-0.643705 -2.63046,-1.366139 -3.40625,-2.125 2.74872,-3.317601 9.24764,-5.656249 16.8125,-5.65625 z m 78.84375,0 c 7.69467,-2e-6 14.24183,2.435251 16.90625,5.84375 -1.01621,0.91796 -2.50255,1.762354 -4.59375,2.46875 -7.50002,2.533462 -19.02783,2.308566 -25.71875,-0.53125 -1.51665,-0.643705 -2.63047,-1.366139 -3.40625,-2.125 2.74872,-3.317601 9.24763,-5.656249 16.8125,-5.65625 z"
|
||||
id="path30847-9"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="csssc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3122-7"
|
||||
d="m 382.14427,71.939989 c -12.45505,6.966385 -19.84364,-2.744333 -18.47147,-7.705244 1.37216,-4.960911 11.18843,-13.932771 29.55436,-13.299463 18.36592,0.633308 30.82098,6.755283 30.50432,14.249425 -0.31665,7.494142 -11.82174,12.349501 -23.01018,8.760757"
|
||||
style="display:inline;fill:none;stroke:#0000ff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
id="path2485-9"
|
||||
d="m 372.95786,94.765899 c 11.02027,2.16519 18.88766,-21.546908 8.79922,-22.810029"
|
||||
style="display:inline;fill:none;stroke:#afc6e9;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
id="path2485-8-3"
|
||||
d="M 407.76489,94.146969 C 396.74462,96.312159 390.98826,74.816638 401.0767,73.553517"
|
||||
style="display:inline;fill:none;stroke:#afc6e9;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="csc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3102-6-1"
|
||||
d="m 372.90957,94.30109 c -2.21658,-3.9054 5.91087,-8.44411 18.89368,-8.23301 12.98281,0.21111 21.84912,5.59422 16.36045,8.12745"
|
||||
style="display:inline;fill:none;stroke:#0000ff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="scsss"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3124-9"
|
||||
d="m 426.26472,64.973608 c 0,8.569272 -15.59478,14.777181 -35.67634,16.149347 -17.31801,-3.4982 -28.8155,-4.73019 -28.92105,-15.199385 -0.0864,-8.568837 13.40337,-17.977386 32.61534,-16.993759 16.49282,0.844411 31.98205,7.474525 31.98205,16.043797 z"
|
||||
style="display:inline;fill:none;stroke:#ff0000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<circle
|
||||
r="1.3123976"
|
||||
cy="81.049873"
|
||||
cx="390.8085"
|
||||
id="path2489-4"
|
||||
style="display:inline;fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.51125908" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:0.75;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="path24562-7"
|
||||
sodipodi:cx="473.9223"
|
||||
sodipodi:cy="67.028564"
|
||||
sodipodi:rx="18.207998"
|
||||
sodipodi:ry="6.8942909"
|
||||
d="m 487.5093,62.438965 a 18.207998,6.8942909 0 0 1 -0.92385,9.543518 18.207998,6.8942909 0 0 1 -25.2214,0.03813 18.207998,6.8942909 0 0 1 -1.12511,-9.54042"
|
||||
sodipodi:start="5.5547402"
|
||||
sodipodi:end="3.8620517"
|
||||
sodipodi:open="true" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:0.75;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="path30849-8"
|
||||
sodipodi:cx="395.07993"
|
||||
sodipodi:cy="67.028564"
|
||||
sodipodi:rx="18.207998"
|
||||
sodipodi:ry="6.8942909"
|
||||
d="m 408.66692,62.438965 a 18.207998,6.8942909 0 0 1 -0.92385,9.543518 18.207998,6.8942909 0 0 1 -25.2214,0.03813 18.207998,6.8942909 0 0 1 -1.12511,-9.54042"
|
||||
sodipodi:start="5.5547402"
|
||||
sodipodi:end="3.8620517"
|
||||
sodipodi:open="true" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 384.80832,40.944121 c -14.17324,-1e-6 -28.36639,13.898868 -28.46875,28.34375 -0.10237,14.444879 14.29552,28.343752 28.46875,28.343752 14.15454,0 35.35807,-7.075113 49.53125,-7.093753 14.17322,0 35.45177,7.093753 49.625,7.093753 14.17323,0 28.33514,-14.170523 28.4375,-28.343752 -0.10236,-14.173227 -14.26427,-28.34375 -28.4375,-28.34375 -14.15454,-1e-6 -35.38932,7.043864 -49.5625,7.0625 -14.17323,10e-7 -35.42052,-7.0625 -49.59375,-7.0625 z m 10.0625,22.75 c 7.69467,-2e-6 14.24184,2.435251 16.90625,5.84375 -1.01621,0.91796 -2.50254,1.762354 -4.59375,2.46875 -7.50002,2.533459 -19.02782,2.308569 -25.71875,-0.53125 -1.51665,-0.643705 -2.63046,-1.366139 -3.40625,-2.125 2.74872,-3.317601 9.24764,-5.656249 16.8125,-5.65625 z m 78.84375,0 c 7.69467,-2e-6 14.24183,2.435251 16.90625,5.84375 -1.01621,0.91796 -2.50255,1.762354 -4.59375,2.46875 -7.50002,2.533459 -19.02783,2.308569 -25.71875,-0.53125 -1.51665,-0.643705 -2.63047,-1.366139 -3.40625,-2.125 2.74872,-3.317601 9.24763,-5.656249 16.8125,-5.65625 z"
|
||||
id="path2522-4"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccc"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g443"
|
||||
transform="matrix(1.8863177,0,0,1.8863177,-133.19312,-190.30367)">
|
||||
<path
|
||||
style="display:inline;fill:#ffd22f;fill-opacity:1;stroke:none;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter4970-78)"
|
||||
d="m 386.36462,138.38235 c -14.17324,0 -28.36639,13.89887 -28.46875,28.34375 -0.10237,14.44488 14.29552,28.34376 28.46875,28.34376 14.15454,0 35.35807,-7.07512 49.53125,-7.09376 14.17322,0 35.45176,7.09376 49.62499,7.09376 14.17323,0 28.33514,-14.17053 28.4375,-28.34376 -0.10236,-14.17322 -14.26427,-28.34375 -28.4375,-28.34375 -14.15454,0 -35.38931,7.04387 -49.56249,7.0625 -14.17323,0 -35.42052,-7.0625 -49.59375,-7.0625 z m 10.0625,22.75 c 7.69467,0 14.24184,2.43525 16.90625,5.84375 -1.01621,0.91796 -2.50254,1.76236 -4.59375,2.46875 -7.50002,2.53346 -19.02782,2.30857 -25.71875,-0.53125 -1.51665,-0.6437 -2.63046,-1.36614 -3.40625,-2.125 2.74872,-3.3176 9.24764,-5.65625 16.8125,-5.65625 z m 78.84374,0 c 7.69467,0 14.24183,2.43525 16.90625,5.84375 -1.01621,0.91796 -2.50255,1.76236 -4.59375,2.46875 -7.50002,2.53346 -19.02783,2.30857 -25.71875,-0.53125 -1.51665,-0.6437 -2.63047,-1.36614 -3.40625,-2.125 2.74872,-3.3176 9.24763,-5.65625 16.8125,-5.65625 z"
|
||||
id="path2522-3-2"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="display:inline;opacity:0;fill:#ffd22f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.74409449;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 386.0549,137.93898 c -14.17324,0 -28.36639,13.89887 -28.46875,28.34375 -0.10237,14.44488 14.29552,28.34375 28.46875,28.34375 14.15454,0 35.35807,-7.07511 49.53125,-7.09375 14.17322,0 35.45177,7.09375 49.625,7.09375 14.17323,0 28.33514,-14.17052 28.4375,-28.34375 -0.10236,-14.17322 -14.26427,-28.34375 -28.4375,-28.34375 -14.15454,0 -35.38932,7.04387 -49.5625,7.0625 -14.17323,0 -35.42052,-7.0625 -49.59375,-7.0625 z m 10.0625,22.75 c 7.69467,0 14.24184,2.43525 16.90625,5.84375 -1.01621,0.91796 -2.50254,1.76236 -4.59375,2.46875 -7.50002,2.53347 -19.02782,2.30857 -25.71875,-0.53125 -1.51665,-0.6437 -2.63046,-1.36614 -3.40625,-2.125 2.74872,-3.3176 9.24764,-5.65625 16.8125,-5.65625 z m 78.84375,0 c 7.69467,0 14.24183,2.43525 16.90625,5.84375 -1.01621,0.91796 -2.50255,1.76236 -4.59375,2.46875 -7.50002,2.53347 -19.02783,2.30857 -25.71875,-0.53125 -1.51665,-0.6437 -2.63047,-1.36614 -3.40625,-2.125 2.74872,-3.3176 9.24763,-5.65625 16.8125,-5.65625 z"
|
||||
id="path30847-6"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="scsss"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3124-2"
|
||||
d="m 427.5113,161.96847 c 0,8.56927 -15.59478,14.77718 -35.67634,16.14935 -17.31801,-3.4982 -28.8155,-4.73019 -28.92105,-15.19939 -0.0864,-8.56884 13.40337,-17.97739 32.61534,-16.99376 16.49282,0.84441 31.98205,7.47453 31.98205,16.0438 z"
|
||||
style="display:inline;fill:none;stroke:#ff0000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<circle
|
||||
r="1.3123976"
|
||||
cy="178.04474"
|
||||
cx="392.05508"
|
||||
id="path2489-72"
|
||||
style="display:inline;fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.51125908" />
|
||||
<path
|
||||
sodipodi:nodetypes="sssssss"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3122-3-2"
|
||||
d="m 372.44496,171.00375 c -5.55181,-1.32089 -8.39454,-6.58916 -7.49809,-9.83016 1.37217,-4.96091 11.18843,-13.93277 29.55436,-13.29946 18.36592,0.63331 30.82097,6.75528 30.50432,14.24942 -0.20331,4.81165 -5.01886,8.53549 -11.40153,9.63502 -3.55836,0.61299 -12.70926,2.89123 -20.89717,2.61905 -11.81585,-0.39277 -17.3157,-2.67291 -20.26189,-3.37387 z"
|
||||
style="display:inline;fill:none;stroke:#0000ff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:0.75;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="path24562-6"
|
||||
sodipodi:cx="475.16888"
|
||||
sodipodi:cy="164.02342"
|
||||
sodipodi:rx="18.207998"
|
||||
sodipodi:ry="6.8942909"
|
||||
d="m 488.75588,159.43382 a 18.207998,6.8942909 0 0 1 -0.92385,9.54352 18.207998,6.8942909 0 0 1 -25.2214,0.0381 18.207998,6.8942909 0 0 1 -1.12511,-9.54042"
|
||||
sodipodi:start="5.5547402"
|
||||
sodipodi:end="3.8620517"
|
||||
sodipodi:open="true" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:0.75;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="path30849-1"
|
||||
sodipodi:cx="396.32651"
|
||||
sodipodi:cy="164.02344"
|
||||
sodipodi:rx="18.207998"
|
||||
sodipodi:ry="6.8942909"
|
||||
d="m 409.91351,159.43384 a 18.207998,6.8942909 0 0 1 -0.92386,9.54352 18.207998,6.8942909 0 0 1 -25.2214,0.0381 18.207998,6.8942909 0 0 1 -1.12511,-9.54042"
|
||||
sodipodi:start="5.5547402"
|
||||
sodipodi:end="3.8620517"
|
||||
sodipodi:open="true" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 386.0549,137.93898 c -14.17324,0 -28.36639,13.89887 -28.46875,28.34375 -0.10237,14.44488 14.29552,28.34375 28.46875,28.34375 14.15454,0 35.35807,-7.07511 49.53125,-7.09375 14.17322,0 35.45177,7.09375 49.625,7.09375 14.17323,0 28.33514,-14.17052 28.4375,-28.34375 -0.10236,-14.17323 -14.26427,-28.34375 -28.4375,-28.34375 -14.15454,0 -35.38932,7.04387 -49.5625,7.0625 -14.17323,0 -35.42052,-7.0625 -49.59375,-7.0625 z m 10.0625,22.75 c 7.69467,0 14.24184,2.43525 16.90625,5.84375 -1.01621,0.91796 -2.50254,1.76236 -4.59375,2.46875 -7.50002,2.53346 -19.02782,2.30857 -25.71875,-0.53125 -1.51665,-0.6437 -2.63046,-1.36614 -3.40625,-2.125 2.74872,-3.3176 9.24764,-5.65625 16.8125,-5.65625 z m 78.84375,0 c 7.69467,0 14.24183,2.43525 16.90625,5.84375 -1.01621,0.91796 -2.50255,1.76236 -4.59375,2.46875 -7.50002,2.53346 -19.02783,2.30857 -25.71875,-0.53125 -1.51665,-0.6437 -2.63047,-1.36614 -3.40625,-2.125 2.74872,-3.3176 9.24763,-5.65625 16.8125,-5.65625 z"
|
||||
id="path2522-06"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccc"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:11.80693531;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Send)"
|
||||
d="m 478.78203,-30.490675 h 40.43894"
|
||||
id="path7065"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:11.80693531;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Send-4)"
|
||||
d="M 477.93335,127.69342 H 518.3723"
|
||||
id="path7065-1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:11.80693531;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Send-2)"
|
||||
d="M 536.10034,28.870148 482.32531,63.324309"
|
||||
id="path7065-3"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<g
|
||||
style="display:inline"
|
||||
id="g419"
|
||||
transform="matrix(1.8863177,0,0,1.8863177,-130.84168,-166.94073)">
|
||||
<path
|
||||
style="display:inline;fill:#ffd22f;fill-opacity:1;stroke:none;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter4970)"
|
||||
d="m 191.69948,42.97462 c -14.17324,0 -28.36639,13.89887 -28.46875,28.34375 -0.10237,14.44488 14.29552,28.343761 28.46875,28.343761 14.15454,0 35.35807,-7.075121 49.53125,-7.093761 14.17322,0 35.45176,7.093761 49.62499,7.093761 14.17323,0 28.33514,-14.170531 28.4375,-28.343761 -0.10236,-14.17322 -14.26427,-28.34375 -28.4375,-28.34375 -14.15454,0 -35.38931,7.04387 -49.56249,7.0625 -14.17323,0 -35.42052,-7.0625 -49.59375,-7.0625 z m 10.0625,22.75 c 7.69467,0 14.24184,2.43525 16.90625,5.84375 -1.01621,0.91796 -2.50254,1.76236 -4.59375,2.46875 -7.50002,2.53346 -19.02782,2.30857 -25.71875,-0.53125 -1.51665,-0.6437 -2.63046,-1.36614 -3.40625,-2.125 2.74872,-3.3176 9.24764,-5.65625 16.8125,-5.65625 z m 78.84374,0 c 7.69467,0 14.24183,2.43525 16.90625,5.84375 -1.01621,0.91796 -2.50255,1.76236 -4.59375,2.46875 -7.50002,2.53346 -19.02783,2.30857 -25.71875,-0.53125 -1.51665,-0.6437 -2.63047,-1.36614 -3.40625,-2.125 2.74872,-3.3176 9.24763,-5.65625 16.8125,-5.65625 z"
|
||||
id="path2522-3"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
transform="translate(1.3444241e-6,1.3444242e-6)"
|
||||
style="display:inline;opacity:0;fill:#ffd22f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.74409449;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 191.38976,42.53125 c -14.17324,-10e-7 -28.36639,13.898868 -28.46875,28.34375 -0.10237,14.44488 14.29552,28.34375 28.46875,28.34375 14.15454,0 35.35807,-7.075114 49.53125,-7.09375 14.17322,10e-7 35.45177,7.09375 49.625,7.09375 14.17323,0 28.33514,-14.170522 28.4375,-28.34375 -0.10236,-14.173227 -14.26427,-28.34375 -28.4375,-28.34375 -14.15454,-10e-7 -35.38932,7.043864 -49.5625,7.0625 -14.17323,10e-7 -35.42052,-7.0625 -49.59375,-7.0625 z m 10.0625,22.75 c 7.69467,-2e-6 14.24184,2.435251 16.90625,5.84375 -1.01621,0.91796 -2.50254,1.762354 -4.59375,2.46875 -7.50002,2.533462 -19.02782,2.308566 -25.71875,-0.53125 -1.51665,-0.643705 -2.63046,-1.366139 -3.40625,-2.125 2.74872,-3.317601 9.24764,-5.656249 16.8125,-5.65625 z m 78.84375,0 c 7.69467,-2e-6 14.24183,2.435251 16.90625,5.84375 -1.01621,0.91796 -2.50255,1.762354 -4.59375,2.46875 -7.50002,2.533462 -19.02783,2.308566 -25.71875,-0.53125 -1.51665,-0.643705 -2.63047,-1.366139 -3.40625,-2.125 2.74872,-3.317601 9.24763,-5.656249 16.8125,-5.65625 z"
|
||||
id="path30847"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="csssc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3122"
|
||||
d="m 188.72571,73.527118 c -12.45505,6.966385 -19.84364,-2.744333 -18.47147,-7.705244 1.37216,-4.960911 11.18843,-13.932771 29.55436,-13.299463 18.36592,0.633308 30.82098,6.755283 30.50432,14.249425 -0.31665,7.494142 -11.82174,12.349501 -23.01018,8.760757"
|
||||
style="display:inline;fill:none;stroke:#0000ff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="sssss"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3124-3"
|
||||
d="m 290.83812,86.878636 c 0,8.56927 -8.69639,3.879488 -19.25641,3.610492 -8.83596,-0.225079 -33.72052,-1.155804 -29.81668,-10.8705 8.42211,-20.958418 19.88482,1.055538 30.22699,1.963795 8.93197,0.784412 18.8461,-3.273064 18.8461,5.296213 z"
|
||||
style="display:inline;fill:none;stroke:#008000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
id="path2485"
|
||||
d="m 179.5393,96.353028 c 11.02027,2.16519 18.88766,-21.546908 8.79922,-22.810029"
|
||||
style="display:inline;fill:none;stroke:#afc6e9;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="cc"
|
||||
id="path2485-8"
|
||||
d="M 214.34633,95.734098 C 203.32606,97.899288 197.5697,76.403767 207.65814,75.140646"
|
||||
style="display:inline;fill:none;stroke:#afc6e9;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3102"
|
||||
d="m 179.6483,96.009544 c -4.1165,-8.760757 7.17749,-13.616117 20.1603,-13.405014 12.98281,0.211102 26.07117,8.127449 15.09383,13.299463"
|
||||
style="display:inline;fill:none;stroke:#0000ff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="scsss"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3124"
|
||||
d="m 236.2238,73.949327 c 0,8.569272 -15.59478,14.777181 -35.67634,16.149347 -17.31801,-3.4982 -28.8155,-4.73019 -28.92105,-15.199385 -0.0864,-8.568837 13.40337,-17.977386 32.61534,-16.993759 16.49282,0.844411 31.98205,7.474525 31.98205,16.043797 z"
|
||||
style="display:inline;fill:none;stroke:#ff0000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
|
||||
transform="translate(-3.3776414,-7.3885905)" />
|
||||
<circle
|
||||
r="0.86841339"
|
||||
cy="24.981375"
|
||||
cx="174.28389"
|
||||
transform="matrix(1.5112591,0,0,1.5112591,-65.998159,44.883671)"
|
||||
id="path2489"
|
||||
style="display:inline;fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:0.75;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="path24562"
|
||||
sodipodi:cx="245.36606"
|
||||
sodipodi:cy="78.353447"
|
||||
sodipodi:rx="18.207998"
|
||||
sodipodi:ry="6.8942909"
|
||||
d="m 258.95306,73.763847 a 18.207998,6.8942909 0 0 1 -0.92386,9.543518 18.207998,6.8942909 0 0 1 -25.2214,0.03813 18.207998,6.8942909 0 0 1 -1.12511,-9.54042"
|
||||
sodipodi:start="5.5547402"
|
||||
sodipodi:end="3.8620517"
|
||||
sodipodi:open="true"
|
||||
transform="translate(35.137711,-9.7377557)" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:0.75;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="path30849"
|
||||
sodipodi:cx="245.36606"
|
||||
sodipodi:cy="78.353447"
|
||||
sodipodi:rx="18.207998"
|
||||
sodipodi:ry="6.8942909"
|
||||
d="m 258.95306,73.763847 a 18.207998,6.8942909 0 0 1 -0.92386,9.543518 18.207998,6.8942909 0 0 1 -25.2214,0.03813 18.207998,6.8942909 0 0 1 -1.12511,-9.54042"
|
||||
sodipodi:start="5.5547402"
|
||||
sodipodi:end="3.8620517"
|
||||
sodipodi:open="true"
|
||||
transform="translate(-43.704689,-9.7377517)" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 191.38976,42.53125 c -14.17324,-10e-7 -28.36639,13.898868 -28.46875,28.34375 -0.10237,14.444879 14.29552,28.343752 28.46875,28.343752 14.15454,0 35.35807,-7.075113 49.53125,-7.093753 14.17322,0 35.45177,7.093753 49.625,7.093753 14.17323,0 28.33514,-14.170523 28.4375,-28.343752 -0.10236,-14.173227 -14.26427,-28.34375 -28.4375,-28.34375 -14.15454,-10e-7 -35.38932,7.043864 -49.5625,7.0625 -14.17323,10e-7 -35.42052,-7.0625 -49.59375,-7.0625 z m 10.0625,22.75 c 7.69467,-2e-6 14.24184,2.435251 16.90625,5.84375 -1.01621,0.91796 -2.50254,1.762354 -4.59375,2.46875 -7.50002,2.533459 -19.02782,2.308569 -25.71875,-0.53125 -1.51665,-0.643705 -2.63046,-1.366139 -3.40625,-2.125 2.74872,-3.317601 9.24764,-5.656249 16.8125,-5.65625 z m 78.84375,0 c 7.69467,-2e-6 14.24183,2.435251 16.90625,5.84375 -1.01621,0.91796 -2.50255,1.762354 -4.59375,2.46875 -7.50002,2.533459 -19.02783,2.308569 -25.71875,-0.53125 -1.51665,-0.643705 -2.63047,-1.366139 -3.40625,-2.125 2.74872,-3.317601 9.24763,-5.656249 16.8125,-5.65625 z"
|
||||
id="path2522"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccc"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
style="display:inline"
|
||||
id="g432"
|
||||
transform="matrix(1.8863177,0,0,1.8863177,-128.51731,-197.12181)">
|
||||
<path
|
||||
style="display:inline;fill:#ffd22f;fill-opacity:1;stroke:none;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter4970-5)"
|
||||
d="m 190.46726,141.99687 c -14.17324,0 -28.36639,13.89887 -28.46875,28.34375 -0.10237,14.44488 14.29552,28.34376 28.46875,28.34376 14.15454,0 35.35807,-7.07512 49.53125,-7.09376 14.17322,0 35.45176,7.09376 49.62499,7.09376 14.17323,0 28.33514,-14.17053 28.4375,-28.34376 -0.10236,-14.17322 -14.26427,-28.34375 -28.4375,-28.34375 -14.15454,0 -35.38931,7.04387 -49.56249,7.0625 -14.17323,0 -35.42052,-7.0625 -49.59375,-7.0625 z m 10.0625,22.75 c 7.69467,0 14.24184,2.43525 16.90625,5.84375 -1.01621,0.91796 -2.50254,1.76236 -4.59375,2.46875 -7.50002,2.53346 -19.02782,2.30857 -25.71875,-0.53125 -1.51665,-0.6437 -2.63046,-1.36614 -3.40625,-2.125 2.74872,-3.3176 9.24764,-5.65625 16.8125,-5.65625 z m 78.84374,0 c 7.69467,0 14.24183,2.43525 16.90625,5.84375 -1.01621,0.91796 -2.50255,1.76236 -4.59375,2.46875 -7.50002,2.53346 -19.02783,2.30857 -25.71875,-0.53125 -1.51665,-0.6437 -2.63047,-1.36614 -3.40625,-2.125 2.74872,-3.3176 9.24763,-5.65625 16.8125,-5.65625 z"
|
||||
id="path2522-3-5"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="display:inline;opacity:0;fill:#ffd22f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.74409449;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 190.15754,141.5535 c -14.17324,0 -28.36639,13.89887 -28.46875,28.34375 -0.10237,14.44488 14.29552,28.34375 28.46875,28.34375 14.15454,0 35.35807,-7.07512 49.53125,-7.09375 14.17322,0 35.45177,7.09375 49.625,7.09375 14.17323,0 28.33514,-14.17052 28.4375,-28.34375 -0.10236,-14.17323 -14.26427,-28.34375 -28.4375,-28.34375 -14.15454,0 -35.38932,7.04386 -49.5625,7.0625 -14.17323,0 -35.42052,-7.0625 -49.59375,-7.0625 z m 10.0625,22.75 c 7.69467,0 14.24184,2.43525 16.90625,5.84375 -1.01621,0.91796 -2.50254,1.76235 -4.59375,2.46875 -7.50002,2.53346 -19.02782,2.30856 -25.71875,-0.53125 -1.51665,-0.64371 -2.63046,-1.36614 -3.40625,-2.125 2.74872,-3.3176 9.24764,-5.65625 16.8125,-5.65625 z m 78.84375,0 c 7.69467,0 14.24183,2.43525 16.90625,5.84375 -1.01621,0.91796 -2.50255,1.76235 -4.59375,2.46875 -7.50002,2.53346 -19.02783,2.30856 -25.71875,-0.53125 -1.51665,-0.64371 -2.63047,-1.36614 -3.40625,-2.125 2.74872,-3.3176 9.24763,-5.65625 16.8125,-5.65625 z"
|
||||
id="path30847-4"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccc"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="csssc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3122-76"
|
||||
d="m 187.49349,172.54936 c -12.45505,6.96639 -19.84364,-2.74433 -18.47147,-7.70524 1.37216,-4.96091 11.18843,-13.93277 29.55436,-13.29946 18.36592,0.6333 30.82098,6.75528 30.50432,14.24942 -0.31665,7.49414 -11.82174,12.3495 -23.01018,8.76076"
|
||||
style="display:inline;fill:none;stroke:#0000ff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
sodipodi:nodetypes="csc"
|
||||
id="path2485-7-5"
|
||||
d="m 194.29965,194.60316 c -5.56935,-0.048 -6.85687,-2.08002 -4.49505,-7.05609 2.98554,-6.29015 2.95018,-13.9932 -2.6824,-14.69842"
|
||||
style="display:inline;fill:none;stroke:#afc6e9;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="csc"
|
||||
id="path2485-8-5-69"
|
||||
d="m 193.91967,194.61754 c 12.92471,-0.20828 10.13934,-2.63947 8.34226,-7.42053 -2.08693,-5.55216 -1.24075,-12.07203 4.17989,-12.75072"
|
||||
style="display:inline;fill:none;stroke:#afc6e9;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="scsss"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3124-4"
|
||||
d="m 231.61394,165.58298 c 0,8.56927 -15.59478,14.77718 -35.67634,16.14935 -17.31801,-3.4982 -28.8155,-4.73019 -28.92105,-15.19939 -0.0864,-8.56883 13.40337,-17.97738 32.61534,-16.99375 16.49282,0.84441 31.98205,7.47452 31.98205,16.04379 z"
|
||||
style="display:inline;fill:none;stroke:#ff0000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
|
||||
<circle
|
||||
r="1.3123976"
|
||||
cy="181.65924"
|
||||
cx="196.15775"
|
||||
id="path2489-7"
|
||||
style="display:inline;fill:#008000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.51125908" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:0.75;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="path24562-4"
|
||||
sodipodi:cx="279.27155"
|
||||
sodipodi:cy="167.63794"
|
||||
sodipodi:rx="18.207998"
|
||||
sodipodi:ry="6.8942909"
|
||||
d="m 292.85854,163.04834 a 18.207998,6.8942909 0 0 1 -0.92385,9.54352 18.207998,6.8942909 0 0 1 -25.2214,0.0381 18.207998,6.8942909 0 0 1 -1.12511,-9.54042"
|
||||
sodipodi:start="5.5547402"
|
||||
sodipodi:end="3.8620517"
|
||||
sodipodi:open="true" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:0.75;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="path30849-3"
|
||||
sodipodi:cx="200.42915"
|
||||
sodipodi:cy="167.63794"
|
||||
sodipodi:rx="18.207998"
|
||||
sodipodi:ry="6.8942909"
|
||||
d="m 214.01615,163.04834 a 18.207998,6.8942909 0 0 1 -0.92385,9.54352 18.207998,6.8942909 0 0 1 -25.2214,0.0381 18.207998,6.8942909 0 0 1 -1.12511,-9.54042"
|
||||
sodipodi:start="5.5547402"
|
||||
sodipodi:end="3.8620517"
|
||||
sodipodi:open="true" />
|
||||
<path
|
||||
style="display:inline;fill:none;stroke:#000000;stroke-width:0.75;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 190.15754,141.5535 c -14.17324,0 -28.36639,13.89886 -28.46875,28.34375 -0.10237,14.44487 14.29552,28.34375 28.46875,28.34375 14.15454,0 35.35807,-7.07512 49.53125,-7.09376 14.17322,0 35.45177,7.09376 49.625,7.09376 14.17323,0 28.33514,-14.17053 28.4375,-28.34375 -0.10236,-14.17323 -14.26427,-28.34375 -28.4375,-28.34375 -14.15454,0 -35.38932,7.04386 -49.5625,7.0625 -14.17323,0 -35.42052,-7.0625 -49.59375,-7.0625 z m 10.0625,22.75 c 7.69467,-1e-5 14.24184,2.43525 16.90625,5.84375 -1.01621,0.91796 -2.50254,1.76235 -4.59375,2.46875 -7.50002,2.53345 -19.02782,2.30856 -25.71875,-0.53125 -1.51665,-0.64371 -2.63046,-1.36614 -3.40625,-2.125 2.74872,-3.31761 9.24764,-5.65625 16.8125,-5.65625 z m 78.84375,0 c 7.69467,-1e-5 14.24183,2.43525 16.90625,5.84375 -1.01621,0.91796 -2.50255,1.76235 -4.59375,2.46875 -7.50002,2.53345 -19.02783,2.30856 -25.71875,-0.53125 -1.51665,-0.64371 -2.63047,-1.36614 -3.40625,-2.125 2.74872,-3.31761 9.24763,-5.65625 16.8125,-5.65625 z"
|
||||
id="path2522-0"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccc"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 415 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
|
@ -0,0 +1,439 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="60.536667mm"
|
||||
height="62.088886mm"
|
||||
viewBox="0 0 60.536667 62.088887"
|
||||
version="1.1"
|
||||
id="svg11763"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="quad_mesh.svg">
|
||||
<defs
|
||||
id="defs11757">
|
||||
<clipPath
|
||||
id="clip2">
|
||||
<path
|
||||
id="path11765"
|
||||
d="M 0.398438,36 H 153.48828 v 82 H 0.398438 Z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clip3">
|
||||
<path
|
||||
id="path11768"
|
||||
d="m 36,0.617188 h 82 V 153.79687 H 36 Z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clip4">
|
||||
<path
|
||||
id="path11771"
|
||||
d="M 0.398438,36 H 153.48828 v 82 H 0.398438 Z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clip5">
|
||||
<path
|
||||
id="path11774"
|
||||
d="M 0.398438,41 H 20 v 72 H 0.398438 Z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clip6">
|
||||
<path
|
||||
id="path11777"
|
||||
d="M 0.398438,103 H 51 v 50.79687 H 0.398438 Z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clip7">
|
||||
<path
|
||||
id="path11780"
|
||||
d="m 134,41 h 19.48828 v 72 H 134 Z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clip8">
|
||||
<path
|
||||
id="path11783"
|
||||
d="m 102,0.617188 h 51.48828 V 51 H 102 Z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clip9">
|
||||
<path
|
||||
id="path11786"
|
||||
d="m 103,103 h 50.48828 v 50.79687 H 103 Z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clip10">
|
||||
<path
|
||||
id="path11789"
|
||||
d="m 41,134 h 72 v 19.79687 H 41 Z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clip11">
|
||||
<path
|
||||
id="path11792"
|
||||
d="M 0.398438,44 H 6 v 5 H 0.398438 Z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clip12">
|
||||
<path
|
||||
id="path11795"
|
||||
d="M 0.398438,105 H 5 v 5 H 0.398438 Z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clip13">
|
||||
<path
|
||||
id="path11798"
|
||||
d="m 44,149 h 5 v 4.79687 h -5 z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clip14">
|
||||
<path
|
||||
id="path11801"
|
||||
d="m 105,149 h 5 v 4.79687 h -5 z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clip15">
|
||||
<path
|
||||
id="path11804"
|
||||
d="m 149,105 h 4.48828 v 5 H 149 Z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clip16">
|
||||
<path
|
||||
id="path11807"
|
||||
d="m 148,44 h 5.48828 v 5 H 148 Z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clip17">
|
||||
<path
|
||||
id="path11810"
|
||||
d="m 44,0.617188 h 6 V 5 h -6 z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clip1">
|
||||
<rect
|
||||
id="rect11813"
|
||||
height="154"
|
||||
width="154"
|
||||
y="0"
|
||||
x="0" />
|
||||
</clipPath>
|
||||
<g
|
||||
clip-path="url(#clip1)"
|
||||
id="surface577293">
|
||||
<path
|
||||
id="path11816"
|
||||
d="M 46.058594,1.859375 C 63.175781,18.96875 90.925781,18.96875 107.86328,1.675781 c -0.17969,-0.152343 -0.17969,-0.132812 -0.17969,-0.109375 0,24.203125 19.625,43.828125 44.04688,43.867188 0.19531,0.05469 0.17969,0.07031 0.16406,0.08594 -17.11719,17.117188 -17.11719,44.863281 -0.0859,61.964846 -24.29296,-0.0117 -43.91406,19.61328 -43.91406,43.81249 0,0.0234 0,0.0469 0.0234,-0.0586 0.0195,-0.14062 0,-0.16016 -0.008,-0.17187 -17.117191,-17.11719 -44.871098,-17.11719 -61.808598,0.17578 0.175782,0.15625 0.175782,0.13281 0.175782,0.11718 0,-24.20703 -19.621094,-43.83203 -44.039063,-43.87109 -0.195312,-0.0547 -0.179687,-0.0703 -0.167969,-0.0859 C 19.1875,90.285156 19.1875,62.539062 2.15625,45.4375 26.453125,45.453125 46.074219,25.828125 46.074219,1.621094 c 0,-0.019532 0,-0.042969 -0.03125,0.0625 -0.01563,0.144531 0,0.15625 0.01563,0.175781 z m 0,0"
|
||||
style="fill:#bda63f;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path11818"
|
||||
d="m 45.464844,151.48437 c 0,-24.20703 -19.621094,-43.82812 -43.621094,-43.82031 l 74.125,-30.406248 -30.570312,74.101558 c 0.06641,0.17188 0.06641,0.14844 0.06641,0.125 z m 0,0"
|
||||
style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path11820"
|
||||
d="M 1.339844,107.65625 76.675781,76.207031 1.292969,45.773438 c 17.28125,16.902343 17.28125,44.648437 0.167969,61.765622 l -0.046876,0.0508"
|
||||
style="fill:#007f00;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path11822"
|
||||
d="m 151.89453,108.0625 c -17.11719,-17.117188 -17.11719,-44.871094 0,-61.988281 0.0156,-0.01563 0.0312,-0.02734 0.0898,-0.07813 L 76.675781,77.410156 152.22266,107.62891"
|
||||
style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path11824"
|
||||
d="m 45.976562,2.171875 c 0,24.207031 -19.625,43.832031 -43.621093,43.820313 L 76.472656,76.402344 45.910156,2.300781 c 0.06641,-0.171875 0.06641,-0.152343 0.06641,-0.128906 z m 0,0"
|
||||
style="fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path11826"
|
||||
d="m 107.89453,151.48437 c 0,-24.20703 19.6211,-43.82812 43.61328,-43.82031 L 77.390625,77.257812 107.95313,151.35937 c -0.0586,0.17188 -0.0586,0.14844 -0.0586,0.125 z m 0,0"
|
||||
style="fill:#ff00ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path11828"
|
||||
d="M 77.28125,75.992188 107.71094,151.375 C 90.8125,134.09375 63.0625,134.09375 45.945312,151.21094 c -0.01953,0.0117 -0.02734,0.0273 -0.07812,0.082 z m 0,0"
|
||||
style="fill:#0000ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
id="g11832"
|
||||
clip-path="url(#clip2)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path11830"
|
||||
transform="matrix(1.40717,0,0,1.40717,0.398,0.616474)"
|
||||
d="M 1.443811,32.49869 106.85263,75.975802"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<path
|
||||
id="path11834"
|
||||
d="M 107.73828,1.589844 C 90.621094,18.707031 62.871094,18.707031 45.75,1.589844 45.742188,1.578125 45.722656,1.5625 45.675781,1.507812 L 77.089844,76.808594 107.30469,1.257812"
|
||||
style="fill:#007f00;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path11836"
|
||||
d="m 107.89453,2.539062 c 0,24.210938 19.6211,43.832032 43.61328,43.820313 L 77.390625,76.769531 107.95313,2.667969 c -0.0586,-0.171875 -0.0586,-0.148438 -0.0586,-0.128907 z m 0,0"
|
||||
style="fill:#ff00ff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
id="g11842"
|
||||
clip-path="url(#clip3)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path11838"
|
||||
transform="matrix(1.40717,0,0,1.40717,0.398,0.616474)"
|
||||
d="M 76.317049,0.991525 32.728899,106.94443"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path11840"
|
||||
transform="matrix(1.40717,0,0,1.40717,0.398,0.616474)"
|
||||
d="M 32.420767,1.854849 76.214339,106.90279"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g11846"
|
||||
clip-path="url(#clip4)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path11844"
|
||||
transform="matrix(1.40717,0,0,1.40717,0.398,0.616474)"
|
||||
d="M 1.374412,76.081289 107.26069,32.476483"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.20000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g11850"
|
||||
clip-path="url(#clip5)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path11848"
|
||||
transform="matrix(1.40717,0,0,1.40717,0.398,0.616474)"
|
||||
d="m 1.116248,32.229422 c 12.164264,12.164264 12.164264,31.887472 0,44.051736 -0.011104,0.0111 -0.022208,0.01943 -0.030536,0.03054"
|
||||
style="fill:none;stroke:#007f00;stroke-width:0.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g11854"
|
||||
clip-path="url(#clip6)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path11852"
|
||||
transform="matrix(1.40717,-1.40717,1.40717,1.40717,0.398,0.616474)"
|
||||
d="m -37.489461,38.877752 c 8.601318,8.601318 8.59993,22.546361 -0.0014,31.147678 -0.0069,0.0069 -0.01527,0.01527 -0.0236,0.0236"
|
||||
style="fill:none;stroke:#ff0000;stroke-width:0.42426401;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g11858"
|
||||
clip-path="url(#clip7)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path11856"
|
||||
transform="matrix(-1.40717,0,0,-1.40717,0.398,0.616474)"
|
||||
d="m -107.59103,-76.353333 c 12.16426,12.164264 12.16426,31.887472 0,44.051736 -0.0111,0.01388 -0.0167,0.01943 -0.0305,0.03054"
|
||||
style="fill:none;stroke:#0000ff;stroke-width:0.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g11862"
|
||||
clip-path="url(#clip8)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path11860"
|
||||
transform="matrix(-1.40717,1.40717,-1.40717,-1.40717,0.398,0.616474)"
|
||||
d="m -37.550336,-69.765878 c 8.59993,8.599929 8.598542,22.544973 -0.0028,31.14629 -0.0083,0.0083 -0.01527,0.01527 -0.0236,0.0236"
|
||||
style="fill:none;stroke:#ff00ff;stroke-width:0.42426401;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g11866"
|
||||
clip-path="url(#clip9)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path11864"
|
||||
transform="matrix(-1.40717,-1.40717,-1.40717,1.40717,0.398,0.616474)"
|
||||
d="m -91.895845,-15.567495 c 8.601318,8.601317 8.59993,22.546361 0,31.14629 -0.0083,0.0083 -0.01666,0.01666 -0.02498,0.02498"
|
||||
style="fill:none;stroke:#ff00ff;stroke-width:0.42426401;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g11870"
|
||||
clip-path="url(#clip10)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path11868"
|
||||
transform="matrix(0,-1.40717,1.40717,0,0.398,0.616474)"
|
||||
d="m -107.30808,32.281969 c 12.164262,12.164264 12.164262,31.88192 0,44.046184 -0.0111,0.0111 -0.025,0.02498 -0.0305,0.03609"
|
||||
style="fill:none;stroke:#0000ff;stroke-width:0.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g11874"
|
||||
clip-path="url(#clip11)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path11872"
|
||||
d="m 5.042969,46.746094 c 0,1.199218 -0.972657,2.164062 -2.164063,2.164062 -1.199218,0 -2.167968,-0.964844 -2.167968,-2.164062 0,-1.195313 0.96875,-2.167969 2.167968,-2.167969 1.191406,0 2.164063,0.972656 2.164063,2.167969 z m 0,0"
|
||||
style="fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g11878"
|
||||
clip-path="url(#clip12)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path11876"
|
||||
d="m 4.730469,107.69922 c 0,1.19531 -0.96875,2.16406 -2.167969,2.16406 -1.195312,0 -2.164062,-0.96875 -2.164062,-2.16406 0,-1.19922 0.96875,-2.16406 2.164062,-2.16406 1.199219,0 2.167969,0.96484 2.167969,2.16406 z m 0,0"
|
||||
style="fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g11882"
|
||||
clip-path="url(#clip13)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path11880"
|
||||
d="m 48.335938,151.62891 c 0,1.19921 -0.972657,2.16796 -2.167969,2.16796 -1.195313,0 -2.164063,-0.96875 -2.164063,-2.16796 0,-1.19922 0.96875,-2.16407 2.164063,-2.16407 1.195312,0 2.167969,0.96485 2.167969,2.16407 z m 0,0"
|
||||
style="fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g11886"
|
||||
clip-path="url(#clip14)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path11884"
|
||||
d="m 110,151.22266 c 0,1.1914 -0.97656,2.16406 -2.16797,2.16406 -1.19922,0 -2.16406,-0.97266 -2.16406,-2.16406 0,-1.19922 0.96484,-2.16407 2.16406,-2.16407 1.19141,0 2.16797,0.96485 2.16797,2.16407 z m 0,0"
|
||||
style="fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g11890"
|
||||
clip-path="url(#clip15)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path11888"
|
||||
d="m 153.48828,107.73047 c 0,1.19531 -0.97266,2.16797 -2.16406,2.16797 -1.19922,0 -2.16797,-0.97266 -2.16797,-2.16797 0,-1.19531 0.96875,-2.16406 2.16797,-2.16406 1.1914,0 2.16406,0.96875 2.16406,2.16406 z m 0,0"
|
||||
style="fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g11894"
|
||||
clip-path="url(#clip16)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path11892"
|
||||
d="m 153.28516,46.476562 c 0,1.199219 -0.97266,2.164063 -2.16797,2.164063 -1.19532,0 -2.16407,-0.964844 -2.16407,-2.164063 0,-1.195312 0.96875,-2.167968 2.16407,-2.167968 1.19531,0 2.16797,0.972656 2.16797,2.167968 z m 0,0"
|
||||
style="fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<path
|
||||
id="path11896"
|
||||
d="m 109.79297,3.390625 c 0,1.199219 -0.97266,2.167969 -2.16406,2.167969 -1.19922,0 -2.16407,-0.96875 -2.16407,-2.167969 0,-1.191406 0.96485,-2.164063 2.16407,-2.164063 1.1914,0 2.16406,0.972657 2.16406,2.164063 z m 0,0"
|
||||
style="fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
id="g11900"
|
||||
clip-path="url(#clip17)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path11898"
|
||||
d="m 49.148438,2.78125 c 0,1.199219 -0.96875,2.167969 -2.167969,2.167969 -1.191407,0 -2.164063,-0.96875 -2.164063,-2.167969 0,-1.195312 0.972656,-2.164062 2.164063,-2.164062 1.199219,0 2.167969,0.96875 2.167969,2.164062 z m 0,0"
|
||||
style="fill:#00ffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<path
|
||||
id="path11902"
|
||||
d="m 79.023438,76.460938 c 0,1.125 -0.910157,2.039062 -2.039063,2.039062 -1.125,0 -2.042969,-0.914062 -2.042969,-2.039062 0,-1.125 0.917969,-2.039063 2.042969,-2.039063 1.128906,0 2.039063,0.914063 2.039063,2.039063 z m 0,0"
|
||||
style="fill:#ffff00;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.35"
|
||||
inkscape:cx="104"
|
||||
inkscape:cy="106.66668"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:window-width="941"
|
||||
inkscape:window-height="728"
|
||||
inkscape:window-x="27"
|
||||
inkscape:window-y="110"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata11760">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-78.316667,-114.96667)">
|
||||
<g
|
||||
id="surface577287"
|
||||
transform="matrix(0.38805555,0,0,0.38805555,78.316667,114.96667)"
|
||||
style="stroke-width:0.90909094">
|
||||
<rect
|
||||
id="rect11907"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.90909094"
|
||||
height="160"
|
||||
width="156"
|
||||
y="0"
|
||||
x="0" />
|
||||
<use
|
||||
id="use11909"
|
||||
transform="translate(1,2)"
|
||||
xlink:href="#surface577293"
|
||||
x="0"
|
||||
y="0"
|
||||
width="100%"
|
||||
height="100%"
|
||||
style="stroke-width:0.90909094" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 197 KiB |
|
|
@ -0,0 +1,189 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="178.13605mm"
|
||||
height="68.910095mm"
|
||||
viewBox="0 0 178.13605 68.910095"
|
||||
version="1.1"
|
||||
id="svg12295"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
sodipodi:docname="spur.svg">
|
||||
<defs
|
||||
id="defs12289">
|
||||
<clipPath
|
||||
id="clip1">
|
||||
<path
|
||||
id="path12297"
|
||||
d="M 0,0 H 230.52344 V 195.35156 H 0 Z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clip1-6">
|
||||
<path
|
||||
id="path12345"
|
||||
d="M 0,0 H 230.52344 V 195.35156 H 0 Z m 0,0"
|
||||
inkscape:connector-curvature="0" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.98994949"
|
||||
inkscape:cx="393.31912"
|
||||
inkscape:cy="-47.424547"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:window-width="1068"
|
||||
inkscape:window-height="915"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="59"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata12292">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Calque 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-0.10816718,-108.91106)">
|
||||
<g
|
||||
id="surface642341"
|
||||
transform="matrix(0.35277778,0,0,0.35277778,0.10639668,108.90841)">
|
||||
<path
|
||||
id="path12302"
|
||||
d="M 157.5625,40.5 143.83594,21.382812 125.62891,37.976562 115.73047,31.703125 117.5,17.972656 98.726562,19.277344 85.234375,1.710938 73.460938,25.636719 64.550781,45.875 38.328125,46.394531 46.742188,72.242188 30.285156,94.265625 1.191406,103.9375 l 22.019532,28.69141 1.820312,39.1914 28.5625,-13.03125 16.613281,1.9375 8.199219,14.09375 11.25,-8.84765 11.09766,2.79296 5.62109,23.0586 11.73047,-17.59766 18.85156,13.75781 6.56641,-21.67187 18.30859,-10.66016 28.25781,-21.8125 39.19532,-1.82031 -13.73829,-35.152342 10.91016,-35.960938 -38.38672,2.222656 -9.23047,33.910156 -4.69531,-17.183593 -16.19531,4.875 -11.6211,-8.109375 3.55079,-9.488282 14.26562,-11.328124 -6.78516,-15.101563"
|
||||
style="fill:#ffca00;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
id="g12306"
|
||||
clip-path="url(#clip1)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path12304"
|
||||
d="m 122.10547,145.05859 21.62109,21.19922 18.02735,-10.8125 m -39.73047,-10.41015 -3.67578,28.97265 -11.51953,19.25781 -6.02735,-24.38671 22.00391,-23.53907 m -4.73828,28.70313 18.99218,13.73828 6.46485,-21.82031 M 73.5,25.515625 85.335938,1.507812 98.8125,18.859375 m 58.85156,21.441406 -13.72656,-19.121093 -18.20703,16.59375 -9.54297,-6.1875 1.11719,-13.863282 L 98.609375,18.921875 90.589844,54.84375 73.621094,25.347656 65.625,45.621094 79.085938,88.359375 M 157.66406,40.300781 125.33984,65.351562 V 37.066406 M 79.277344,88.382812 c 0.808594,-2.019531 11.3125,-33.539062 11.3125,-33.539062 l 34.749996,10.507812 -5.89453,32.410157 m 27.10547,-20.894531 10.3125,7.703124 17.27734,-4.601562 5.03907,17.808594 -30.50782,23.031246 -26.5664,24.54688 -28.082032,-14.94922 -34.734376,-9.89844 -5.828124,38.07813 m 134.710932,-95.859378 -8.71875,35.171876 36.19532,-1.234376 m -36.16797,1.046876 10.30469,36.128902 39.60156,-2.01953 -13.73828,-35.156248 10.90625,-35.960937 -38.38282,1.617187 M 157.46094,40.5 l 6.47265,15.675781 -13.99609,11.109375 -3.78906,9.984375 -26.66797,20.8125 28.6875,22.828129 13.33594,34.75 29.08984,-22.22657 M 30.121094,93.207031 59.882812,120.70703 78.941406,87.644531 m -19.464844,32.660159 -36.363281,11.71484 2.019531,39.60156 28.09375,-13.03515 17.910157,1.39453 L 93.925781,130.875 119.27734,98.28125 79.679688,88.382812 47.425781,73.765625 30.382812,92.734375 1.292969,103.73828 23.515625,132.82812"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<path
|
||||
id="path12308"
|
||||
d="M 47.5625,74.199219 38.914062,46.246094 64.867188,46.578125"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12310"
|
||||
d="M 70.105469,160.38281 78.578125,176.61719 89.636719,166.5 94.578125,130.96875"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12312"
|
||||
d="m 90.109375,166.02734 9.882813,2.82422"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12314"
|
||||
d="m 147.52344,121.32031 9.88281,-37.41406"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12316"
|
||||
d="m 124.93359,65.199219 25.41407,1.644531"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12318"
|
||||
d="M 91.519531,54.136719 116.22656,31.546875"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12320"
|
||||
d="m 198.58594,178.66016 3.49218,-26.7461 -12.58593,-18.94531 -28.08203,22.02344 -17.77735,10.5039 -22.39062,-21.20312 -24.566409,-12.86328 -26.242187,28.33984 21.648437,-30.35937 27.703129,-31.480472 5.66406,-32.839844 32.125,-25.457032 28.1875,7.671876 24.61328,-13.011719"
|
||||
style="fill:none;stroke:#0000ff;stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12322"
|
||||
d="M 91.65625,129.94141 70.195312,160.39062 97.148438,130.9375"
|
||||
style="fill:none;stroke:#ff0000;stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="surface649249"
|
||||
transform="matrix(0.35277778,0,0,0.35277778,96.920673,108.90841)">
|
||||
<path
|
||||
id="path12350"
|
||||
d="M 157.5625,40.5 143.83594,21.382812 125.62891,37.976562 115.73047,31.703125 117.5,17.972656 98.726562,19.277344 85.234375,1.710938 73.460938,25.636719 64.550781,45.875 38.328125,46.394531 46.742188,72.242188 30.285156,94.265625 1.191406,103.9375 l 22.019532,28.69141 1.820312,39.1914 28.5625,-13.03125 16.613281,1.9375 8.199219,14.09375 11.25,-8.84765 11.09766,2.79296 5.62109,23.0586 11.73047,-17.59766 18.85156,13.75781 6.56641,-21.67187 18.30859,-10.66016 28.25781,-21.8125 39.19532,-1.82031 -13.73829,-35.152342 10.91016,-35.960938 -38.38672,2.222656 -9.23047,33.910156 -4.69531,-17.183593 -16.19531,4.875 -11.6211,-8.109375 3.55079,-9.488282 14.26562,-11.328124 -6.78516,-15.101563"
|
||||
style="fill:#ffca00;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
id="g12354"
|
||||
clip-path="url(#clip1-6)"
|
||||
style="clip-rule:nonzero">
|
||||
<path
|
||||
id="path12352"
|
||||
d="m 122.10547,145.05859 21.62109,21.19922 18.02735,-10.8125 m -39.73047,-10.41015 -3.67578,28.97265 -11.51953,19.25781 -6.02735,-24.38671 22.00391,-23.53907 m -4.73828,28.70313 18.99218,13.73828 6.46485,-21.82031 M 73.5,25.515625 85.335938,1.507812 98.8125,18.859375 m 58.85156,21.441406 -13.72656,-19.121093 -18.20703,16.59375 -9.54297,-6.1875 1.11719,-13.863282 L 98.609375,18.921875 90.589844,54.84375 73.621094,25.347656 65.625,45.621094 79.085938,88.359375 M 157.66406,40.300781 125.33984,65.351562 V 37.066406 M 79.277344,88.382812 c 0.808594,-2.019531 11.3125,-33.539062 11.3125,-33.539062 l 34.749996,10.507812 -5.89453,32.410157 m 27.10547,-20.894531 10.3125,7.703124 17.27734,-4.601562 5.03907,17.808594 -30.50782,23.031246 -26.5664,24.54688 -28.082032,-14.94922 -34.734376,-9.89844 -5.828124,38.07813 m 134.710932,-95.859378 -8.71875,35.171876 36.19532,-1.234376 m -36.16797,1.046876 10.30469,36.128902 39.60156,-2.01953 -13.73828,-35.156248 10.90625,-35.960937 -38.38282,1.617187 M 157.46094,40.5 l 6.47265,15.675781 -13.99609,11.109375 -3.78906,9.984375 -26.66797,20.8125 28.6875,22.828129 13.33594,34.75 29.08984,-22.22657 M 30.121094,93.207031 59.882812,120.70703 78.941406,87.644531 m -19.464844,32.660159 -36.363281,11.71484 2.019531,39.60156 28.09375,-13.03515 17.910157,1.39453 L 93.925781,130.875 119.27734,98.28125 79.679688,88.382812 47.425781,73.765625 30.382812,92.734375 1.292969,103.73828 23.515625,132.82812"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<path
|
||||
id="path12356"
|
||||
d="M 47.5625,74.199219 38.914062,46.246094 64.867188,46.578125"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12358"
|
||||
d="M 70.105469,160.38281 78.578125,176.61719 89.636719,166.5 94.578125,130.96875"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12360"
|
||||
d="m 90.109375,166.02734 9.882813,2.82422"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12362"
|
||||
d="m 147.52344,121.32031 9.88281,-37.41406"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12364"
|
||||
d="m 124.93359,65.199219 25.41407,1.644531"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12366"
|
||||
d="M 91.519531,54.136719 116.22656,31.546875"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path12368"
|
||||
d="m 198.91406,178.82812 3.49219,-26.74218 -12.58203,-18.94532 -28.08203,22.01954 -17.78125,10.50781 -22.38672,-21.20703 -26.69922,-13.53907 25.23828,-32.824214 5.66797,-32.839844 32.12109,-25.457031 28.1875,7.671875 24.61328,-13.007812"
|
||||
style="fill:none;stroke:#0000ff;stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
|
@ -0,0 +1,48 @@
|
|||
cmake_minimum_required(VERSION 3.1...3.15)
|
||||
project(Surface_mesh_topology_Examples)
|
||||
|
||||
if(NOT POLICY CMP0070 AND POLICY CMP0053)
|
||||
# Only set CMP0053 to OLD with CMake<3.10, otherwise there is a warning.
|
||||
cmake_policy(SET CMP0053 OLD)
|
||||
endif()
|
||||
|
||||
if(POLICY CMP0071)
|
||||
cmake_policy(SET CMP0071 NEW)
|
||||
endif()
|
||||
|
||||
find_package(CGAL QUIET COMPONENTS Qt5)
|
||||
if(CGAL_Qt5_FOUND)
|
||||
add_definitions(-DCGAL_USE_BASIC_VIEWER -DQT_NO_KEYWORDS)
|
||||
endif()
|
||||
|
||||
if ( NOT CGAL_FOUND )
|
||||
message(FATAL_ERROR "This program requires the CGAL library, and will not be compiled.")
|
||||
endif()
|
||||
|
||||
# add_definitions(-DCGAL_TRACE_PATH_TESTS)
|
||||
# add_definitions(-DCGAL_TRACE_CMAP_TOOLS)
|
||||
# add_definitions("-Wall -Wextra")
|
||||
# add_definitions("-D_GLIBCXX_DEBUG")
|
||||
|
||||
set(SOURCE_FILES
|
||||
basic_example_surface_mesh_topology.cpp
|
||||
basic_example_torus.cpp
|
||||
map_2_constructor.cpp
|
||||
open_path_homotopy.cpp
|
||||
path_homotopy.cpp
|
||||
path_homotopy_with_symbols.cpp
|
||||
path_homotopy_with_symbols_2.cpp
|
||||
surface_mesh_topology_with_sm_and_polyhedron.cpp
|
||||
)
|
||||
|
||||
foreach(cppfile ${SOURCE_FILES})
|
||||
create_single_source_cgal_program("${cppfile}")
|
||||
endforeach()
|
||||
|
||||
if(CGAL_Qt5_FOUND)
|
||||
target_link_libraries(basic_example_surface_mesh_topology PUBLIC CGAL::CGAL_Qt5)
|
||||
target_link_libraries(basic_example_torus PUBLIC CGAL::CGAL_Qt5)
|
||||
target_link_libraries(open_path_homotopy PUBLIC CGAL::CGAL_Qt5)
|
||||
target_link_libraries(path_homotopy PUBLIC CGAL::CGAL_Qt5)
|
||||
target_link_libraries(surface_mesh_topology_with_sm_and_polyhedron PUBLIC CGAL::CGAL_Qt5)
|
||||
endif()
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
#include <CGAL/Linear_cell_complex_for_combinatorial_map.h>
|
||||
#include <CGAL/Linear_cell_complex_constructors.h>
|
||||
#include <CGAL/Curves_on_surface_topology.h>
|
||||
#include <CGAL/Path_on_surface.h>
|
||||
#include <CGAL/draw_face_graph_with_paths.h>
|
||||
|
||||
typedef CGAL::Linear_cell_complex_for_combinatorial_map<2,3> LCC_3_cmap;
|
||||
using namespace CGAL::Surface_mesh_topology;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
void create_path_1(Path_on_surface<LCC_3_cmap>& p)
|
||||
{
|
||||
p.push_back_by_index(14); // Its starting dart
|
||||
for (int i=0; i<7; ++i)
|
||||
{ p.extend_positive_turn(2); } // Extend the path
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
void create_path_2(Path_on_surface<LCC_3_cmap>& p)
|
||||
{ p.push_back_by_index({202, 206, 335, 317, 322, 69, 62, 414}); }
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
void create_path_3(Path_on_surface<LCC_3_cmap>& p)
|
||||
{
|
||||
p.push_back_by_index(470); // Its starting dart
|
||||
for (int i=0; i<13; ++i)
|
||||
{ p.extend_positive_turn(2); } // Extend the path
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
int main()
|
||||
{
|
||||
LCC_3_cmap lcc;
|
||||
if (!CGAL::load_off(lcc, "data/double-torus.off"))
|
||||
{
|
||||
std::cout<<"ERROR reading file data/double-torus.off"<<std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
Curves_on_surface_topology<LCC_3_cmap> cst(lcc);
|
||||
Path_on_surface<LCC_3_cmap> p1(lcc), p2(lcc), p3(lcc);
|
||||
create_path_1(p1);
|
||||
create_path_2(p2);
|
||||
create_path_3(p3);
|
||||
|
||||
bool res1=cst.is_contractible(p1);
|
||||
std::cout<<"Path p1 (pink) "<<(res1?"IS":"IS NOT")
|
||||
<<" contractible."<<std::endl;
|
||||
|
||||
bool res2=cst.are_freely_homotopic(p1, p2);
|
||||
std::cout<<"Path p1 (pink) "<<(res2?"IS":"IS NOT")
|
||||
<<" homotopic with path p2 (green)."<<std::endl;
|
||||
|
||||
bool res3=cst.are_freely_homotopic(p1, p3);
|
||||
std::cout<<"Path p1 (pink) "<<(res3?"IS":"IS NOT")
|
||||
<<" homotopic with path p3 (orange)."<<std::endl;
|
||||
|
||||
#ifdef CGAL_USE_BASIC_VIEWER
|
||||
std::vector<Path_on_surface<LCC_3_cmap> > paths={p1, p2, p3};
|
||||
CGAL::draw(lcc, paths); // Enable only if CGAL was compiled with Qt5
|
||||
#endif // CGAL_USE_BASIC_VIEWER
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
#include <CGAL/Linear_cell_complex_for_combinatorial_map.h>
|
||||
#include <CGAL/Linear_cell_complex_constructors.h>
|
||||
#include <CGAL/Curves_on_surface_topology.h>
|
||||
#include <CGAL/Path_on_surface.h>
|
||||
#include <CGAL/draw_face_graph_with_paths.h>
|
||||
|
||||
typedef CGAL::Linear_cell_complex_for_combinatorial_map<2,3> LCC_3_cmap;
|
||||
using namespace CGAL::Surface_mesh_topology;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
void create_path_1(Path_on_surface<LCC_3_cmap>& p)
|
||||
{
|
||||
p.push_back_by_index(0); // Its starting dart
|
||||
for (int i=0; i<4; ++i)
|
||||
{ p.extend_positive_turn(2); } // Extend the path
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
void create_path_2(Path_on_surface<LCC_3_cmap>& p)
|
||||
{
|
||||
p.push_back_by_index(1); // Its starting dart
|
||||
for (int i=0; i<4; ++i)
|
||||
{ p.extend_positive_turn(2); } // Extend the path
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
int main()
|
||||
{
|
||||
LCC_3_cmap lcc;
|
||||
if (!CGAL::load_off(lcc, "data/torus_quad.off"))
|
||||
{
|
||||
std::cout<<"ERROR reading file data/torus_quad.off"<<std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
Curves_on_surface_topology<LCC_3_cmap> cst(lcc);
|
||||
Path_on_surface<LCC_3_cmap> p1(lcc), p2(lcc);
|
||||
create_path_1(p1);
|
||||
create_path_2(p2);
|
||||
|
||||
bool res1=cst.is_contractible(p1);
|
||||
std::cout<<"Path p1 (pink) "<<(res1?"IS":"IS NOT")
|
||||
<<" contractible."<<std::endl;
|
||||
|
||||
bool res2=cst.are_freely_homotopic(p1, p2);
|
||||
std::cout<<"Path p1 (pink) "<<(res2?"IS":"IS NOT")
|
||||
<<" homotopic with path p2 (green)."<<std::endl;
|
||||
|
||||
#ifdef CGAL_USE_BASIC_VIEWER
|
||||
std::vector<Path_on_surface<LCC_3_cmap> > paths={p1, p2};
|
||||
CGAL::draw(lcc, paths); // Enable only if CGAL was compiled with Qt5
|
||||
#endif // CGAL_USE_BASIC_VIEWER
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
OFF
|
||||
19 23 0
|
||||
-0.32821 0.728949 0.785375
|
||||
-0.253234 0.54351 0.0549907
|
||||
-0.844014 0.631231 -0.911234
|
||||
-1.50977 0.904391 -1.14708
|
||||
-0.390354 -0.366081 -0.611454
|
||||
-0.60245 -1.09023 -0.547515
|
||||
-0.888454 0.366475 0.427312
|
||||
-1.47923 0.454195 -0.538913
|
||||
-1.02557 -0.543117 -0.239133
|
||||
1.3173 0.119589 -0.65761
|
||||
0.876658 -0.199807 -0.131025
|
||||
-0.083217 -0.804717 -0.0759778
|
||||
0.053903 0.104874 0.590467
|
||||
0.569521 0.23883 -0.666502
|
||||
0.938527 -0.503249 0.961862
|
||||
1.44104 -0.487296 1.52816
|
||||
1.25068 0.439809 0.0253912
|
||||
0.427929 0.74449 0.746884
|
||||
1.31255 0.136367 1.11828
|
||||
4 0 1 2 3
|
||||
4 3 2 4 5
|
||||
4 1 6 7 2
|
||||
4 2 7 8 4
|
||||
4 4 8 6 1
|
||||
4 6 0 3 7
|
||||
4 7 3 5 8
|
||||
4 8 5 0 6
|
||||
4 9 10 11 5
|
||||
4 5 11 12 0
|
||||
4 10 13 4 11
|
||||
4 11 4 1 12
|
||||
4 12 1 13 10
|
||||
4 13 9 5 4
|
||||
4 1 0 9 13
|
||||
4 0 12 14 15
|
||||
4 15 14 10 9
|
||||
4 10 16 17 12
|
||||
4 12 17 18 14
|
||||
4 14 18 16 10
|
||||
4 16 9 0 17
|
||||
4 17 0 15 18
|
||||
4 18 15 9 16
|
||||
|
|
@ -0,0 +1,431 @@
|
|||
OFF
|
||||
228 201 0
|
||||
1.62473 1.92519 0.645116
|
||||
1.59856 2.45453 0.105686
|
||||
1.36768 2.78362 0.507687
|
||||
1.44616 2.17973 0.956047
|
||||
2.17131 1.2071 0.731432
|
||||
1.62939 1.58636 0.364889
|
||||
2.16529 1.64517 1.09374
|
||||
2.90357 1.7785 1.18875
|
||||
2.54642 2.28757 1.81061
|
||||
2.92369 2.93613 1.71623
|
||||
3.40711 2.24707 0.874502
|
||||
2.57252 0.388793 0.240254
|
||||
1.95128 0.746801 0.480583
|
||||
2.91289 1.10083 0.628296
|
||||
3.41972 1.32982 0.115897
|
||||
3.38094 2.77641 0.335073
|
||||
3.39492 1.75991 -0.50561
|
||||
2.11625 -0.453389 -0.597175
|
||||
1.94988 -0.216593 0.101481
|
||||
2.95902 0.366033 -0.409339
|
||||
0.778032 -0.784465 -1.08886
|
||||
1.05833 -0.966152 -0.410409
|
||||
1.95041 -0.216224 -1.29583
|
||||
-1.05316 0.711603 -0.210338
|
||||
-1.28047 0.320835 -0.153469
|
||||
-0.980005 -0.0806305 -0.505709
|
||||
-0.97055 -0.110718 -0.522061
|
||||
-0.571926 -0.261335 -0.874081
|
||||
-0.418901 0.471953 -0.770442
|
||||
-0.672026 1.354 0.506539
|
||||
-1.41031 1.22067 0.411524
|
||||
-0.441144 1.02491 0.104538
|
||||
-0.136133 1.41281 1.23539
|
||||
-0.678049 1.79208 0.868843
|
||||
-0.131474 1.07398 0.955159
|
||||
0.108702 1.44301 2.10774
|
||||
0.034051 1.76883 1.42941
|
||||
-0.111327 0.982712 1.85689
|
||||
0.344842 2.07115 2.89611
|
||||
0.511204 1.83436 2.19745
|
||||
-0.277795 1.46577 2.75733
|
||||
1.00166 3.15596 2.99873
|
||||
1.12643 2.44998 2.75813
|
||||
-0.0562639 2.6432 3.1855
|
||||
1.89383 3.89949 2.10802
|
||||
2.06519 3.26051 2.47436
|
||||
0.715229 3.78364 2.68913
|
||||
1.49846 4.06987 1.48631
|
||||
2.35696 3.74549 0.728177
|
||||
2.84521 3.54002 1.26787
|
||||
-0.0555178 2.64372 1.2094
|
||||
0.34537 2.07152 1.49879
|
||||
0.736163 2.26094 1.4298
|
||||
0.449736 2.88861 1.1202
|
||||
-1.90166 1.23926 2.10589
|
||||
-1.90141 1.221 2.09078
|
||||
-1.92107 1.27736 1.16019
|
||||
-1.92646 1.66935 1.48438
|
||||
-1.35974 0.859992 2.47243
|
||||
-0.618163 0.753727 2.36929
|
||||
-0.608846 0.076062 1.80884
|
||||
-1.04378 -0.00248243 1.75286
|
||||
-1.0988 0.14376 1.8749
|
||||
-1.32934 0.452132 2.1346
|
||||
-1.35435 0.467997 2.14823
|
||||
2.3923 1.1754 -1.39739
|
||||
2.88437 0.691855 -1.08767
|
||||
2.853 2.13918 -0.872153
|
||||
2.11142 2.24544 -0.769017
|
||||
1.60459 2.01646 -0.256618
|
||||
1.38456 1.55616 -0.507466
|
||||
1.77106 1.5334 -1.15706
|
||||
1.14842 0.928019 -1.29583
|
||||
1.54952 0.355974 -1.58522
|
||||
0.982056 1.16481 -0.597175
|
||||
0.476802 0.919923 -0.507977
|
||||
0.366832 0.549191 -1.15785
|
||||
1.45921 1.23034 0.170868
|
||||
1.14789 0.927649 0.101481
|
||||
1.54878 0.355452 0.390874
|
||||
1.04352 0.11056 0.480072
|
||||
0.757098 0.738236 0.170472
|
||||
0.53559 0.0606295 0.730511
|
||||
0.125578 0.21555 1.09259
|
||||
0.0471035 0.819441 0.644228
|
||||
0.364231 0.699617 0.364176
|
||||
1.1683 -0.595421 0.239464
|
||||
0.382565 -0.672659 0.626872
|
||||
-0.00520413 -1.0707 0.113969
|
||||
-0.403829 -0.92008 0.46599
|
||||
-0.405416 -0.901236 0.496048
|
||||
-0.620442 -0.621786 0.997254
|
||||
-0.25169 -0.433009 1.18697
|
||||
-0.105304 0.544637 1.49459
|
||||
-0.653543 -0.51838 1.12035
|
||||
-1.39111 2.30732 2.68795
|
||||
-0.899037 1.82378 2.99766
|
||||
-1.46576 2.63314 2.00961
|
||||
-0.622986 3.45256 2.19745
|
||||
-0.457151 3.2154 2.89611
|
||||
-1.41963 1.89834 0.971979
|
||||
-1.07926 2.61038 1.36002
|
||||
-0.45802 2.25237 1.11969
|
||||
-0.456624 3.21576 1.49879
|
||||
0.324963 3.59459 1.36081
|
||||
0.434933 3.96532 2.01068
|
||||
0.957671 2.93854 0.869764
|
||||
1.1107 3.67183 0.973404
|
||||
-0.031132 0.869992 -0.257539
|
||||
0.491605 -0.156789 -1.39846
|
||||
1.12903 2.29956 1.2361
|
||||
1.74495 3.43218 0.413301
|
||||
2.10211 2.92311 -0.208562
|
||||
2.84039 3.05644 -0.113547
|
||||
-0.400567 -0.900322 -0.507746
|
||||
-0.446838 -0.882839 -0.466885
|
||||
-0.396754 -0.907847 -0.229717
|
||||
-0.561015 -0.673257 -0.516099
|
||||
-1.70695 0.944633 0.59665
|
||||
-1.3247 0.440138 -0.0497789
|
||||
-1.90392 1.27273 1.13283
|
||||
-1.74516 1.06687 0.748005
|
||||
1.01646 2.07925 2.10825
|
||||
1.91216 2.52722 2.37072
|
||||
-2.23628 -0.701564 0.707986
|
||||
-2.26637 -0.154647 0.171488
|
||||
-2.52431 0.161632 0.57852
|
||||
-2.43579 -0.456935 1.02281
|
||||
-1.94973 -0.658965 1.58028
|
||||
-2.38146 -0.524773 1.93784
|
||||
-2.0187 -0.118527 2.47749
|
||||
-1.35085 -0.32611 1.92438
|
||||
-1.65871 -1.41097 0.797358
|
||||
-2.2107 -1.03858 0.417248
|
||||
-1.69178 -0.975244 1.17325
|
||||
-0.951822 -0.815367 1.29474
|
||||
-1.2075 -2.2147 0.295123
|
||||
-1.85706 -1.87983 0.527054
|
||||
-0.900662 -1.4894 0.713261
|
||||
-0.38062 -1.22792 0.21422
|
||||
-1.61356 -3.06634 -0.584539
|
||||
-1.81155 -2.84761 0.123141
|
||||
-0.795936 -2.20965 -0.351752
|
||||
-2.94201 -3.4398 -1.13026
|
||||
-2.67155 -3.6283 -0.438035
|
||||
-1.76955 -2.81704 -1.29261
|
||||
-4.33495 -2.96364 -0.94302
|
||||
-4.14862 -3.61261 -0.579731
|
||||
-3.24614 -2.80771 -1.4398
|
||||
-4.87804 -2.00991 -0.265205
|
||||
-5.23892 -2.68267 -0.19436
|
||||
-4.21019 -2.2175 -0.818312
|
||||
-4.53711 -1.36078 0.485927
|
||||
-5.27707 -1.52065 0.364442
|
||||
-4.27916 -1.67706 0.0788946
|
||||
-4.01819 -1.29744 1.24193
|
||||
-4.57018 -0.925055 0.861821
|
||||
-3.99261 -1.63446 0.951193
|
||||
-3.79724 -1.27678 2.13389
|
||||
-3.86477 -0.934793 1.451
|
||||
-3.99559 -1.74565 1.86358
|
||||
-3.60475 -0.648909 2.95275
|
||||
-3.40675 -0.867637 2.24507
|
||||
-4.2088 -1.28183 2.78076
|
||||
-2.98275 0.471686 3.09898
|
||||
-2.82311 -0.233732 2.84451
|
||||
-4.04074 -0.0902782 3.24548
|
||||
-2.08027 1.27659 2.23891
|
||||
-1.89394 0.627623 2.6022
|
||||
-3.28688 1.10378 2.78944
|
||||
-2.46853 1.44822 1.60043
|
||||
-3.98134 -0.0470402 1.2433
|
||||
-3.56274 -0.618335 1.53699
|
||||
-3.17192 -0.410747 1.48287
|
||||
-3.47605 0.221349 1.17333
|
||||
-1.37052 -1.38906 -1.35352
|
||||
-0.863465 -1.86766 -1.03464
|
||||
-0.955208 -0.407325 -0.787544
|
||||
-1.71325 -0.328896 -0.703447
|
||||
-2.23329 -0.59037 -0.204406
|
||||
-2.43165 -1.05924 -0.47471
|
||||
-2.02009 -1.0542 -1.12159
|
||||
-2.62414 -1.68711 -1.29357
|
||||
-2.18815 -2.24574 -1.5863
|
||||
-2.82214 -1.46838 -0.585887
|
||||
-3.32743 -1.73677 -0.515917
|
||||
-3.40578 -2.10229 -1.18533
|
||||
-2.36412 -1.40123 0.208179
|
||||
-2.66615 -1.71769 0.122188
|
||||
-2.24755 -2.28898 0.415877
|
||||
-2.75284 -2.55737 0.485847
|
||||
-3.05697 -1.92527 0.176307
|
||||
-3.45917 -1.98288 0.359816
|
||||
-3.84743 -1.81125 -0.27866
|
||||
-3.27284 -2.63185 0.723104
|
||||
-3.70458 -2.49765 1.08066
|
||||
-3.7931 -1.87909 0.636369
|
||||
-2.59319 -3.26279 0.231378
|
||||
-3.3976 -3.37799 0.598396
|
||||
-3.76036 -3.78424 0.0587442
|
||||
-4.66433 -3.50327 0.807404
|
||||
-4.06545 -3.17041 1.1515
|
||||
-4.46448 -2.68115 1.78115
|
||||
-3.96252 -2.18138 1.48769
|
||||
-5.20443 -2.84103 1.65966
|
||||
-5.27368 -1.9287 2.44672
|
||||
-4.51564 -2.00713 2.36263
|
||||
-5.1504 -3.30124 0.249929
|
||||
-5.74894 -2.56735 1.1944
|
||||
-5.36542 -0.468358 2.69382
|
||||
-4.85836 -0.946965 3.0127
|
||||
-5.82568 -1.55631 2.06661
|
||||
-5.43295 -0.126368 2.01093
|
||||
-5.84827 -1.1081 1.44496
|
||||
-5.32823 -0.846626 0.945918
|
||||
-5.02139 -0.121326 1.36406
|
||||
-4.37183 -0.456187 1.13212
|
||||
-4.41734 0.511591 1.53604
|
||||
-4.61533 0.730319 2.24372
|
||||
-3.6357 0.926767 1.4278
|
||||
-3.55734 1.29228 2.09721
|
||||
-2.95605 0.295824 0.936075
|
||||
-2.83129 1.04197 1.06078
|
||||
-2.76972 -0.353144 1.29936
|
||||
-2.90146 -0.599248 2.1751
|
||||
-2.16344 0.83439 0.507675
|
||||
-1.76441 0.345132 -0.121971
|
||||
-5.77902 -2.02043 0.6579
|
||||
4 0 1 2 3
|
||||
4 4 5 0 6
|
||||
4 7 8 9 10
|
||||
4 11 12 4 13
|
||||
4 14 10 15 16
|
||||
4 17 18 11 19
|
||||
4 20 21 17 22
|
||||
6 23 24 25 26 27 28
|
||||
4 29 30 23 31
|
||||
4 32 33 29 34
|
||||
4 35 36 32 37
|
||||
4 38 39 35 40
|
||||
4 41 42 38 43
|
||||
4 44 45 41 46
|
||||
4 47 48 49 44
|
||||
4 50 51 52 53
|
||||
4 54 55 56 57
|
||||
7 58 59 60 61 62 63 64
|
||||
4 65 66 16 67
|
||||
4 68 69 70 71
|
||||
4 65 67 68 71
|
||||
4 72 73 65 71
|
||||
4 74 75 76 72
|
||||
4 70 74 72 71
|
||||
4 74 70 77 78
|
||||
4 78 79 80 81
|
||||
4 75 74 78 81
|
||||
4 82 83 84 85
|
||||
4 80 82 85 81
|
||||
4 82 80 86 87
|
||||
6 87 88 89 90 91 92
|
||||
4 83 82 87 92
|
||||
4 60 93 83 92
|
||||
5 92 91 94 61 60
|
||||
4 58 64 55 54
|
||||
4 95 96 58 54
|
||||
4 97 98 99 95
|
||||
4 57 97 95 54
|
||||
4 97 57 100 101
|
||||
4 101 102 50 103
|
||||
4 98 97 101 103
|
||||
4 104 105 98 103
|
||||
4 53 104 103 50
|
||||
4 104 53 106 107
|
||||
4 105 104 107 47
|
||||
4 46 105 47 44
|
||||
4 99 98 105 46
|
||||
4 43 99 46 41
|
||||
4 96 95 99 43
|
||||
4 40 96 43 38
|
||||
4 59 58 96 40
|
||||
4 37 59 40 35
|
||||
4 93 60 59 37
|
||||
4 34 93 37 32
|
||||
4 84 83 93 34
|
||||
4 28 108 31 23
|
||||
4 73 72 76 109
|
||||
4 22 73 109 20
|
||||
4 66 65 73 22
|
||||
4 19 66 22 17
|
||||
4 14 16 66 19
|
||||
4 13 14 19 11
|
||||
4 7 10 14 13
|
||||
4 6 7 13 4
|
||||
4 106 53 52 110
|
||||
4 2 106 110 3
|
||||
4 107 106 2 111
|
||||
4 48 47 107 111
|
||||
4 112 68 67 113
|
||||
4 112 113 48 111
|
||||
4 112 111 2 1
|
||||
4 69 68 112 1
|
||||
4 69 1 0 5
|
||||
4 77 70 69 5
|
||||
4 77 5 4 12
|
||||
4 79 78 77 12
|
||||
4 79 12 11 18
|
||||
4 86 80 79 18
|
||||
4 86 18 17 21
|
||||
4 88 87 86 21
|
||||
4 88 21 20 114
|
||||
5 88 114 115 116 89
|
||||
5 27 26 117 115 114
|
||||
5 30 118 119 24 23
|
||||
7 100 57 56 120 121 118 30
|
||||
4 100 30 29 33
|
||||
4 102 101 100 33
|
||||
4 102 33 32 36
|
||||
4 51 50 102 36
|
||||
4 51 36 35 39
|
||||
4 122 52 51 39
|
||||
4 122 39 38 42
|
||||
4 123 42 41 45
|
||||
4 9 8 123 45
|
||||
4 9 45 44 49
|
||||
4 15 10 9 49
|
||||
4 15 49 48 113
|
||||
4 67 16 15 113
|
||||
4 124 125 126 127
|
||||
4 128 129 130 131
|
||||
4 132 133 124 134
|
||||
5 135 131 62 61 94
|
||||
4 136 137 132 138
|
||||
4 139 90 89 116
|
||||
4 140 141 136 142
|
||||
4 143 144 140 145
|
||||
4 146 147 143 148
|
||||
4 149 150 146 151
|
||||
4 152 153 149 154
|
||||
4 155 156 152 157
|
||||
4 158 159 155 160
|
||||
4 161 162 158 163
|
||||
4 164 165 161 166
|
||||
4 167 168 164 169
|
||||
5 170 120 56 55 167
|
||||
4 171 172 173 174
|
||||
5 175 176 115 117 177
|
||||
4 178 179 180 181
|
||||
4 175 177 178 181
|
||||
4 182 183 175 181
|
||||
4 184 185 186 182
|
||||
4 180 184 182 181
|
||||
4 184 180 187 188
|
||||
4 188 189 190 191
|
||||
4 185 184 188 191
|
||||
4 192 193 185 191
|
||||
4 194 195 196 192
|
||||
4 190 194 192 191
|
||||
4 194 190 197 198
|
||||
4 198 199 200 201
|
||||
4 195 194 198 201
|
||||
4 202 203 195 201
|
||||
4 204 205 206 202
|
||||
4 200 204 202 201
|
||||
4 204 200 207 208
|
||||
4 209 210 205 211
|
||||
4 212 213 214 215
|
||||
4 215 216 171 217
|
||||
4 218 212 215 217
|
||||
4 219 220 218 217
|
||||
4 174 219 217 171
|
||||
4 219 174 221 222
|
||||
4 220 219 222 170
|
||||
4 169 220 170 167
|
||||
4 163 210 166 161
|
||||
4 206 205 210 163
|
||||
4 160 206 163 158
|
||||
4 203 202 206 160
|
||||
4 157 203 160 155
|
||||
4 196 195 203 157
|
||||
4 154 196 157 152
|
||||
4 193 192 196 154
|
||||
4 151 193 154 149
|
||||
4 186 185 193 151
|
||||
4 148 186 151 146
|
||||
4 183 182 186 148
|
||||
4 145 183 148 143
|
||||
4 176 175 183 145
|
||||
4 142 176 145 140
|
||||
5 139 116 115 176 142
|
||||
4 138 139 142 136
|
||||
6 135 94 91 90 139 138
|
||||
4 134 135 138 132
|
||||
4 128 131 135 134
|
||||
4 127 128 134 124
|
||||
4 129 128 127 223
|
||||
4 223 173 224 129
|
||||
4 221 174 173 223
|
||||
4 126 221 223 127
|
||||
4 222 221 126 225
|
||||
5 170 222 225 121 120
|
||||
6 226 178 177 25 24 119
|
||||
5 226 119 118 121 225
|
||||
4 226 225 126 125
|
||||
4 179 178 226 125
|
||||
4 179 125 124 133
|
||||
4 187 180 179 133
|
||||
4 187 133 132 137
|
||||
4 189 188 187 137
|
||||
4 189 137 136 141
|
||||
4 197 190 189 141
|
||||
4 197 141 140 144
|
||||
4 199 198 197 144
|
||||
4 199 144 143 147
|
||||
4 207 200 199 147
|
||||
4 207 147 146 150
|
||||
4 227 208 207 150
|
||||
4 227 150 149 153
|
||||
4 214 213 227 153
|
||||
4 214 153 152 156
|
||||
4 216 215 214 156
|
||||
4 216 156 155 159
|
||||
4 172 171 216 159
|
||||
4 172 159 158 162
|
||||
4 224 173 172 162
|
||||
4 224 162 161 165
|
||||
4 130 129 224 165
|
||||
4 130 165 164 168
|
||||
5 131 130 168 63 62
|
||||
5 167 55 64 63 168
|
||||
4 177 117 26 25
|
||||
|
|
@ -0,0 +1,453 @@
|
|||
OFF
|
||||
231 220 0
|
||||
-0.955208 -0.407325 -0.787544
|
||||
-2.08027 1.27659 2.23891
|
||||
-1.89394 0.627623 2.6022
|
||||
-1.35085 -0.32611 1.92438
|
||||
-2.0187 -0.118527 2.47749
|
||||
-2.98275 0.471686 3.09898
|
||||
-2.82311 -0.233732 2.84451
|
||||
-2.38146 -0.524773 1.93784
|
||||
-2.90146 -0.599248 2.1751
|
||||
-3.60475 -0.648909 2.95275
|
||||
-3.40675 -0.867637 2.24507
|
||||
-3.17192 -0.410747 1.48287
|
||||
-3.56274 -0.618335 1.53699
|
||||
-3.79724 -1.27678 2.13389
|
||||
-3.86477 -0.934793 1.451
|
||||
-3.98134 -0.0470402 1.2433
|
||||
-4.37183 -0.456187 1.13212
|
||||
-4.01819 -1.29744 1.24193
|
||||
-4.57018 -0.925055 0.861821
|
||||
-5.02139 -0.121326 1.36406
|
||||
-5.32823 -0.846626 0.945918
|
||||
-4.53711 -1.36078 0.485927
|
||||
-5.27707 -1.52065 0.364442
|
||||
-5.84827 -1.1081 1.44496
|
||||
-5.77902 -2.02043 0.6579
|
||||
-4.87804 -2.00991 -0.265205
|
||||
-5.23892 -2.68267 -0.19436
|
||||
-5.74894 -2.56735 1.1944
|
||||
-5.1504 -3.30124 0.249929
|
||||
-4.33495 -2.96364 -0.94302
|
||||
-4.14862 -3.61261 -0.579731
|
||||
-4.66433 -3.50327 0.807404
|
||||
-3.76036 -3.78424 0.0587442
|
||||
-2.94201 -3.4398 -1.13026
|
||||
-2.67155 -3.6283 -0.438035
|
||||
-3.3976 -3.37799 0.598396
|
||||
-2.59319 -3.26279 0.231378
|
||||
-1.61356 -3.06634 -0.584539
|
||||
-1.81155 -2.84761 0.123141
|
||||
-2.75284 -2.55737 0.485847
|
||||
-2.24755 -2.28898 0.415877
|
||||
-1.2075 -2.2147 0.295123
|
||||
-1.85706 -1.87983 0.527054
|
||||
-2.66615 -1.71769 0.122188
|
||||
-2.36412 -1.40123 0.208179
|
||||
-1.65871 -1.41097 0.797358
|
||||
-2.2107 -1.03858 0.417248
|
||||
-2.43165 -1.05924 -0.47471
|
||||
-2.23329 -0.59037 -0.204406
|
||||
-2.23628 -0.701564 0.707986
|
||||
-2.26637 -0.154647 0.171488
|
||||
-1.71325 -0.328896 -0.703447
|
||||
-1.76441 0.345132 -0.121971
|
||||
-2.52431 0.161632 0.57852
|
||||
-2.16344 0.83439 0.507675
|
||||
-2.46853 1.44822 1.60043
|
||||
-2.83129 1.04197 1.06078
|
||||
-2.95605 0.295824 0.936075
|
||||
-2.43579 -0.456935 1.02281
|
||||
-2.76972 -0.353144 1.29936
|
||||
-3.47605 0.221349 1.17333
|
||||
-1.94973 -0.658965 1.58028
|
||||
-1.69178 -0.975244 1.17325
|
||||
-0.951822 -0.815367 1.29474
|
||||
-0.900662 -1.4894 0.713261
|
||||
-0.38062 -1.22792 0.21422
|
||||
-0.795936 -2.20965 -0.351752
|
||||
-0.863465 -1.86766 -1.03464
|
||||
-1.76955 -2.81704 -1.29261
|
||||
-1.37052 -1.38906 -1.35352
|
||||
-2.18815 -2.24574 -1.5863
|
||||
-3.24614 -2.80771 -1.4398
|
||||
-2.62414 -1.68711 -1.29357
|
||||
-3.40578 -2.10229 -1.18533
|
||||
-4.21019 -2.2175 -0.818312
|
||||
-3.32743 -1.73677 -0.515917
|
||||
-3.84743 -1.81125 -0.27866
|
||||
-4.27916 -1.67706 0.0788946
|
||||
-3.45917 -1.98288 0.359816
|
||||
-3.7931 -1.87909 0.636369
|
||||
-3.99261 -1.63446 0.951193
|
||||
-3.70458 -2.49765 1.08066
|
||||
-3.96252 -2.18138 1.48769
|
||||
-3.99559 -1.74565 1.86358
|
||||
-4.46448 -2.68115 1.78115
|
||||
-4.51564 -2.00713 2.36263
|
||||
-4.2088 -1.28183 2.78076
|
||||
-5.27368 -1.9287 2.44672
|
||||
-4.85836 -0.946965 3.0127
|
||||
-4.04074 -0.0902782 3.24548
|
||||
-5.36542 -0.468358 2.69382
|
||||
-4.45934 0.481017 2.95179
|
||||
-3.28688 1.10378 2.78944
|
||||
-4.61533 0.730319 2.24372
|
||||
-3.55734 1.29228 2.09721
|
||||
-3.6357 0.926767 1.4278
|
||||
-4.41734 0.511591 1.53604
|
||||
-5.43295 -0.126368 2.01093
|
||||
-5.82568 -1.55631 2.06661
|
||||
-5.20443 -2.84103 1.65966
|
||||
-4.06545 -3.17041 1.1515
|
||||
-3.27284 -2.63185 0.723104
|
||||
-3.05697 -1.92527 0.176307
|
||||
-2.82214 -1.46838 -0.585887
|
||||
-2.02009 -1.0542 -1.12159
|
||||
2.84039 3.05644 -0.113547
|
||||
2.853 2.13918 -0.872153
|
||||
3.39492 1.75991 -0.50561
|
||||
3.38094 2.77641 0.335073
|
||||
2.35696 3.74549 0.728177
|
||||
2.84521 3.54002 1.26787
|
||||
3.40711 2.24707 0.874502
|
||||
2.92369 2.93613 1.71623
|
||||
1.89383 3.89949 2.10802
|
||||
2.06519 3.26051 2.47436
|
||||
2.54642 2.28757 1.81061
|
||||
1.91216 2.52722 2.37072
|
||||
1.00166 3.15596 2.99873
|
||||
1.12643 2.44998 2.75813
|
||||
1.52439 2.12918 1.85781
|
||||
1.01646 2.07925 2.10825
|
||||
0.344842 2.07115 2.89611
|
||||
0.511204 1.83436 2.19745
|
||||
0.736163 2.26094 1.4298
|
||||
0.34537 2.07152 1.49879
|
||||
0.108702 1.44301 2.10774
|
||||
0.034051 1.76883 1.42941
|
||||
-0.0555178 2.64372 1.2094
|
||||
-0.45802 2.25237 1.11969
|
||||
-0.136133 1.41281 1.23539
|
||||
-0.678049 1.79208 0.868843
|
||||
-1.07926 2.61038 1.36002
|
||||
-1.41963 1.89834 0.971979
|
||||
-0.672026 1.354 0.506539
|
||||
-1.41031 1.22067 0.411524
|
||||
-1.92646 1.66935 1.48438
|
||||
-1.05316 0.711603 -0.210338
|
||||
-0.571926 -0.261335 -0.874081
|
||||
-0.400567 -0.900322 -0.507746
|
||||
-0.00520413 -1.0707 0.113969
|
||||
0.778032 -0.784465 -1.08886
|
||||
1.05833 -0.966152 -0.410409
|
||||
0.382565 -0.672659 0.626872
|
||||
1.1683 -0.595421 0.239464
|
||||
2.11625 -0.453389 -0.597175
|
||||
1.94988 -0.216593 0.101481
|
||||
1.04352 0.11056 0.480072
|
||||
1.54878 0.355452 0.390874
|
||||
2.57252 0.388793 0.240254
|
||||
1.95128 0.746801 0.480583
|
||||
1.14789 0.927649 0.101481
|
||||
1.45921 1.23034 0.170868
|
||||
2.17131 1.2071 0.731432
|
||||
1.62939 1.58636 0.364889
|
||||
1.38456 1.55616 -0.507466
|
||||
1.60459 2.01646 -0.256618
|
||||
1.62473 1.92519 0.645116
|
||||
1.59856 2.45453 0.105686
|
||||
2.11142 2.24544 -0.769017
|
||||
2.10211 2.92311 -0.208562
|
||||
1.36768 2.78362 0.507687
|
||||
1.74495 3.43218 0.413301
|
||||
1.49846 4.06987 1.48631
|
||||
1.1107 3.67183 0.973404
|
||||
0.957671 2.93854 0.869764
|
||||
1.44616 2.17973 0.956047
|
||||
1.12903 2.29956 1.2361
|
||||
0.449736 2.88861 1.1202
|
||||
1.9344 1.97426 1.49574
|
||||
2.16529 1.64517 1.09374
|
||||
2.90357 1.7785 1.18875
|
||||
2.91289 1.10083 0.628296
|
||||
3.41972 1.32982 0.115897
|
||||
2.95902 0.366033 -0.409339
|
||||
2.88437 0.691855 -1.08767
|
||||
1.95041 -0.216224 -1.29583
|
||||
2.3923 1.1754 -1.39739
|
||||
1.54952 0.355974 -1.58522
|
||||
0.491605 -0.156789 -1.39846
|
||||
1.14842 0.928019 -1.29583
|
||||
0.366832 0.549191 -1.15785
|
||||
-0.418901 0.471953 -0.770442
|
||||
0.476802 0.919923 -0.507977
|
||||
-0.031132 0.869992 -0.257539
|
||||
-0.441144 1.02491 0.104538
|
||||
0.364231 0.699617 0.364176
|
||||
0.0471035 0.819441 0.644228
|
||||
-0.131474 1.07398 0.955159
|
||||
0.125578 0.21555 1.09259
|
||||
-0.105304 0.544637 1.49459
|
||||
-0.111327 0.982712 1.85689
|
||||
-0.608846 0.076062 1.80884
|
||||
-0.618163 0.753727 2.36929
|
||||
-0.277795 1.46577 2.75733
|
||||
-1.35974 0.859992 2.47243
|
||||
-0.899037 1.82378 2.99766
|
||||
-0.0562639 2.6432 3.1855
|
||||
-1.39111 2.30732 2.68795
|
||||
-0.457151 3.2154 2.89611
|
||||
0.715229 3.78364 2.68913
|
||||
-0.622986 3.45256 2.19745
|
||||
0.434933 3.96532 2.01068
|
||||
0.324963 3.59459 1.36081
|
||||
-0.456624 3.21576 1.49879
|
||||
-1.46576 2.63314 2.00961
|
||||
-1.90166 1.23926 2.10589
|
||||
-0.25169 -0.433009 1.18697
|
||||
0.53559 0.0606295 0.730511
|
||||
0.757098 0.738236 0.170472
|
||||
0.982056 1.16481 -0.597175
|
||||
1.77106 1.5334 -1.15706
|
||||
-0.561015 -0.673257 -0.516099
|
||||
-0.97055 -0.110718 -0.522061
|
||||
-1.90141 1.221 2.09078
|
||||
-1.35435 0.467997 2.14823
|
||||
-1.32934 0.452132 2.1346
|
||||
-1.0988 0.14376 1.8749
|
||||
-1.74516 1.06687 0.748005
|
||||
-1.70695 0.944633 0.59665
|
||||
-1.3247 0.440138 -0.0497789
|
||||
-1.28047 0.320835 -0.153469
|
||||
-0.446838 -0.882839 -0.466885
|
||||
-0.396754 -0.907847 -0.229717
|
||||
-0.653543 -0.51838 1.12035
|
||||
-0.620442 -0.621786 0.997254
|
||||
-0.403829 -0.92008 0.46599
|
||||
-1.90392 1.27273 1.13283
|
||||
-1.92107 1.27736 1.16019
|
||||
-1.04378 -0.00248243 1.75286
|
||||
-0.980005 -0.0806305 -0.505709
|
||||
-0.405416 -0.901236 0.496048
|
||||
4 0 229 212 211
|
||||
5 1 2 215 214 213
|
||||
5 3 216 215 2 4
|
||||
4 4 2 5 6
|
||||
4 4 6 8 7
|
||||
4 8 6 9 10
|
||||
4 8 10 12 11
|
||||
4 12 10 13 14
|
||||
4 12 14 16 15
|
||||
4 16 14 17 18
|
||||
4 16 18 20 19
|
||||
4 20 18 21 22
|
||||
4 20 22 24 23
|
||||
4 24 22 25 26
|
||||
4 24 26 28 27
|
||||
4 28 26 29 30
|
||||
4 28 30 32 31
|
||||
4 32 30 33 34
|
||||
4 32 34 36 35
|
||||
4 36 34 37 38
|
||||
4 36 38 40 39
|
||||
4 40 38 41 42
|
||||
4 40 42 44 43
|
||||
4 44 42 45 46
|
||||
4 44 46 48 47
|
||||
4 48 46 49 50
|
||||
4 48 50 52 51
|
||||
4 52 50 53 54
|
||||
5 52 54 217 218 219
|
||||
6 52 219 220 229 0 51
|
||||
5 55 226 217 54 56
|
||||
4 56 54 53 57
|
||||
4 53 58 59 57
|
||||
4 57 59 11 60
|
||||
4 59 7 8 11
|
||||
4 7 59 58 61
|
||||
4 58 49 62 61
|
||||
4 61 62 63 3
|
||||
4 62 45 64 63
|
||||
6 63 64 65 230 224 223
|
||||
4 64 41 66 65
|
||||
5 65 66 67 221 222
|
||||
4 66 37 68 67
|
||||
4 67 68 70 69
|
||||
4 68 33 71 70
|
||||
4 70 71 73 72
|
||||
4 71 29 74 73
|
||||
4 73 74 76 75
|
||||
4 74 25 77 76
|
||||
4 76 77 79 78
|
||||
4 77 21 80 79
|
||||
4 79 80 82 81
|
||||
4 80 17 83 82
|
||||
4 82 83 85 84
|
||||
4 83 13 86 85
|
||||
4 85 86 88 87
|
||||
4 86 9 89 88
|
||||
4 88 89 91 90
|
||||
4 89 5 92 91
|
||||
4 91 92 94 93
|
||||
4 92 1 55 94
|
||||
4 94 55 56 95
|
||||
4 95 56 57 60
|
||||
4 60 15 96 95
|
||||
4 95 96 93 94
|
||||
4 93 96 19 97
|
||||
4 19 96 15 16
|
||||
4 97 19 20 23
|
||||
4 23 98 90 97
|
||||
4 97 90 91 93
|
||||
4 90 98 87 88
|
||||
4 87 98 27 99
|
||||
4 27 98 23 24
|
||||
4 99 27 28 31
|
||||
4 31 100 84 99
|
||||
4 99 84 85 87
|
||||
4 84 100 81 82
|
||||
4 81 100 35 101
|
||||
4 35 100 31 32
|
||||
4 101 35 36 39
|
||||
4 39 102 78 101
|
||||
4 101 78 79 81
|
||||
4 78 102 75 76
|
||||
4 75 102 43 103
|
||||
4 43 102 39 40
|
||||
4 103 43 44 47
|
||||
4 47 104 72 103
|
||||
4 103 72 73 75
|
||||
4 72 104 69 70
|
||||
4 69 104 51 0
|
||||
4 51 104 47 48
|
||||
5 69 0 211 221 67
|
||||
4 15 60 11 12
|
||||
5 55 1 213 227 226
|
||||
4 1 92 5 2
|
||||
4 5 89 9 6
|
||||
4 9 86 13 10
|
||||
4 13 83 17 14
|
||||
4 17 80 21 18
|
||||
4 21 77 25 22
|
||||
4 25 74 29 26
|
||||
4 29 71 33 30
|
||||
4 33 68 37 34
|
||||
4 37 66 41 38
|
||||
4 65 222 225 230
|
||||
4 41 64 45 42
|
||||
5 63 223 228 216 3
|
||||
4 45 62 49 46
|
||||
4 61 3 4 7
|
||||
4 49 58 53 50
|
||||
4 106 105 108 107
|
||||
4 108 105 109 110
|
||||
4 108 110 112 111
|
||||
4 112 110 113 114
|
||||
4 112 114 116 115
|
||||
4 116 114 117 118
|
||||
4 116 118 120 119
|
||||
4 120 118 121 122
|
||||
4 120 122 124 123
|
||||
4 124 122 125 126
|
||||
4 124 126 128 127
|
||||
4 128 126 129 130
|
||||
4 128 130 132 131
|
||||
4 132 130 133 134
|
||||
7 132 134 218 217 226 227 135
|
||||
5 134 136 220 219 218
|
||||
5 137 138 221 211 212
|
||||
5 139 225 222 221 138
|
||||
4 139 138 140 141
|
||||
4 139 141 143 142
|
||||
4 143 141 144 145
|
||||
4 143 145 147 146
|
||||
4 147 145 148 149
|
||||
4 147 149 151 150
|
||||
4 151 149 152 153
|
||||
4 151 153 155 154
|
||||
4 155 153 156 157
|
||||
4 155 157 159 158
|
||||
4 159 157 160 161
|
||||
4 159 161 109 105
|
||||
4 159 105 106 158
|
||||
4 109 161 163 162
|
||||
4 163 161 160 164
|
||||
4 160 165 166 164
|
||||
4 164 166 123 167
|
||||
4 166 119 120 123
|
||||
4 119 166 165 168
|
||||
4 165 156 169 168
|
||||
4 168 169 170 115
|
||||
4 169 152 171 170
|
||||
4 170 171 172 111
|
||||
4 171 148 173 172
|
||||
4 172 173 174 107
|
||||
4 173 144 175 174
|
||||
4 174 175 177 176
|
||||
4 175 140 178 177
|
||||
4 177 178 180 179
|
||||
4 178 137 181 180
|
||||
4 180 181 183 182
|
||||
4 181 136 184 183
|
||||
4 183 184 186 185
|
||||
4 184 133 187 186
|
||||
4 186 187 189 188
|
||||
4 187 129 190 189
|
||||
4 189 190 192 191
|
||||
4 190 125 193 192
|
||||
4 192 193 195 194
|
||||
4 193 121 196 195
|
||||
4 195 196 198 197
|
||||
4 196 117 199 198
|
||||
4 198 199 201 200
|
||||
4 199 113 162 201
|
||||
4 201 162 163 202
|
||||
4 202 163 164 167
|
||||
4 167 127 203 202
|
||||
4 202 203 200 201
|
||||
4 200 203 131 204
|
||||
4 131 203 127 128
|
||||
4 204 131 132 135
|
||||
4 135 205 197 204
|
||||
4 204 197 198 200
|
||||
4 197 205 194 195
|
||||
4 194 205 213 214
|
||||
5 206 191 228 223 224
|
||||
4 191 206 188 189
|
||||
4 188 206 142 207
|
||||
6 142 206 224 230 225 139
|
||||
4 207 142 143 146
|
||||
4 146 208 185 207
|
||||
4 207 185 186 188
|
||||
4 185 208 182 183
|
||||
4 182 208 150 209
|
||||
4 150 208 146 147
|
||||
4 209 150 151 154
|
||||
4 154 210 179 209
|
||||
4 209 179 180 182
|
||||
4 179 210 176 177
|
||||
4 176 210 158 106
|
||||
4 158 210 154 155
|
||||
4 176 106 107 174
|
||||
7 194 214 215 216 228 191 192
|
||||
4 205 135 227 213
|
||||
4 127 167 123 124
|
||||
4 162 113 110 109
|
||||
4 113 199 117 114
|
||||
4 117 196 121 118
|
||||
4 121 193 125 122
|
||||
4 125 190 129 126
|
||||
4 129 187 133 130
|
||||
4 133 184 136 134
|
||||
6 136 181 137 212 229 220
|
||||
4 137 178 140 138
|
||||
4 140 175 144 141
|
||||
4 144 173 148 145
|
||||
4 172 107 108 111
|
||||
4 148 171 152 149
|
||||
4 170 111 112 115
|
||||
4 152 169 156 153
|
||||
4 168 115 116 119
|
||||
4 156 165 160 157
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
OFF
|
||||
25 25 50
|
||||
0.107677 -1.54743e-018 -0.331395
|
||||
-0.281902 -1.54743e-018 -0.204814
|
||||
-0.281902 -1.54743e-018 0.204814
|
||||
0.107676 -1.54743e-018 0.331395
|
||||
0.34845 -1.54743e-018 8.92032e-008
|
||||
0.18208 0.331395 -0.560383
|
||||
-0.476691 0.331395 -0.346336
|
||||
-0.476691 0.331395 0.346336
|
||||
0.18208 0.331395 0.560384
|
||||
0.589223 0.331395 8.92032e-008
|
||||
0.302466 0.204814 -0.930895
|
||||
-0.791866 0.204814 -0.575325
|
||||
-0.791866 0.204814 0.575324
|
||||
0.302466 0.204814 0.930895
|
||||
0.978801 0.204814 8.92032e-008
|
||||
0.302466 -0.204814 -0.930895
|
||||
-0.791866 -0.204814 -0.575325
|
||||
-0.791866 -0.204814 0.575324
|
||||
0.302466 -0.204814 0.930895
|
||||
0.978801 -0.204814 8.92032e-008
|
||||
0.18208 -0.331395 -0.560383
|
||||
-0.476691 -0.331395 -0.346336
|
||||
-0.476691 -0.331395 0.346336
|
||||
0.18208 -0.331395 0.560384
|
||||
0.589222 -0.331395 8.92032e-008
|
||||
4 5 6 1 0
|
||||
4 6 7 2 1
|
||||
4 7 8 3 2
|
||||
4 8 9 4 3
|
||||
4 9 5 0 4
|
||||
4 10 11 6 5
|
||||
4 11 12 7 6
|
||||
4 12 13 8 7
|
||||
4 13 14 9 8
|
||||
4 14 10 5 9
|
||||
4 15 16 11 10
|
||||
4 16 17 12 11
|
||||
4 17 18 13 12
|
||||
4 18 19 14 13
|
||||
4 19 15 10 14
|
||||
4 20 21 16 15
|
||||
4 21 22 17 16
|
||||
4 22 23 18 17
|
||||
4 23 24 19 18
|
||||
4 24 20 15 19
|
||||
4 0 1 21 20
|
||||
4 1 2 22 21
|
||||
4 2 3 23 22
|
||||
4 3 4 24 23
|
||||
4 4 0 20 24
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
#include <CGAL/Polygonal_schema.h>
|
||||
#include <CGAL/Path_on_surface.h>
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
|
||||
using namespace CGAL::Surface_mesh_topology;
|
||||
|
||||
typedef Polygonal_schema_with_combinatorial_map<> CMap;
|
||||
typedef Polygonal_schema_with_generalized_map<> GMap;
|
||||
|
||||
template<typename Map>
|
||||
void construct_map_from_edges()
|
||||
{
|
||||
Map cm;
|
||||
|
||||
cm.add_facet("a b c -a -b");
|
||||
cm.add_facet("-c d e -d -e");
|
||||
|
||||
Path_on_surface<Map> p(cm); p.push_back_by_label("a b d e");
|
||||
|
||||
std::cout<<"Map valid="<<cm.is_valid()<<std::flush;
|
||||
cm.display_characteristics(std::cout);
|
||||
std::cout<<"; path lenght="<<p.length()
|
||||
<<", isclosed? "<<(p.is_closed()?"true":"false")<<std::endl;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
construct_map_from_edges<CMap>();
|
||||
construct_map_from_edges<GMap>();
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
#include <CGAL/Surface_mesh.h>
|
||||
#include <CGAL/Curves_on_surface_topology.h>
|
||||
#include <CGAL/Path_on_surface.h>
|
||||
#include <CGAL/draw_face_graph_with_paths.h>
|
||||
|
||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
|
||||
typedef Kernel::Point_3 Point_3;
|
||||
typedef CGAL::Surface_mesh<Point_3> SM;
|
||||
|
||||
using namespace CGAL::Surface_mesh_topology;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
void create_path_1(Path_on_surface<SM>& p)
|
||||
{
|
||||
p.push_back_by_index(88); // Its starting dart
|
||||
for (int i=0; i<3; ++i)
|
||||
{ p.extend_positive_turn(2); } // Extend the path
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
void create_path_2(Path_on_surface<SM>& p)
|
||||
{
|
||||
p.push_back_by_index(300); // Its starting dart
|
||||
for (int i=0; i<3; ++i)
|
||||
{ p.extend_negative_turn(2); } // Extend the path
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
void create_path_3(Path_on_surface<SM>& p)
|
||||
{
|
||||
p.push_back_by_index(87); // Its starting dart
|
||||
p.extend_positive_turn(1); // Extend the path
|
||||
for (int i=0; i<3; ++i)
|
||||
{ p.extend_positive_turn(2); }
|
||||
p.extend_positive_turn(1);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
int main()
|
||||
{
|
||||
SM sm;
|
||||
std::ifstream in("data/double-torus.off");
|
||||
if (!in.is_open())
|
||||
{
|
||||
std::cout<<"ERROR reading file data/double-torus.off"<<std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
in>>sm;
|
||||
|
||||
Curves_on_surface_topology<SM> cst(sm);
|
||||
Path_on_surface<SM> p1(sm), p2(sm), p3(sm);
|
||||
create_path_1(p1);
|
||||
create_path_2(p2);
|
||||
create_path_3(p3);
|
||||
|
||||
bool res1=cst.are_base_point_homotopic(p1, p2);
|
||||
std::cout<<"Path p1 (pink) "<<(res1?"IS":"IS NOT")
|
||||
<<" base point homotopic with path p2 (green)."<<std::endl;
|
||||
|
||||
bool res2=cst.are_base_point_homotopic(p2, p3);
|
||||
std::cout<<"Path p2 (green) "<<(res2?"IS":"IS NOT")
|
||||
<<" base point homotopic with path p3 (orange)."<<std::endl;
|
||||
|
||||
#ifdef CGAL_USE_BASIC_VIEWER
|
||||
std::vector<Path_on_surface<SM> > paths={p1, p2, p3};
|
||||
CGAL::draw(sm, paths); // Enable only if CGAL was compiled with Qt5
|
||||
#endif // CGAL_USE_BASIC_VIEWER
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -0,0 +1,196 @@
|
|||
#include <CGAL/Linear_cell_complex_for_combinatorial_map.h>
|
||||
#include <CGAL/Linear_cell_complex_constructors.h>
|
||||
#include <CGAL/Curves_on_surface_topology.h>
|
||||
#include <CGAL/Path_on_surface.h>
|
||||
|
||||
/* If you want to use a viewer, you can use qglviewer. */
|
||||
#ifdef CGAL_USE_BASIC_VIEWER
|
||||
#include <CGAL/draw_face_graph_with_paths.h>
|
||||
#endif
|
||||
|
||||
typedef CGAL::Linear_cell_complex_for_combinatorial_map<2,3> LCC_3_cmap;
|
||||
using namespace CGAL::Surface_mesh_topology;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
[[ noreturn ]] void usage(int /*argc*/, char** argv)
|
||||
{
|
||||
std::cout<<"usage: "<<argv[0]<<" file [-draw] [-L l1 l2] [-D d1 d2] "
|
||||
<<" [-N n] [-seed S] [-time]"<<std::endl
|
||||
<<" Load the given off file, compute one random path, deform it "
|
||||
<<"into a second path and test that the two paths are homotopic."
|
||||
<<std::endl
|
||||
<<" -draw: draw mesh and the two paths." <<std::endl
|
||||
<<" -L l1 l2: create a path of length >= l: a random number between [l1, l2] (by default [10, 100])."<<std::endl
|
||||
<<" -D d1 d2: use d deformations to generate the second path: d is a random number between [d1, d2] (by default [10, 100]."<<std::endl
|
||||
<<" -N n: do n tests of homotopy (using 2*n random paths) (by default 1)."<<std::endl
|
||||
<<" -seed S: uses S as seed of random generator. Otherwise use a different seed at each run (based on time)."<<std::endl
|
||||
<<" -time: display computation times."<<std::endl
|
||||
<<std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
[[ noreturn ]] void error_command_line(int argc, char** argv, const char* msg)
|
||||
{
|
||||
std::cout<<"ERROR: "<<msg<<std::endl;
|
||||
usage(argc, argv);
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
void process_command_line(int argc, char** argv,
|
||||
std::string& file,
|
||||
bool& draw,
|
||||
int& l1,
|
||||
int& l2,
|
||||
int& d1,
|
||||
int& d2,
|
||||
unsigned int& N,
|
||||
CGAL::Random& random,
|
||||
bool& time)
|
||||
{
|
||||
std::string arg;
|
||||
for (int i=1; i<argc; ++i)
|
||||
{
|
||||
arg=argv[i];
|
||||
if (arg=="-draw")
|
||||
{ draw=true; }
|
||||
else if (arg=="-D")
|
||||
{
|
||||
if (i+2>=argc)
|
||||
{ error_command_line(argc, argv, "Error: not enough number after -D option."); }
|
||||
d1=std::stoi(std::string(argv[++i]));
|
||||
d2=std::stoi(std::string(argv[++i]));
|
||||
}
|
||||
else if (arg=="-L")
|
||||
{
|
||||
if (i+2>=argc)
|
||||
{ error_command_line(argc, argv, "Error: not enough number after -L option."); }
|
||||
l1=std::stoi(std::string(argv[++i]));
|
||||
l2=std::stoi(std::string(argv[++i]));
|
||||
}
|
||||
else if (arg=="-N")
|
||||
{
|
||||
if (i==argc-1)
|
||||
{ error_command_line(argc, argv, "Error: no number after -nbtests option."); }
|
||||
N=static_cast<unsigned int>(std::stoi(std::string(argv[++i])));
|
||||
}
|
||||
else if (arg=="-seed")
|
||||
{
|
||||
if (i==argc-1)
|
||||
{ error_command_line(argc, argv, "Error: no number after -seed option."); }
|
||||
random=CGAL::Random(static_cast<unsigned int>
|
||||
(std::stoi(std::string(argv[++i]))));
|
||||
// initialize the random generator with the given seed
|
||||
}
|
||||
else if (arg=="-time")
|
||||
{ time=true; }
|
||||
else if (arg=="-h" || arg=="--help" || arg=="-?")
|
||||
{ usage(argc, argv); }
|
||||
else if (arg[0]=='-')
|
||||
{ std::cout<<"Unknown option "<<arg<<", ignored."<<std::endl; }
|
||||
else
|
||||
{ file=arg; }
|
||||
}
|
||||
|
||||
if (N==0) { N=1; }
|
||||
if (l2<l1) l2=l1;
|
||||
if (d2<d1) d2=d1;
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
std::string file="data/elephant.off";
|
||||
bool draw=false;
|
||||
int l1=10, l2=100;
|
||||
int d1=10, d2=100;
|
||||
unsigned int N=1;
|
||||
CGAL::Random random; // Used when user do not provide its own seed.
|
||||
bool time=false;
|
||||
|
||||
process_command_line(argc, argv, file, draw, l1, l2, d1, d2, N, random, time);
|
||||
|
||||
LCC_3_cmap lcc;
|
||||
if (!CGAL::load_off(lcc, file.c_str()))
|
||||
{
|
||||
std::cout<<"PROBLEM reading file "<<file<<std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
std::cout<<"Initial map: ";
|
||||
lcc.display_characteristics(std::cout) << ", valid="
|
||||
<< lcc.is_valid() << std::endl;
|
||||
|
||||
Curves_on_surface_topology<LCC_3_cmap> cst(lcc, time);
|
||||
|
||||
cst.compute_minimal_quadrangulation(time);
|
||||
|
||||
std::cout<<"Reduced map: ";
|
||||
cst.get_minimal_quadrangulation().display_characteristics(std::cout)
|
||||
<<", valid="<< cst.get_minimal_quadrangulation().is_valid()<<std::endl;
|
||||
|
||||
unsigned int nbcontractible=0;
|
||||
std::vector<std::size_t> errors_seeds;
|
||||
unsigned int length, defo;
|
||||
|
||||
for (unsigned int i=0; i<N; ++i)
|
||||
{
|
||||
if (i!=0)
|
||||
{
|
||||
random=CGAL::Random(static_cast<unsigned int>
|
||||
(random.get_int(0, std::numeric_limits<int>::max())));
|
||||
}
|
||||
std::cout<<"Random seed: "<<random.get_seed()<<": ";
|
||||
|
||||
length=static_cast<unsigned int>(random.get_int(l1, l2+1));
|
||||
defo=static_cast<unsigned int>(random.get_int(d1, d2+1));
|
||||
|
||||
std::vector<Path_on_surface<LCC_3_cmap> > paths;
|
||||
std::vector<Path_on_surface<LCC_3_cmap> > transformed_paths;
|
||||
|
||||
Path_on_surface<LCC_3_cmap> path1(lcc);
|
||||
path1.generate_random_closed_path(length, random);
|
||||
|
||||
std::cout<<"Path1 size: "<<path1.length()<<" (from "<<length<<" darts); ";
|
||||
paths.push_back(path1);
|
||||
|
||||
Path_on_surface<LCC_3_cmap> path2(path1);
|
||||
path2.update_path_randomly(defo, random);
|
||||
std::cout<<"Path2 size: "<<path2.length()<<" (from "<<defo<<" deformations).";
|
||||
paths.push_back(path2);
|
||||
std::cout<<std::endl;
|
||||
|
||||
if (cst.is_contractible(path1, time))
|
||||
{ ++nbcontractible; }
|
||||
|
||||
bool res=cst.are_freely_homotopic(path1, path2, time);
|
||||
if (!res)
|
||||
{ errors_seeds.push_back(random.get_seed()); }
|
||||
|
||||
#ifdef CGAL_USE_BASIC_VIEWER
|
||||
if (draw)
|
||||
{ CGAL::draw(lcc, paths); }
|
||||
#endif
|
||||
}
|
||||
|
||||
if (errors_seeds.empty())
|
||||
{
|
||||
if (N==1) { std::cout<<"Test OK: both paths are homotopic."<<std::endl; }
|
||||
else
|
||||
{ std::cout<<"All the "<<N
|
||||
<<" tests OK: each pair of paths were homotopic."<<std::endl; }
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout<<"ERRORS for "<<errors_seeds.size()<<" tests among "<<N
|
||||
<<" (i.e. "<<static_cast<double>(errors_seeds.size()*100)/
|
||||
static_cast<double>(N)<<"%)."<<std::endl;
|
||||
std::cout<<"Errors for seeds: ";
|
||||
for (std::size_t i=0; i<errors_seeds.size(); ++i)
|
||||
{ std::cout<<errors_seeds[i]<<" "; }
|
||||
std::cout<<std::endl;
|
||||
}
|
||||
|
||||
std::cout<<"Number of contractible paths: "<<nbcontractible<<" among "<<N
|
||||
<<" (i.e. "<<static_cast<double>(nbcontractible*100)/
|
||||
static_cast<double>(N)<<"%)."<<std::endl;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
#include <CGAL/Polygonal_schema.h>
|
||||
#include <CGAL/Path_on_surface.h>
|
||||
#include <CGAL/Curves_on_surface_topology.h>
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
|
||||
using namespace CGAL::Surface_mesh_topology;
|
||||
typedef Polygonal_schema_with_combinatorial_map<> PS;
|
||||
|
||||
int main()
|
||||
{
|
||||
PS ps;
|
||||
ps.add_facet("a b -a -b c d -c -d");
|
||||
|
||||
Path_on_surface<PS> p1(ps); p1.push_back_by_label("a");
|
||||
Path_on_surface<PS> p2(ps); p2.push_back_by_label("b c a -c -b");
|
||||
|
||||
Curves_on_surface_topology<PS> cst(ps);
|
||||
|
||||
bool res1=cst.are_freely_homotopic(p1, p2);
|
||||
std::cout<<"Paths p1 and p2 "<<(res1?"ARE":"ARE NOT")
|
||||
<<" freely homotopic."<<std::endl;
|
||||
|
||||
bool res2=cst.are_base_point_homotopic(p1, p2);
|
||||
std::cout<<"Paths p1 and p2 "<<(res2?"ARE":"ARE NOT")
|
||||
<<" base point homotopic."<<std::endl;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
#include <CGAL/Polygonal_schema.h>
|
||||
#include <CGAL/Path_on_surface.h>
|
||||
#include <CGAL/Curves_on_surface_topology.h>
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
|
||||
typedef CGAL::Surface_mesh_topology::Polygonal_schema_with_combinatorial_map<> PS;
|
||||
|
||||
int main()
|
||||
{
|
||||
PS ps;
|
||||
|
||||
ps.add_facet("a b -a c"); // First facet, giving directly its sequence of edges
|
||||
ps.add_facet("d -c e -b"); // Second facet
|
||||
|
||||
ps.init_facet(); // Third facet
|
||||
ps.add_edges_to_facet("f"); // Here, each edge is added one at a time
|
||||
ps.add_edges_to_facet("-d");
|
||||
ps.add_edges_to_facet("-f");
|
||||
ps.add_edges_to_facet("-e");
|
||||
ps.finish_facet();
|
||||
|
||||
ps.perforate_facet("f");
|
||||
|
||||
std::cout<<"Number of cells of the combinatorial maps: ";
|
||||
ps.display_characteristics(std::cout)<<std::endl;
|
||||
|
||||
CGAL::Surface_mesh_topology::Path_on_surface<PS> p(ps);
|
||||
p.push_back_by_label("a b -a e -b d");
|
||||
|
||||
CGAL::Surface_mesh_topology::Curves_on_surface_topology<PS> cst(ps);
|
||||
bool res=cst.is_contractible(p);
|
||||
std::cout<<"Path "<<(res?"IS":"IS NOT")<<" contractible."<<std::endl;
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
#include <CGAL/Linear_cell_complex_for_combinatorial_map.h>
|
||||
#include <CGAL/Linear_cell_complex_constructors.h>
|
||||
#include <CGAL/Polyhedron_3.h>
|
||||
#include <CGAL/Surface_mesh.h>
|
||||
#include <CGAL/draw_face_graph_with_paths.h>
|
||||
|
||||
#include <CGAL/Curves_on_surface_topology.h>
|
||||
#include <CGAL/Path_on_surface.h>
|
||||
#include <CGAL/boost/graph/io.h>
|
||||
#include <CGAL/Face_graph_wrapper.h>
|
||||
|
||||
typedef CGAL::Linear_cell_complex_for_combinatorial_map<2,3> LCC_3_cmap;
|
||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
|
||||
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
|
||||
typedef Kernel::Point_3 Point_3;
|
||||
typedef CGAL::Surface_mesh<Point_3> SM;
|
||||
|
||||
static unsigned int seed; // Use the same seed for the two tests
|
||||
|
||||
using namespace CGAL::Surface_mesh_topology;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
template<class FaceGraph>
|
||||
void test(const FaceGraph& mesh)
|
||||
{
|
||||
CGAL::Random random(seed);
|
||||
Curves_on_surface_topology<FaceGraph> cst(mesh);
|
||||
|
||||
Path_on_surface<FaceGraph> p1(mesh); // A first path
|
||||
p1.generate_random_closed_path(10, random);
|
||||
|
||||
Path_on_surface<FaceGraph> p2(mesh); // A second path
|
||||
p2.generate_random_closed_path(10, random);
|
||||
|
||||
bool res1=cst.is_contractible(p1);
|
||||
std::cout<<"Path p1 "<<(res1?"IS":"IS NOT")<<" contractible."<<std::endl;
|
||||
|
||||
bool res2=cst.are_freely_homotopic(p1, p2);
|
||||
std::cout<<"Path p1 "<<(res2?"IS":"IS NOT")<<" homotopic with path p2."<<std::endl;
|
||||
|
||||
#ifdef CGAL_USE_BASIC_VIEWER
|
||||
std::vector<Path_on_surface<FaceGraph> > paths={p1, p2};
|
||||
CGAL::draw(mesh, paths); // Enable only if CGAL was compiled with Qt5 */
|
||||
#endif // CGAL_USE_BASIC_VIEWER
|
||||
}
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
std::string file=(argc==1?"data/elephant.off":argv[1]);
|
||||
seed=static_cast<unsigned int>(CGAL::get_default_random().get_int(0,INT_MAX));
|
||||
|
||||
{
|
||||
LCC_3_cmap lcc;
|
||||
if (!CGAL::load_off(lcc, file.c_str()))
|
||||
{
|
||||
std::cout<<"ERROR reading file "<<file<<" for linear cell complex."<<std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
test(lcc);
|
||||
}
|
||||
|
||||
{
|
||||
Polyhedron p;
|
||||
if (!CGAL::read_off(file, p))
|
||||
{
|
||||
std::cout<<"ERROR reading file "<<file<<" for polyhedron."<<std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
test(p);
|
||||
}
|
||||
|
||||
{
|
||||
SM sm;
|
||||
if (!CGAL::read_off(file, sm))
|
||||
{
|
||||
std::cout<<"ERROR reading file "<<file<<" for surface mesh."<<std::endl;
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
test(sm);
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
@ -0,0 +1,100 @@
|
|||
// Copyright (c) 2019 CNRS and LIRIS' Establishments (France).
|
||||
// All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org).
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
|
||||
//
|
||||
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
|
||||
//
|
||||
#ifndef CGAL_CURVES_ON_SURFACE_TOPOLOGY_H
|
||||
#define CGAL_CURVES_ON_SURFACE_TOPOLOGY_H 1
|
||||
|
||||
#include <CGAL/license/Surface_mesh_topology.h>
|
||||
|
||||
#include <CGAL/Surface_mesh_topology/internal/Minimal_quadrangulation.h>
|
||||
#include <CGAL/Face_graph_wrapper.h>
|
||||
#include <memory>
|
||||
|
||||
namespace CGAL {
|
||||
namespace Surface_mesh_topology {
|
||||
|
||||
template<typename Mesh>
|
||||
class Curves_on_surface_topology
|
||||
{
|
||||
public:
|
||||
typedef internal::Minimal_quadrangulation<Mesh> Minimal_quadrangulation;
|
||||
typedef typename Minimal_quadrangulation::Original_map Original_map;
|
||||
typedef typename Minimal_quadrangulation::Reduced_map Reduced_map;
|
||||
|
||||
Curves_on_surface_topology(const Mesh& amesh, bool /* display_time */=false) :
|
||||
m_original_mesh(amesh),
|
||||
m_minimal_quadrangulation(nullptr)
|
||||
{}
|
||||
|
||||
/// @return true iff the minimal quadrangulation is computed.
|
||||
bool is_minimal_quadrangulation_computed() const
|
||||
{ return m_minimal_quadrangulation!=nullptr; }
|
||||
|
||||
/// Computes the minimal quadrangulation if it is not yet computed.
|
||||
void compute_minimal_quadrangulation(bool display_time=true) const
|
||||
{
|
||||
if (m_minimal_quadrangulation==nullptr)
|
||||
{
|
||||
m_minimal_quadrangulation.reset
|
||||
(new Minimal_quadrangulation(m_original_mesh, display_time));
|
||||
}
|
||||
}
|
||||
|
||||
/// Return the original map.
|
||||
const Original_map& get_original_map() const
|
||||
{ return m_minimal_quadrangulation->get_original_map(); }
|
||||
|
||||
/// Return the reduced map computed in the minimal quadrangulation.
|
||||
/// @pre is_minimal_quadrangulation_computed()
|
||||
const Reduced_map& get_minimal_quadrangulation() const
|
||||
{
|
||||
CGAL_assertion(is_minimal_quadrangulation_computed());
|
||||
return m_minimal_quadrangulation->get_reduced_map();
|
||||
}
|
||||
|
||||
/// @return true iff 'p' is contractible.
|
||||
bool is_contractible(const Path_on_surface<Mesh>& p,
|
||||
bool display_time=false) const
|
||||
{
|
||||
compute_minimal_quadrangulation(display_time);
|
||||
return m_minimal_quadrangulation->is_contractible(p, display_time);
|
||||
}
|
||||
|
||||
/// @return true iff 'p1' and 'p2' are freely homotopic.
|
||||
bool are_freely_homotopic(const Path_on_surface<Mesh>& p1,
|
||||
const Path_on_surface<Mesh>& p2,
|
||||
bool display_time=false) const
|
||||
{
|
||||
compute_minimal_quadrangulation(display_time);
|
||||
return m_minimal_quadrangulation->are_freely_homotopic(p1, p2,
|
||||
display_time);
|
||||
}
|
||||
|
||||
/// @return true iff 'p1' and 'p2' are base point freely homotopic.
|
||||
bool are_base_point_homotopic(const Path_on_surface<Mesh>& p1,
|
||||
const Path_on_surface<Mesh>& p2,
|
||||
bool display_time=false) const
|
||||
{
|
||||
compute_minimal_quadrangulation(display_time);
|
||||
return m_minimal_quadrangulation->are_base_point_homotopic(p1, p2,
|
||||
display_time);
|
||||
}
|
||||
|
||||
protected:
|
||||
const Mesh& m_original_mesh;
|
||||
mutable std::unique_ptr<Minimal_quadrangulation> m_minimal_quadrangulation;
|
||||
};
|
||||
|
||||
} // namespace Surface_mesh_topology
|
||||
} // namespace CGAL
|
||||
|
||||
#endif // CGAL_CURVES_ON_SURFACE_TOPOLOGY_H //
|
||||
// EOF //
|
||||
|
|
@ -0,0 +1,597 @@
|
|||
// Copyright (c) 2019 CNRS and LIRIS' Establishments (France).
|
||||
// All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org).
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
|
||||
//
|
||||
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
|
||||
//
|
||||
#ifndef CGAL_POLYGONAL_SCHEMA_H
|
||||
#define CGAL_POLYGONAL_SCHEMA_H 1
|
||||
|
||||
#include <CGAL/license/Surface_mesh_topology.h>
|
||||
|
||||
#include <vector>
|
||||
#include <unordered_map>
|
||||
#include <cstddef>
|
||||
#include <string>
|
||||
#include <initializer_list>
|
||||
#include <algorithm>
|
||||
#include <random>
|
||||
#include <CGAL/assertions.h>
|
||||
#include <CGAL/memory.h>
|
||||
#include <CGAL/Polygonal_schema_min_items.h>
|
||||
#include <CGAL/Combinatorial_map.h>
|
||||
#include <CGAL/Generalized_map.h>
|
||||
#include <CGAL/Random.h>
|
||||
|
||||
namespace CGAL {
|
||||
namespace Surface_mesh_topology {
|
||||
|
||||
namespace internal
|
||||
{
|
||||
/// @return opposite label of label s
|
||||
/// (i.e. add/remove - depending if s is positive or negative)
|
||||
inline std::string opposite_label(const std::string& s)
|
||||
{
|
||||
CGAL_assertion(!s.empty());
|
||||
if (s[0]=='-')
|
||||
{ return s.substr(1, std::string::npos); }
|
||||
|
||||
return std::string("-")+s;
|
||||
}
|
||||
|
||||
template<class Map, class Combinatorial_data_structure=
|
||||
typename Map::Combinatorial_data_structure>
|
||||
struct Polygonal_schema_tools
|
||||
{};
|
||||
template<class CMap>
|
||||
struct Polygonal_schema_tools<CMap, Combinatorial_map_tag>
|
||||
{
|
||||
typedef typename CMap::Dart_handle Dart_handle;
|
||||
|
||||
static Dart_handle
|
||||
add_edge_to_face(CMap& cmap, const std::string& s,
|
||||
Dart_handle prev_dart,
|
||||
Dart_handle dart_same_label,
|
||||
Dart_handle dart_opposite_label,
|
||||
std::unordered_map<std::string, Dart_handle>&
|
||||
edge_label_to_dart)
|
||||
{
|
||||
if (dart_same_label!=nullptr && dart_opposite_label!=nullptr)
|
||||
{
|
||||
std::cerr<<"Polygonal_schema ERROR: "<<"both labels "<<s
|
||||
<<" and "<<internal::opposite_label(s)
|
||||
<<" are already added in the surface."
|
||||
<<" This label can not be use anymore."<<std::endl;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (dart_same_label!=nullptr)
|
||||
{
|
||||
std::cerr<<"Polygonal_schema ERROR: "<<"label "<<s
|
||||
<<" is already added in the surface."
|
||||
<<" Since the surface is orientable, this label can "
|
||||
<<"not be use anymore."<<std::endl;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Dart_handle res=cmap.create_dart();
|
||||
edge_label_to_dart[s]=res;
|
||||
cmap.info(res).m_label=s;
|
||||
|
||||
if (prev_dart!=cmap.null_handle)
|
||||
{ cmap.template link_beta<1>(prev_dart, res); }
|
||||
|
||||
if (dart_opposite_label!=nullptr)
|
||||
{ cmap.template link_beta<2>(res, dart_opposite_label); }
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
const std::string& get_label(CMap& cmap, Dart_handle dh) const
|
||||
{ return cmap.info(dh).m_label; }
|
||||
};
|
||||
template<class GMap>
|
||||
struct Polygonal_schema_tools<GMap, Generalized_map_tag>
|
||||
{
|
||||
typedef typename GMap::Dart_handle Dart_handle;
|
||||
|
||||
// In a GMap, if an edge is 2-free, only one of its two dart has one label.
|
||||
// Otherwise, d has one label and alpha<0,2>(d) the opposite label.
|
||||
static Dart_handle
|
||||
add_edge_to_face(GMap& gmap, const std::string& s,
|
||||
Dart_handle prev_dart,
|
||||
Dart_handle dart_same_label,
|
||||
Dart_handle dart_opposite_label,
|
||||
std::unordered_map<std::string, Dart_handle>&
|
||||
edge_label_to_dart)
|
||||
{
|
||||
if (dart_same_label!=nullptr && dart_opposite_label!=nullptr)
|
||||
{
|
||||
std::cerr<<"Polygonal_schema ERROR: "<<"both labels "<<s
|
||||
<<" and "<<internal::opposite_label(s)
|
||||
<<" are already added in the surface."
|
||||
<<" This label can not be use anymore."<<std::endl;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Dart_handle res=gmap.create_dart();
|
||||
Dart_handle dh2=gmap.create_dart();
|
||||
|
||||
gmap.template link_alpha<0>(res, dh2);
|
||||
if (prev_dart!=gmap.null_handle)
|
||||
{ gmap.template link_alpha<1>(res, gmap.template alpha<0>(prev_dart)); }
|
||||
|
||||
if (dart_same_label!=nullptr)
|
||||
{ // Here dart_same_label!=nullptr
|
||||
std::string s2=internal::opposite_label(s);
|
||||
edge_label_to_dart[s2]=dh2;
|
||||
gmap.info(dh2).m_label=s2;
|
||||
|
||||
gmap.template sew<2>(res, dart_same_label);
|
||||
}
|
||||
else
|
||||
{ // Here either dart_opposite_label!=nullptr, or both are nullptr
|
||||
edge_label_to_dart[s]=res;
|
||||
gmap.info(res).m_label=s;
|
||||
|
||||
if (dart_opposite_label!=nullptr)
|
||||
{
|
||||
std::string s2=internal::opposite_label(s);
|
||||
edge_label_to_dart[s2]=res;
|
||||
gmap.info(res).m_label=s2;
|
||||
|
||||
gmap.template sew<2>(dh2, dart_opposite_label);
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
std::string get_label(GMap& gmap, Dart_handle dh) const
|
||||
{
|
||||
if (gmap.info(dh).m_label.empty())
|
||||
{
|
||||
if (!gmap.template is_free<2>(dh))
|
||||
{ return gmap.info(gmap.template alpha<2>(dh)).m_label; }
|
||||
else
|
||||
{
|
||||
return internal::opposite_label(gmap.info(gmap.template alpha<0>(dh)));
|
||||
}
|
||||
}
|
||||
return gmap.info(dh).m_label;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
// end namespace internal
|
||||
|
||||
struct Combinatorial_map_tag;
|
||||
struct Generalized_map_tag;
|
||||
|
||||
template < class BaseModel >
|
||||
class Polygonal_schema_base: public BaseModel
|
||||
{
|
||||
public:
|
||||
typedef BaseModel Base;
|
||||
typedef Polygonal_schema_base Self;
|
||||
typedef BaseModel Map; // Either a GMap or a CMap
|
||||
typedef typename Map::Dart_handle Dart_handle;
|
||||
typedef typename Map::Dart_const_handle Dart_const_handle;
|
||||
typedef typename Map::size_type size_type;
|
||||
|
||||
Polygonal_schema_base() : Base(),
|
||||
mark_perforated(this->get_new_mark()),
|
||||
first_dart(this->null_handle),
|
||||
prev_dart(this->null_handle),
|
||||
facet_started(false)
|
||||
{}
|
||||
|
||||
/// Start a new facet.
|
||||
void init_facet()
|
||||
{
|
||||
if (facet_started)
|
||||
{
|
||||
std::cerr<<"Polygonal_schema ERROR: "
|
||||
<<"you try to start a facet"
|
||||
<<" but the previous facet is not yet ended."<<std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
first_dart = this->null_handle;
|
||||
prev_dart = this->null_handle;
|
||||
facet_started=true;
|
||||
}
|
||||
|
||||
/// Add one edge to the current facet, given by its label
|
||||
/// (any string, using minus sign for orientation)
|
||||
void add_edge_to_facet(const std::string& s)
|
||||
{
|
||||
if (!facet_started)
|
||||
{
|
||||
std::cerr<<"Polygonal_schema ERROR: "
|
||||
<<"you try to add an edge to a facet"
|
||||
<<" but the facet is not yet started."<<std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
Dart_handle dart_same_label=get_dart_labeled(s);
|
||||
Dart_handle dart_opposite_label=get_dart_labeled
|
||||
(internal::opposite_label(s));
|
||||
|
||||
Dart_handle cur=internal::Polygonal_schema_tools<Map>::
|
||||
add_edge_to_face(*this, s, prev_dart, dart_same_label,
|
||||
dart_opposite_label, edge_label_to_dart);
|
||||
|
||||
if (prev_dart==this->null_handle)
|
||||
{ first_dart=cur; }
|
||||
|
||||
prev_dart=cur;
|
||||
}
|
||||
|
||||
/// add all the given edges to the current facet.
|
||||
/// @param s the sequence of labels of edges to add.
|
||||
void add_edges_to_facet(const std::string& s)
|
||||
{
|
||||
if (!facet_started)
|
||||
{
|
||||
std::cerr<<"Polygonal_schema ERROR: "
|
||||
<<"you try to add edges to a facet"
|
||||
<<" but the facet is not yet started."<<std::endl;
|
||||
return;
|
||||
}
|
||||
std::istringstream iss(s);
|
||||
for (std::string token; std::getline(iss, token, ' '); )
|
||||
{ add_edge_to_facet(token); }
|
||||
}
|
||||
|
||||
/// add one facet, given a sequence of labels.
|
||||
/// @param s the sequence of labels of edges to add.
|
||||
void add_facet(const std::string& s)
|
||||
{
|
||||
if (facet_started)
|
||||
{
|
||||
std::cerr<<"Polygonal_schema ERROR: "
|
||||
<<"you try to add a new facet"
|
||||
<<" but the previous facet is not yet ended."<<std::endl;
|
||||
return;
|
||||
}
|
||||
init_facet();
|
||||
add_edges_to_facet(s);
|
||||
finish_facet();
|
||||
}
|
||||
|
||||
/// add edges to the current facet,
|
||||
/// given a sequence of labels, as an initializer list.
|
||||
void add_edges_to_facet(std::initializer_list<const char*> l)
|
||||
{
|
||||
if (!facet_started)
|
||||
{
|
||||
std::cerr<<"Polygonal_schema ERROR: "
|
||||
<<"you try to add edges to a facet"
|
||||
<<" but the facet is not yet started."<<std::endl;
|
||||
return;
|
||||
}
|
||||
for (const char* e : l)
|
||||
{ add_edge_to_facet(e); }
|
||||
}
|
||||
|
||||
/// add a new facet, given a sequence of labels, as an initializer list.
|
||||
void add_facet(std::initializer_list<const char*> l)
|
||||
{
|
||||
if (facet_started)
|
||||
{
|
||||
std::cerr<<"Polygonal_schema ERROR: "
|
||||
<<"you try to add a new facet"
|
||||
<<" but the previous facet is not yet ended."<<std::endl;
|
||||
return;
|
||||
}
|
||||
init_facet();
|
||||
add_edges_to_facet(l);
|
||||
finish_facet();
|
||||
}
|
||||
|
||||
/// End of the facet. Return the first dart of this facet.
|
||||
Dart_handle finish_facet()
|
||||
{
|
||||
if (!facet_started)
|
||||
{
|
||||
std::cerr<<"Polygonal_schema ERROR: "
|
||||
<<"you try to end a facet"
|
||||
<<" but the facet is not yet started."<<std::endl;
|
||||
return nullptr;
|
||||
}
|
||||
CGAL_assertion( first_dart!=this->null_handle &&
|
||||
prev_dart!=this->null_handle );
|
||||
this->set_next(prev_dart, first_dart);
|
||||
|
||||
facet_started=false;
|
||||
return first_dart;
|
||||
}
|
||||
|
||||
/// @return dart with the given label, nullptr if this dart does not exist.
|
||||
Dart_handle get_dart_labeled(const std::string& s) const
|
||||
{
|
||||
auto ite=edge_label_to_dart.find(s);
|
||||
if (ite==edge_label_to_dart.end())
|
||||
{ return nullptr; }
|
||||
|
||||
return ite->second;
|
||||
}
|
||||
|
||||
std::string get_label(Dart_handle dh) const
|
||||
{ return internal::Polygonal_schema_tools<Map>::get_label(dh); }
|
||||
|
||||
/// marks the whole facet containing dh as perforated
|
||||
/// @return the number of darts of the marked face
|
||||
size_type perforate_facet(Dart_handle dh)
|
||||
{
|
||||
if (this->is_marked(dh, mark_perforated))
|
||||
{ return 0; }
|
||||
|
||||
return this->template mark_cell<2>(dh, mark_perforated);
|
||||
}
|
||||
|
||||
/// same method but using a label
|
||||
size_type perforate_facet(const std::string& s)
|
||||
{
|
||||
auto ite=edge_label_to_dart.find(s);
|
||||
if (ite==edge_label_to_dart.end())
|
||||
{// maybe there is no need to put an error message
|
||||
std::cerr<<"Polygonal_schema ERROR: "
|
||||
<<"you try to label "<<s<<" to be a border"
|
||||
<<" but this label does not exist yet."<<std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return perforate_facet(ite->second);
|
||||
}
|
||||
|
||||
/// unmark the facet as being perforated, now the facet is filled
|
||||
/// @return the number of darts of the unmarked face
|
||||
size_type fill_facet(Dart_handle dh)
|
||||
{
|
||||
if (!this->is_marked(dh, mark_perforated))
|
||||
{ return 0; }
|
||||
|
||||
return this->template unmark_cell<2>(dh, mark_perforated);
|
||||
}
|
||||
|
||||
/// same fonciton but using a label
|
||||
size_type fill_facet(const std::string& s)
|
||||
{
|
||||
auto ite=edge_label_to_dart.find(s);
|
||||
if (ite==edge_label_to_dart.end())
|
||||
{// maybe there is no need to put an error message
|
||||
std::cerr<<"Polygonal_schema ERROR: "
|
||||
<<"you try to label "<<s<<" to be a non border"
|
||||
<<" but this label does not exist yet."<<std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return fill_facet(ite->second);
|
||||
}
|
||||
|
||||
/// @return true iff dh is on a perforated facet
|
||||
bool is_perforated(Dart_const_handle dh) const
|
||||
{ return this->is_marked(dh, mark_perforated); }
|
||||
|
||||
/// same thing but using a label instead of a dart
|
||||
bool is_perforated(const std::string& s) const
|
||||
{
|
||||
auto ite=edge_label_to_dart.find(s);
|
||||
if (ite==edge_label_to_dart.end())
|
||||
{// maybe there is no need to put an error message
|
||||
std::cerr<<"Polygonal_schema ERROR: "
|
||||
<<"you ask if label "<<s<<" represents a dart border"
|
||||
<<" but this label does not exist yet."<<std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
return is_perforated(ite->second);
|
||||
}
|
||||
|
||||
std::size_t get_perforated_mark() const
|
||||
{ return mark_perforated; }
|
||||
|
||||
void display_perforated_darts() const
|
||||
{
|
||||
std::cout<<"labels is_free<2> is_perforated"<<std::endl;
|
||||
for (auto it=edge_label_to_dart.begin(), itend=edge_label_to_dart.end();
|
||||
it!=itend; ++it)
|
||||
{
|
||||
std::cout<<it->first<<" "<<Self::template is_free<2>(it->second)
|
||||
<<" "<<is_perforated(it->second)<<std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
// For each edge label, its corresponding dart. Stores both association
|
||||
// a -a, to allow users to start to add either a or -a.
|
||||
std::unordered_map<std::string, Dart_handle> edge_label_to_dart;
|
||||
std::size_t mark_perforated; // mark for perforated facets.
|
||||
|
||||
// Data members used when we create a facet.
|
||||
Dart_handle first_dart;
|
||||
Dart_handle prev_dart;
|
||||
bool facet_started;
|
||||
};
|
||||
|
||||
/// Polygonal schema with combinatorial map.
|
||||
template <class Items_=Polygonal_schema_min_items,
|
||||
class Alloc_=CGAL_ALLOCATOR(int),
|
||||
class Storage_= Combinatorial_map_storage_1<2, Items_, Alloc_> >
|
||||
class Polygonal_schema_with_combinatorial_map:
|
||||
public Polygonal_schema_base<CGAL::Combinatorial_map_base
|
||||
<2,
|
||||
Polygonal_schema_with_combinatorial_map<Items_, Alloc_, Storage_>,
|
||||
Items_, Alloc_, Storage_> >
|
||||
{
|
||||
public:
|
||||
typedef Polygonal_schema_with_combinatorial_map<Items_, Alloc_, Storage_> Self;
|
||||
typedef Combinatorial_map_base<2, Self, Items_, Alloc_, Storage_> CMap_base;
|
||||
typedef Polygonal_schema_base<CMap_base> Base;
|
||||
|
||||
typedef typename Base::Dart_handle Dart_handle;
|
||||
typedef typename Base::Dart_const_handle Dart_const_handle;
|
||||
|
||||
Polygonal_schema_with_combinatorial_map() : Base()
|
||||
{}
|
||||
|
||||
Polygonal_schema_with_combinatorial_map(const Self& amap) : Base(amap)
|
||||
{}
|
||||
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2>
|
||||
Polygonal_schema_with_combinatorial_map(const Combinatorial_map_base
|
||||
<d2, Refs2, Items2, Alloc2, Storage2>&
|
||||
amap) : Base(amap)
|
||||
{}
|
||||
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2, typename Converters>
|
||||
Polygonal_schema_with_combinatorial_map(const Combinatorial_map_base
|
||||
<d2, Refs2, Items2, Alloc2, Storage2>&
|
||||
amap, const Converters& converters) :
|
||||
Base(amap, converters)
|
||||
{}
|
||||
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2, typename Converters,
|
||||
typename DartInfoConverter>
|
||||
Polygonal_schema_with_combinatorial_map(const Combinatorial_map_base
|
||||
<d2, Refs2, Items2, Alloc2, Storage2>&
|
||||
amap, const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter) :
|
||||
Base(amap, converters, dartinfoconverter)
|
||||
{}
|
||||
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2, typename Converters,
|
||||
typename DartInfoConverter, typename PointConverter >
|
||||
Polygonal_schema_with_combinatorial_map(const Combinatorial_map_base
|
||||
<d2, Refs2, Items2, Alloc2, Storage2>&
|
||||
amap, const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter,
|
||||
const PointConverter& pointconverter) :
|
||||
Base(amap, converters, dartinfoconverter, pointconverter)
|
||||
{}
|
||||
};
|
||||
|
||||
/// Polygonal schema with generalized map.
|
||||
template <class Items_=Polygonal_schema_min_items,
|
||||
class Alloc_=CGAL_ALLOCATOR(int),
|
||||
class Storage_= Generalized_map_storage_1<2, Items_, Alloc_> >
|
||||
class Polygonal_schema_with_generalized_map:
|
||||
public Polygonal_schema_base<CGAL::Generalized_map_base
|
||||
<2,
|
||||
Polygonal_schema_with_generalized_map<Items_, Alloc_, Storage_>,
|
||||
Items_, Alloc_, Storage_> >
|
||||
{
|
||||
public:
|
||||
typedef Polygonal_schema_with_generalized_map<Items_, Alloc_, Storage_> Self;
|
||||
typedef Generalized_map_base<2, Self, Items_, Alloc_, Storage_> GMap_base;
|
||||
typedef Polygonal_schema_base<GMap_base> Base;
|
||||
|
||||
typedef typename Base::Dart_handle Dart_handle;
|
||||
typedef typename Base::Dart_const_handle Dart_const_handle;
|
||||
|
||||
Polygonal_schema_with_generalized_map() : Base()
|
||||
{}
|
||||
|
||||
Polygonal_schema_with_generalized_map(const Self& amap) : Base(amap)
|
||||
{}
|
||||
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2>
|
||||
Polygonal_schema_with_generalized_map(const Generalized_map_base
|
||||
<d2, Refs2, Items2, Alloc2, Storage2>&
|
||||
amap) : Base(amap)
|
||||
{}
|
||||
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2, typename Converters>
|
||||
Polygonal_schema_with_generalized_map(const Generalized_map_base
|
||||
<d2, Refs2, Items2, Alloc2, Storage2>&
|
||||
amap, const Converters& converters) :
|
||||
Base(amap, converters)
|
||||
{}
|
||||
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2, typename Converters,
|
||||
typename DartInfoConverter>
|
||||
Polygonal_schema_with_generalized_map(const Generalized_map_base
|
||||
<d2, Refs2, Items2, Alloc2, Storage2>&
|
||||
amap, const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter) :
|
||||
Base(amap, converters, dartinfoconverter)
|
||||
{}
|
||||
|
||||
template <unsigned int d2, typename Refs2, typename Items2, typename Alloc2,
|
||||
typename Storage2, typename Converters,
|
||||
typename DartInfoConverter, typename PointConverter >
|
||||
Polygonal_schema_with_generalized_map(const Generalized_map_base
|
||||
<d2, Refs2, Items2, Alloc2, Storage2>&
|
||||
amap, const Converters& converters,
|
||||
const DartInfoConverter& dartinfoconverter,
|
||||
const PointConverter& pointconverter) :
|
||||
Base(amap, converters, dartinfoconverter, pointconverter)
|
||||
{}
|
||||
};
|
||||
|
||||
/// Generate a random polygonal schema ps.
|
||||
/// @param nb_labels the number of labels used to generate ps.
|
||||
/// @param seed the seed used for random
|
||||
/// @param max_dart_per_face maximal number of darts per face
|
||||
/// @param closed if true generates a closed polygonal schema.
|
||||
/// @param percentage_of_perforated percentage of perforated faces. If 0
|
||||
/// no perforated faces.
|
||||
template<typename PS>
|
||||
void generate_random_polygonal_schema(PS& ps, std::size_t nb_labels,
|
||||
unsigned int seed
|
||||
=static_cast<unsigned int>(std::time(nullptr)),
|
||||
std::size_t max_dart_per_face=30,
|
||||
bool closed=true,
|
||||
std::size_t percentage_of_perforated=20)
|
||||
{
|
||||
CGAL::Random random(seed);
|
||||
std::vector<std::string> all_labels(nb_labels*2);
|
||||
for (std::size_t i=0; i<nb_labels; ++i)
|
||||
{
|
||||
all_labels[2*i]=std::to_string(static_cast<int>(i)+1);
|
||||
all_labels[(2*i)+1]=std::to_string(-(static_cast<int>(i)+1));
|
||||
}
|
||||
|
||||
std::shuffle(all_labels.begin(), all_labels.end(),
|
||||
std::default_random_engine(seed));
|
||||
|
||||
std::size_t endlabel=all_labels.size();
|
||||
if (!closed)
|
||||
{ endlabel-=(all_labels.size()/10); } // We remove 10% of labels.
|
||||
|
||||
for (std::size_t i=0; i<endlabel; )
|
||||
{
|
||||
ps.init_facet();
|
||||
for (std::size_t j=0,
|
||||
nb=static_cast<std::size_t>
|
||||
(random.get_int(1, static_cast<int>(max_dart_per_face)));
|
||||
i<endlabel && j<nb; ++i, ++j)
|
||||
{ ps.add_edges_to_facet(all_labels[i]); }
|
||||
typename PS::Dart_handle dh=ps.finish_facet();
|
||||
|
||||
if (static_cast<std::size_t>(rand()%100)<percentage_of_perforated)
|
||||
{ ps.perforate_facet(dh); }
|
||||
}
|
||||
|
||||
ps.keep_biggest_connected_component(); // We keep only the biggest cc.
|
||||
}
|
||||
|
||||
} //namespace Surface_mesh_topology
|
||||
} //namespace CGAL
|
||||
|
||||
#endif // CGAL_POLYGONAL_SCHEMA_H //
|
||||
// EOF //
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
// Copyright (c) 2019 CNRS and LIRIS' Establishments (France).
|
||||
// All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org).
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
|
||||
//
|
||||
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
|
||||
//
|
||||
#ifndef CGAL_POLYGONAL_SCHEMA_MIN_ITEMS_H
|
||||
#define CGAL_POLYGONAL_SCHEMA_MIN_ITEMS_H 1
|
||||
|
||||
#include <CGAL/license/Surface_mesh_topology.h>
|
||||
#include <string>
|
||||
|
||||
namespace CGAL {
|
||||
namespace Surface_mesh_topology {
|
||||
|
||||
/** @file Polygonal_schema_min_items.h
|
||||
* Definition of min item class for Polygonal_schema.
|
||||
*/
|
||||
|
||||
/** Minimal items for polygonal schema.
|
||||
* Generic_map_min_items defines what is the minimal item class for a generic map.
|
||||
* One struct associated with darts, having one std::string named m_label..
|
||||
*/
|
||||
struct Polygonal_schema_min_items
|
||||
{
|
||||
template < class Refs >
|
||||
struct Dart_wrapper
|
||||
{
|
||||
struct Info_for_darts
|
||||
{ std::string m_label; };
|
||||
|
||||
typedef Info_for_darts Dart_info;
|
||||
};
|
||||
};
|
||||
|
||||
} // namespace Surface_mesh_topology
|
||||
} // namespace CGAL
|
||||
|
||||
#endif // CGAL_POLYGONAL_SCHEMA_MIN_ITEMS_H
|
||||
// EOF //
|
||||
|
|
@ -0,0 +1,231 @@
|
|||
// Copyright (c) 2019 CNRS and LIRIS' Establishments (France).
|
||||
// All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org).
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
|
||||
//
|
||||
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
|
||||
//
|
||||
#ifndef CGAL_PATH_GENERATORS_H
|
||||
#define CGAL_PATH_GENERATORS_H 1
|
||||
|
||||
#include <CGAL/license/Surface_mesh_topology.h>
|
||||
|
||||
#include <CGAL/Random.h>
|
||||
#include <unordered_set>
|
||||
#include <unordered_map>
|
||||
#include <cstdlib>
|
||||
|
||||
namespace CGAL {
|
||||
namespace Surface_mesh_topology {
|
||||
namespace internal {
|
||||
|
||||
template<typename Path>
|
||||
void create_braket_positive(Path& p, std::size_t length, CGAL::Random& random,
|
||||
bool update_isclosed=true)
|
||||
{
|
||||
if (p.is_empty())
|
||||
{ p.initialize_random_starting_dart(random, false); }
|
||||
|
||||
p.extend_positive_turn(1, false);
|
||||
p.extend_straight_positive(length, false);
|
||||
p.extend_positive_turn(1, false);
|
||||
if (update_isclosed) { p.update_is_closed(); }
|
||||
}
|
||||
|
||||
template<typename Path>
|
||||
void create_braket_positive(Path& p, std::size_t length,
|
||||
bool update_isclosed=true)
|
||||
{
|
||||
CGAL::Random random;
|
||||
create_braket_positive(p, length, random, update_isclosed);
|
||||
}
|
||||
|
||||
template<typename Path>
|
||||
void create_braket_negative(Path& p, std::size_t length, CGAL::Random& random,
|
||||
bool update_isclosed=true)
|
||||
{
|
||||
if (p.is_empty())
|
||||
{ p.initialize_random_starting_dart(random, false); }
|
||||
|
||||
p.extend_negative_turn(1, false);
|
||||
p.extend_straight_negative(length, false);
|
||||
p.extend_negative_turn(1, false);
|
||||
if (update_isclosed) { p.update_is_closed(); }
|
||||
}
|
||||
|
||||
template<typename Path>
|
||||
void create_braket_negative(Path& p, std::size_t length,
|
||||
bool update_isclosed=true)
|
||||
{
|
||||
CGAL::Random random;
|
||||
create_braket_negative(p, length, random, update_isclosed);
|
||||
}
|
||||
|
||||
template<typename Path>
|
||||
void generate_random_positive_bracket(Path& path,
|
||||
std::size_t nb1,
|
||||
std::size_t nb2, std::size_t nb3,
|
||||
CGAL::Random& random)
|
||||
{
|
||||
path.clear();
|
||||
path.initialize_random_starting_dart(random);
|
||||
path.extend_straight_positive(nb1-1);
|
||||
create_braket_positive(path, nb2);
|
||||
path.extend_straight_positive(nb3);
|
||||
path.generate_random_path(random.get_int(0, 15), random);
|
||||
}
|
||||
|
||||
template<typename LCC>
|
||||
typename LCC::Dart_const_handle
|
||||
generate_random_connected_set_of_faces(const LCC& lcc, std::size_t nb,
|
||||
CGAL::Random& random,
|
||||
std::unordered_set
|
||||
<typename LCC::Dart_const_handle>& set,
|
||||
typename LCC::size_type amark)
|
||||
{
|
||||
set.clear();
|
||||
if (lcc.is_empty()) { return NULL; }
|
||||
|
||||
std::unordered_map<std::size_t, typename LCC::Dart_const_handle> border_faces;
|
||||
|
||||
std::size_t index=static_cast<std::size_t>
|
||||
(random.get_int(0, static_cast<int>(lcc.darts().capacity())));
|
||||
while (!lcc.darts().is_used(index))
|
||||
{
|
||||
++index;
|
||||
if (index==lcc.darts().capacity()) { index=0; }
|
||||
}
|
||||
|
||||
typename LCC::Dart_const_handle dh1=lcc.darts().iterator_to(lcc.darts()[index]);
|
||||
border_faces[0]=dh1;
|
||||
set.insert(dh1);
|
||||
lcc.template mark_cell<2>(dh1, amark);
|
||||
|
||||
for (std::size_t i=1; i<nb; ++i)
|
||||
{
|
||||
std::size_t facenumber=static_cast<std::size_t>
|
||||
(random.get_int
|
||||
(0, static_cast<int>(border_faces.size())));
|
||||
int nbborder=0;
|
||||
|
||||
typename LCC::Dart_const_handle dh1_init=border_faces[facenumber];
|
||||
dh1=dh1_init;
|
||||
do
|
||||
{
|
||||
if (!lcc.template is_free<2>(dh1) &&
|
||||
!lcc.is_marked(lcc.template beta<2>(dh1), amark))
|
||||
{ ++nbborder; }
|
||||
dh1=lcc.template beta<1>(dh1);
|
||||
}
|
||||
while (dh1!=dh1_init);
|
||||
|
||||
while(lcc.template is_free<2>(dh1) ||
|
||||
lcc.is_marked(lcc.template beta<2>(dh1), amark))
|
||||
{ dh1=lcc.template beta<1>(dh1); }
|
||||
|
||||
std::size_t dartnumber=static_cast<std::size_t>(random.get_int(0, nbborder));
|
||||
for (std::size_t j=0; j<dartnumber;)
|
||||
{
|
||||
if (!lcc.template is_free<2>(dh1) &&
|
||||
!lcc.is_marked(lcc.template beta<2>(dh1), amark))
|
||||
{ ++j; }
|
||||
dh1=lcc.template beta<1>(dh1);
|
||||
while(lcc.template is_free<2>(dh1) ||
|
||||
lcc.is_marked(lcc.template beta<2>(dh1), amark))
|
||||
{ dh1=lcc.template beta<1>(dh1); }
|
||||
}
|
||||
|
||||
// Here we have a new face
|
||||
set.insert(lcc.template beta<2>(dh1));
|
||||
lcc.template mark_cell<2>(lcc.template beta<2>(dh1), amark);
|
||||
|
||||
// We add it in the list of borders faces
|
||||
border_faces[border_faces.size()]=lcc.template beta<2>(dh1);
|
||||
|
||||
// Then we update the list of border faces (because some of them could be
|
||||
// no more border due to the adding of the new face)
|
||||
std::unordered_map<std::size_t, typename LCC::Dart_const_handle>
|
||||
border_faces_new;
|
||||
for (typename std::unordered_map<std::size_t,
|
||||
typename LCC::Dart_const_handle>::iterator it=border_faces.begin(),
|
||||
itend=border_faces.end(); it!=itend; ++it)
|
||||
{
|
||||
bool isborder=false;
|
||||
dh1=it->second;
|
||||
do
|
||||
{
|
||||
if (!lcc.template is_free<2>(dh1) &&
|
||||
!lcc.is_marked(lcc.template beta<2>(dh1), amark))
|
||||
{ isborder=true; }
|
||||
else
|
||||
{ dh1=lcc.template beta<1>(dh1); }
|
||||
}
|
||||
while(!isborder && dh1!=it->second);
|
||||
if (isborder)
|
||||
{ border_faces_new[border_faces_new.size()]=dh1; }
|
||||
}
|
||||
std::swap(border_faces, border_faces_new);
|
||||
|
||||
if (border_faces.size()==0)
|
||||
{ return NULL; }
|
||||
}
|
||||
|
||||
assert (border_faces.size()!=0);
|
||||
typename LCC::Dart_const_handle dhres=border_faces[0];
|
||||
while(lcc.template is_free<2>(dhres) ||
|
||||
lcc.is_marked(lcc.template beta<2>(dhres), amark))
|
||||
{ dhres=lcc.template beta<1>(dhres); }
|
||||
|
||||
return dhres;
|
||||
}
|
||||
|
||||
template<typename Path>
|
||||
void generate_random_closed_path(Path& p, std::size_t nb,
|
||||
CGAL::Random& random)
|
||||
{
|
||||
std::unordered_set<typename Path::Map::Dart_const_handle> faces;
|
||||
typename Path::Map::size_type amark=p.get_map().get_new_mark();
|
||||
|
||||
typename Path::Map::Dart_const_handle dhi=
|
||||
generate_random_connected_set_of_faces(p.get_map(), nb, random,
|
||||
faces, amark);
|
||||
|
||||
if (dhi==NULL)
|
||||
{
|
||||
p.get_map().free_mark(amark);
|
||||
return; // We have selected all the faces.
|
||||
}
|
||||
|
||||
typename Path::Map::Dart_const_handle dh=dhi;
|
||||
do
|
||||
{
|
||||
CGAL_assertion(p.get_map().template is_free<2>(dh) ||
|
||||
!p.get_map().is_marked(p.get_map().template beta<2>(dh), amark));
|
||||
p.push_back(dh, false);
|
||||
dh=p.get_map().template beta<1>(dh);
|
||||
while(!p.get_map().template is_free<2>(dh) &&
|
||||
p.get_map().is_marked(p.get_map().template beta<2>(dh), amark))
|
||||
{ dh=p.get_map().template beta<2, 1>(dh); }
|
||||
}
|
||||
while(dh!=dhi);
|
||||
|
||||
for (typename std::template unordered_set<typename Path::Map::Dart_const_handle>::iterator
|
||||
it=faces.begin(), itend=faces.end(); it!=itend; ++it)
|
||||
{ p.get_map().template unmark_cell<2>(*it, amark); }
|
||||
|
||||
p.get_map().free_mark(amark);
|
||||
|
||||
p.update_is_closed();
|
||||
CGAL_assertion(p.is_closed());
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
} // namespace Surface_mesh_topology
|
||||
} // namespace CGAL
|
||||
|
||||
#endif // CGAL_PATH_GENERATORS_H //
|
||||
// EOF //
|
||||
|
|
@ -0,0 +1,386 @@
|
|||
// Copyright (c) 2019 CNRS and LIRIS' Establishments (France).
|
||||
// All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org).
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
|
||||
//
|
||||
// Author(s) : Guillaume Damiand <guillaume.damiand@liris.cnrs.fr>
|
||||
//
|
||||
#ifndef CGAL_DRAW_FACE_GRAPH_WITH_PATHS_H
|
||||
#define CGAL_DRAW_FACE_GRAPH_WITH_PATHS_H
|
||||
|
||||
#include <CGAL/license/Surface_mesh_topology.h>
|
||||
|
||||
#include <CGAL/draw_linear_cell_complex.h>
|
||||
|
||||
#ifdef CGAL_USE_BASIC_VIEWER
|
||||
|
||||
#include <CGAL/Random.h>
|
||||
#include <CGAL/Path_on_surface.h>
|
||||
|
||||
namespace CGAL {
|
||||
|
||||
// Specialisation for face graph; otherwise use the LCC_geom_utils of LCC.
|
||||
template<class Mesh, class Kernel>
|
||||
struct LCC_geom_utils<CGAL::Face_graph_wrapper<Mesh>, Kernel, 3>
|
||||
{
|
||||
static typename Kernel::Vector_3
|
||||
get_face_normal(const CGAL::Face_graph_wrapper<Mesh>& mesh,
|
||||
typename CGAL::Face_graph_wrapper<Mesh>::Dart_const_handle dh)
|
||||
{
|
||||
typename Get_traits<Mesh>::Vector normal(CGAL::NULL_VECTOR);
|
||||
const typename Get_traits<Mesh>::Point*
|
||||
curr=&Get_traits<Mesh>::get_point(mesh.get_fg(), dh);
|
||||
typename CGAL::Face_graph_wrapper<Mesh>::Dart_const_handle adart=dh;
|
||||
unsigned int nb=0;
|
||||
|
||||
do
|
||||
{
|
||||
const typename Get_traits<Mesh>::Point*
|
||||
next=&Get_traits<Mesh>::get_point(mesh.get_fg(),
|
||||
mesh.other_extremity(adart));
|
||||
internal::newell_single_step_3_for_lcc(*curr, *next, normal);
|
||||
++nb;
|
||||
curr=next;
|
||||
adart=mesh.next(adart);
|
||||
}
|
||||
while(adart!=dh);
|
||||
|
||||
assert(nb>0);
|
||||
return (typename Get_traits<Mesh>::Kernel::
|
||||
Construct_scaled_vector_3()(normal, 1.0/nb));
|
||||
}
|
||||
static typename Kernel::Vector_3
|
||||
get_vertex_normal(const CGAL::Face_graph_wrapper<Mesh>& mesh,
|
||||
typename CGAL::Face_graph_wrapper<Mesh>::Dart_const_handle dh)
|
||||
{
|
||||
typename Get_traits<Mesh>::Vector normal(CGAL::NULL_VECTOR);
|
||||
unsigned int nb = 0;
|
||||
|
||||
for ( typename CGAL::Face_graph_wrapper<Mesh>::template Dart_of_cell_range<0>::
|
||||
const_iterator it=mesh.template darts_of_cell<0>(dh).begin(),
|
||||
itend=mesh.template darts_of_cell<0>(dh).end(); it!=itend; ++it )
|
||||
{
|
||||
normal=typename Get_traits<Mesh>::Kernel::Construct_sum_of_vectors_3()
|
||||
(normal, get_face_normal(mesh, it));
|
||||
++nb;
|
||||
}
|
||||
|
||||
if ( nb<2 ) return normal;
|
||||
return (typename Get_traits<Mesh>::Kernel::
|
||||
Construct_scaled_vector_3()(normal, 1.0/nb));
|
||||
}
|
||||
};
|
||||
|
||||
// Viewer class for Face_graph with paths.
|
||||
template<class Mesh, class DrawingFunctorLCC>
|
||||
class Face_graph_with_path_viewer : public Basic_viewer_qt
|
||||
{
|
||||
typedef Basic_viewer_qt Base;
|
||||
typedef typename Get_map<Mesh, Mesh>::type LCC;
|
||||
typedef typename LCC::Dart_const_handle Dart_const_handle;
|
||||
typedef typename CGAL::Get_traits<Mesh>::Kernel Kernel;
|
||||
typedef typename CGAL::Get_traits<Mesh>::Point Point;
|
||||
typedef typename CGAL::Get_traits<Mesh>::Vector Vector;
|
||||
|
||||
public:
|
||||
/// Construct the viewer.
|
||||
/// @param alcc the lcc to view
|
||||
/// @param title the title of the window
|
||||
/// @param anofaces if true, do not draw faces (faces are not computed;
|
||||
/// this can be usefull for very big object where this time could be long)
|
||||
Face_graph_with_path_viewer(QWidget* parent,
|
||||
const Mesh& amesh,
|
||||
const std::vector
|
||||
<Surface_mesh_topology::Path_on_surface<Mesh> >
|
||||
*paths=nullptr,
|
||||
std::size_t amark=LCC::INVALID_MARK,
|
||||
const char* title="", bool anofaces=false,
|
||||
const DrawingFunctorLCC&
|
||||
drawing_functor=DrawingFunctorLCC()) :
|
||||
Base(parent, title, true, true, true, false, true),
|
||||
mesh(amesh),
|
||||
lcc(amesh),
|
||||
m_nofaces(anofaces),
|
||||
m_drawing_functor(drawing_functor),
|
||||
m_paths(paths),
|
||||
m_current_path(m_paths->size()),
|
||||
m_current_dart(0),
|
||||
m_draw_marked_darts(true),
|
||||
m_amark(amark==std::numeric_limits<std::size_t>::max()?
|
||||
LCC::INVALID_MARK:amark)
|
||||
{
|
||||
m_current_dart=lcc.number_of_darts(); compute_elements();
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
const Point& get_point(Dart_const_handle dh) const
|
||||
{ return CGAL::Get_traits<Mesh>::get_point(mesh, dh); }
|
||||
|
||||
void compute_elements()
|
||||
{
|
||||
clear();
|
||||
|
||||
typename LCC::size_type markfaces = lcc.get_new_mark();
|
||||
typename LCC::size_type markedges = lcc.get_new_mark();
|
||||
typename LCC::size_type markvertices = lcc.get_new_mark();
|
||||
|
||||
if (m_current_dart!=lcc.number_of_darts())
|
||||
{ // We want to draw only one dart
|
||||
if (lcc.darts().is_used(m_current_dart))
|
||||
{
|
||||
Dart_const_handle selected_dart=lcc.dart_handle(m_current_dart);
|
||||
compute_edge(selected_dart, CGAL::Color(255,0,0));
|
||||
lcc.template mark_cell<1>(selected_dart, markedges);
|
||||
compute_vertex(selected_dart);
|
||||
|
||||
if ( !m_nofaces )
|
||||
{ compute_face(selected_dart); }
|
||||
}
|
||||
|
||||
for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(),
|
||||
itend=lcc.darts().end(); it!=itend; ++it )
|
||||
{
|
||||
if ( !lcc.is_marked(it, markedges) )
|
||||
{
|
||||
compute_edge(it);
|
||||
lcc.template mark_cell<1>(it, markedges);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_current_path==m_paths->size())
|
||||
{
|
||||
for (std::size_t i=0; i<m_paths->size(); ++i)
|
||||
{ compute_path(i, markedges); }
|
||||
}
|
||||
else if (m_current_path!=m_paths->size()+1)
|
||||
{ compute_path(m_current_path, markedges); }
|
||||
|
||||
for (typename LCC::Dart_range::const_iterator it=lcc.darts().begin(),
|
||||
itend=lcc.darts().end(); it!=itend; ++it )
|
||||
{
|
||||
if ( !m_nofaces && !lcc.is_marked(it, markfaces) )
|
||||
{
|
||||
compute_face(it);
|
||||
lcc.template mark_cell<2>(it, markfaces);
|
||||
}
|
||||
|
||||
if ( !lcc.is_marked(it, markedges) )
|
||||
{
|
||||
compute_edge(it);
|
||||
lcc.template mark_cell<1>(it, markedges);
|
||||
}
|
||||
|
||||
/*if ( !lcc.is_marked(it, markvertices) )
|
||||
{
|
||||
compute_vertex(it);
|
||||
lcc.template mark_cell<0>(it, markvertices);
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
lcc.free_mark(markfaces);
|
||||
lcc.free_mark(markedges);
|
||||
lcc.free_mark(markvertices);
|
||||
}
|
||||
|
||||
void compute_face(Dart_const_handle dh)
|
||||
{
|
||||
// We fill only closed faces.
|
||||
Dart_const_handle cur=dh;
|
||||
Dart_const_handle min=dh;
|
||||
do
|
||||
{
|
||||
if (!lcc.is_next_exist(cur)) return; // open face=>not filled
|
||||
if (cur<min) min=cur;
|
||||
cur=lcc.next(cur);
|
||||
}
|
||||
while(cur!=dh);
|
||||
|
||||
// CGAL::Color c=m_fcolor.run(*lcc, dh);
|
||||
face_begin(); //c);
|
||||
|
||||
cur=dh;
|
||||
do
|
||||
{
|
||||
add_point_in_face(get_point(cur),
|
||||
LCC_geom_utils<LCC, Local_kernel>::
|
||||
get_vertex_normal(lcc, cur));
|
||||
cur=lcc.next(cur);
|
||||
}
|
||||
while(cur!=dh);
|
||||
|
||||
face_end();
|
||||
}
|
||||
|
||||
void compute_edge(Dart_const_handle dh)
|
||||
{
|
||||
Point p1 = get_point(dh);
|
||||
Dart_const_handle d2 = lcc.other_extremity(dh);
|
||||
if (d2!=LCC::null_handle)
|
||||
{
|
||||
if (m_draw_marked_darts && m_amark!=LCC::INVALID_MARK &&
|
||||
(lcc.is_marked(dh, m_amark) || lcc.is_marked(lcc.beta(dh, 2), m_amark)))
|
||||
{ add_segment(p1, get_point(d2), CGAL::Color(0, 0, 255)); }
|
||||
else
|
||||
{ add_segment(p1, get_point(d2)); }
|
||||
}
|
||||
}
|
||||
|
||||
void compute_edge(Dart_const_handle dh, const CGAL::Color& color)
|
||||
{
|
||||
Point p1 = get_point(dh);
|
||||
Dart_const_handle d2 = lcc.other_extremity(dh);
|
||||
if (d2!=LCC::null_handle)
|
||||
{ add_segment(p1, get_point(d2), color); }
|
||||
}
|
||||
|
||||
void compute_vertex(Dart_const_handle dh)
|
||||
{ add_point(get_point(dh)); }
|
||||
|
||||
virtual void keyPressEvent(QKeyEvent *e)
|
||||
{
|
||||
const ::Qt::KeyboardModifiers modifiers = e->modifiers();
|
||||
|
||||
if ((e->key()==::Qt::Key_D) && (modifiers==::Qt::NoButton))
|
||||
{
|
||||
m_current_dart=(m_current_dart+1)%(lcc.number_of_darts()+1);
|
||||
if (m_current_dart==lcc.number_of_darts())
|
||||
{
|
||||
displayMessage(QString("Draw all darts."));
|
||||
}
|
||||
else
|
||||
{
|
||||
displayMessage(QString("Draw dart=%1.").arg((m_current_dart)));
|
||||
}
|
||||
compute_elements();
|
||||
redraw();
|
||||
}
|
||||
else if ((e->key()==::Qt::Key_M) && (modifiers==::Qt::NoButton))
|
||||
{
|
||||
m_draw_marked_darts=!m_draw_marked_darts;
|
||||
|
||||
if (m_draw_marked_darts)
|
||||
{ displayMessage(QString("Draw marked darts in blue.")); }
|
||||
else
|
||||
{
|
||||
displayMessage(QString("Do not draw marked darts in different color."));
|
||||
}
|
||||
compute_elements();
|
||||
redraw();
|
||||
}
|
||||
else if ((e->key()==::Qt::Key_N) && (modifiers==::Qt::NoButton))
|
||||
{
|
||||
m_current_path=(m_current_path+1)%(m_paths->size()+2);
|
||||
if (m_current_path==m_paths->size())
|
||||
{ displayMessage(QString("Draw all paths.")); }
|
||||
else if (m_current_path==m_paths->size()+1)
|
||||
{ displayMessage(QString("Do not draw paths.")); }
|
||||
else
|
||||
{ displayMessage(QString("Draw path=%1, nb_darts=%2.").
|
||||
arg(m_current_path).
|
||||
arg((*m_paths)[m_current_path].length())); }
|
||||
compute_elements();
|
||||
redraw();
|
||||
}
|
||||
else if ((e->key()==::Qt::Key_P) && (modifiers==::Qt::NoButton))
|
||||
{
|
||||
m_current_dart=(m_current_dart==0?lcc.number_of_darts():
|
||||
m_current_dart-1);
|
||||
if (m_current_dart==lcc.number_of_darts())
|
||||
{
|
||||
displayMessage(QString("Draw all darts."));
|
||||
}
|
||||
else
|
||||
{
|
||||
displayMessage(QString("Draw dart=%1.").arg((m_current_dart)));
|
||||
}
|
||||
compute_elements();
|
||||
redraw();
|
||||
}
|
||||
else
|
||||
{ Base::keyPressEvent(e); }
|
||||
}
|
||||
|
||||
void compute_path(std::size_t i, typename LCC::size_type amark)
|
||||
{
|
||||
if ((*m_paths)[i].is_empty())
|
||||
{ return; }
|
||||
|
||||
CGAL::Random random(static_cast<unsigned int>(i));
|
||||
CGAL::Color color=get_random_color(random);
|
||||
|
||||
add_point(get_point((*m_paths)[i].get_ith_dart(0)), color);
|
||||
for (std::size_t j=0; j<(*m_paths)[i].length(); ++j)
|
||||
{
|
||||
if ( !lcc.is_marked( (*m_paths)[i].get_ith_dart(j), amark) )
|
||||
{
|
||||
compute_edge((*m_paths)[i].get_ith_dart(j), color);
|
||||
lcc.template mark_cell<1>((*m_paths)[i].get_ith_dart(j), amark);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
const Mesh& mesh;
|
||||
const typename Get_map<Mesh, Mesh>::storage_type lcc;
|
||||
bool m_nofaces;
|
||||
const DrawingFunctorLCC& m_drawing_functor;
|
||||
const std::vector<Surface_mesh_topology::Path_on_surface<Mesh> >* m_paths;
|
||||
std::size_t m_current_path;
|
||||
std::size_t m_current_dart;
|
||||
bool m_draw_marked_darts;
|
||||
typename LCC::size_type m_amark; // If !=INVALID_MARK, show darts marked with this mark
|
||||
};
|
||||
|
||||
template<class Mesh, class DrawingFunctor>
|
||||
void draw(const Mesh& alcc,
|
||||
const std::vector<Surface_mesh_topology::Path_on_surface<Mesh> >& paths,
|
||||
const char* title="Mesh Viewer",
|
||||
std::size_t amark=std::numeric_limits<std::size_t>::max(),
|
||||
bool nofill=false,
|
||||
const DrawingFunctor& drawing_functor=DrawingFunctor())
|
||||
{
|
||||
#if defined(CGAL_TEST_SUITE)
|
||||
bool cgal_test_suite=true;
|
||||
#else
|
||||
bool cgal_test_suite=qEnvironmentVariableIsSet("CGAL_TEST_SUITE");
|
||||
#endif
|
||||
|
||||
if (!cgal_test_suite)
|
||||
{
|
||||
int argc=1;
|
||||
const char* argv[2]={"lccviewer","\0"};
|
||||
QApplication app(argc,const_cast<char**>(argv));
|
||||
Face_graph_with_path_viewer<Mesh, DrawingFunctor> mainwindow(app.activeWindow(),
|
||||
alcc, &paths, amark,
|
||||
title, nofill,
|
||||
drawing_functor);
|
||||
mainwindow.show();
|
||||
app.exec();
|
||||
}
|
||||
}
|
||||
|
||||
template<class Mesh>
|
||||
void draw(const Mesh& alcc,
|
||||
const std::vector<Surface_mesh_topology::Path_on_surface<Mesh> >& paths,
|
||||
const char* title="LCC Viewer",
|
||||
std::size_t amark=std::numeric_limits<std::size_t>::max(),
|
||||
bool nofill=false)
|
||||
{
|
||||
DefaultDrawingFunctorLCC f;
|
||||
return draw<Mesh, DefaultDrawingFunctorLCC>(alcc, paths, title,
|
||||
amark, nofill, f);
|
||||
}
|
||||
|
||||
} // End namespace CGAL
|
||||
|
||||
#endif // CGAL_USE_BASIC_VIEWER
|
||||
|
||||
#endif // CGAL_DRAW_FACE_GRAPH_WITH_PATHS_H
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
Algebraic_foundations
|
||||
Arithmetic_kernel
|
||||
BGL
|
||||
Cartesian_kernel
|
||||
Circulator
|
||||
Combinatorial_map
|
||||
Distance_2
|
||||
Distance_3
|
||||
Filtered_kernel
|
||||
Generalized_map
|
||||
GraphicsView
|
||||
Hash_map
|
||||
Homogeneous_kernel
|
||||
Installation
|
||||
Intersections_2
|
||||
Intersections_3
|
||||
Interval_support
|
||||
Kernel_23
|
||||
Kernel_d
|
||||
Linear_cell_complex
|
||||
Modular_arithmetic
|
||||
Number_types
|
||||
Profiling_tools
|
||||
Property_map
|
||||
Random_numbers
|
||||
STL_Extension
|
||||
Stream_support
|
||||
Surface_mesh_topology
|
||||
|
|
@ -0,0 +1 @@
|
|||
Implementation of topological algorithms on surface meshes.
|
||||
|
|
@ -0,0 +1 @@
|
|||
GPL (v3 or later)
|
||||