diff --git a/.gitattributes b/.gitattributes index 0af52d0378c..441b78ba3b9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1482,6 +1482,7 @@ Straight_skeleton_2/demo/Straight_skeleton_2/data/square.poly -text Straight_skeleton_2/demo/Straight_skeleton_2/data/triangle.poly -text Straight_skeleton_2/demo/Straight_skeleton_2/data/vertex_event_0.poly -text Straight_skeleton_2/demo/Straight_skeleton_2/data/vertex_event_9.poly -text +Straight_skeleton_2/demo/Straight_skeleton_2/definitions.h -text Straight_skeleton_2/doc_tex/Straight_skeleton_2/fig0.eps -text Straight_skeleton_2/doc_tex/Straight_skeleton_2/fig0.pdf -text Straight_skeleton_2/doc_tex/Straight_skeleton_2/fig0.png -text @@ -1517,14 +1518,34 @@ Straight_skeleton_2/test/Straight_skeleton_2/data/alley_2.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/alley_3.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/closer_edge_event_0.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/closer_edge_event_1.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate0.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate1.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate10.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate11.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate12.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate2.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate3.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate4.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate5.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate6.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate7.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate8.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate9.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate_multinode0.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/double_edge.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/double_split.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/hole.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/make_list -text Straight_skeleton_2/test/Straight_skeleton_2/data/masked_double_split.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/multinode1.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/parallels0.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/parallels0_b.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/rectangle.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/region_4.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/sample_0.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/sample_1.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/sample_101.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/sample_102.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/sample_147.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/sample_2.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/sample_235.poly -text @@ -1542,6 +1563,7 @@ Straight_skeleton_2/test/Straight_skeleton_2/data/sample_698.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/sample_73.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/sample_85.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/single_split.poly -text +Straight_skeleton_2/test/Straight_skeleton_2/data/split_at_zero_0.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/square.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/triangle.poly -text Straight_skeleton_2/test/Straight_skeleton_2/data/vertex_event_0.poly -text diff --git a/Straight_skeleton_2/demo/Straight_skeleton_2/Active_canvas.kdevelop b/Straight_skeleton_2/demo/Straight_skeleton_2/Active_canvas.kdevelop index 9000940f12b..9d4eee292b8 100644 --- a/Straight_skeleton_2/demo/Straight_skeleton_2/Active_canvas.kdevelop +++ b/Straight_skeleton_2/demo/Straight_skeleton_2/Active_canvas.kdevelop @@ -33,7 +33,7 @@ 0 false - CGAL_MAKEFILE=/home/fcacciola/Programming/CGAL/make/makefile_i686_Linux-2.6_g++-3.3.5 + CGAL_MAKEFILE=/home/fcacciola/Programming/CGAL/make/makefile_i686_Linux-2.6_g++-4.0.2 default diff --git a/Straight_skeleton_2/demo/Straight_skeleton_2/Straight_skeleton_2.kdevelop b/Straight_skeleton_2/demo/Straight_skeleton_2/Straight_skeleton_2.kdevelop index dc78e8d9d00..dffcaee9aab 100644 --- a/Straight_skeleton_2/demo/Straight_skeleton_2/Straight_skeleton_2.kdevelop +++ b/Straight_skeleton_2/demo/Straight_skeleton_2/Straight_skeleton_2.kdevelop @@ -33,12 +33,10 @@ 0 false - DEBUGGING=yes + CGAL_MAKEFILE=/home/fcacciola/Programming/CGAL/make/makefile_i686_Linux-2.6_g++-4.0.2 DEBUGGING=yes default - - - + diff --git a/Straight_skeleton_2/demo/Straight_skeleton_2/definitions.h b/Straight_skeleton_2/demo/Straight_skeleton_2/definitions.h new file mode 100644 index 00000000000..ba2cd3b5a7a --- /dev/null +++ b/Straight_skeleton_2/demo/Straight_skeleton_2/definitions.h @@ -0,0 +1,2 @@ +//#define SLS_DEMO_FAST +//#define SLS_DEMO_EXACT diff --git a/Straight_skeleton_2/demo/Straight_skeleton_2/makefile b/Straight_skeleton_2/demo/Straight_skeleton_2/makefile index f011615920f..f5eeac05073 100755 --- a/Straight_skeleton_2/demo/Straight_skeleton_2/makefile +++ b/Straight_skeleton_2/demo/Straight_skeleton_2/makefile @@ -5,7 +5,7 @@ # include platform specific settings #---------------------------------------------------------------------# # Choose the right include file from the /make directory. -CGAL_MAKEFILE=c:/cgal/CGAL-3.2-I-361/make/makefile_i686_CYGWINNT-5.1_CL.EXE-1310 +#CGAL_MAKEFILE=c:/cgal/CGAL-3.2-I-361/make/makefile_i686_CYGWINNT-5.1_CL.EXE-1310 include $(CGAL_MAKEFILE) #---------------------------------------------------------------------# diff --git a/Straight_skeleton_2/demo/Straight_skeleton_2/ss_types.h b/Straight_skeleton_2/demo/Straight_skeleton_2/ss_types.h index 2969528a4cd..43f5bb4629b 100644 --- a/Straight_skeleton_2/demo/Straight_skeleton_2/ss_types.h +++ b/Straight_skeleton_2/demo/Straight_skeleton_2/ss_types.h @@ -23,19 +23,19 @@ namespace demo { -typedef CGAL::Straight_skeleton_2 Sls; -typedef CGAL::Straight_skeleton_builder_traits_2 SlsBuilderTraits; -typedef CGAL::Straight_skeleton_builder_2 SlsBuilder; +typedef CGAL::Straight_skeleton_2 SSkel; +typedef CGAL::Straight_skeleton_builder_traits_2 SSkelBuilderTraits; +typedef CGAL::Straight_skeleton_builder_2 SSkelBuilder; -typedef CGAL::Polygon_offset_builder_traits_2 OffsetBuilderTraits; -typedef CGAL::Polygon_offset_builder_2 OffsetBuilder; +typedef CGAL::Polygon_offset_builder_traits_2 OffsetBuilderTraits; +typedef CGAL::Polygon_offset_builder_2 OffsetBuilder; -typedef Sls::Halfedge_iterator Halfedge_iterator; -typedef Sls::Vertex_handle Vertex_handle; -typedef Sls::Face_const_iterator Face_const_iterator; -typedef Sls::Halfedge_const_handle Halfedge_const_handle ; -typedef Sls::Vertex_const_handle Vertex_const_handle ; +typedef SSkel::Halfedge_iterator Halfedge_iterator; +typedef SSkel::Vertex_handle Vertex_handle; +typedef SSkel::Face_const_iterator Face_const_iterator; +typedef SSkel::Halfedge_const_handle Halfedge_const_handle ; +typedef SSkel::Vertex_const_handle Vertex_const_handle ; -typedef CGAL::HalfedgeDS_const_decorator Sls_const_decorator ; +typedef CGAL::HalfedgeDS_const_decorator SSkel_const_decorator ; } diff --git a/Straight_skeleton_2/demo/Straight_skeleton_2/straight_skeleton_2.C b/Straight_skeleton_2/demo/Straight_skeleton_2/straight_skeleton_2.C index a605c76de79..bb3f19c2f24 100755 --- a/Straight_skeleton_2/demo/Straight_skeleton_2/straight_skeleton_2.C +++ b/Straight_skeleton_2/demo/Straight_skeleton_2/straight_skeleton_2.C @@ -217,6 +217,8 @@ private: #define STATS //#define CGAL_SLS_PROFILING_ENABLED +#define VERBOSE_VALIDATE false + #if defined(STATS) #define LOGSTATS(m) std::cout << m << std::endl ; #else @@ -325,8 +327,8 @@ const QString my_title_string("Straight_skeleton_2 Demo"); int current_state; -Sls sls; -bool sls_valid ; +SSkel sskel; +bool sskel_valid ; Regions input ; Regions output ; Doubles offsets ; @@ -422,7 +424,7 @@ public: // drawing menu QPopupMenu * draw = new QPopupMenu( this ); menuBar()->insertItem( "&Draw", draw ); - draw->insertItem("Generate Skeleton", this, SLOT(create_sls()), CTRL+Key_G ); + draw->insertItem("Generate Skeleton", this, SLOT(create_skeleton()), CTRL+Key_G ); draw->insertItem("Generate Offset", this, SLOT(create_offset()), CTRL+Key_O ); draw->insertItem("Set Offset Distance", this, SLOT(set_offset())); @@ -440,7 +442,7 @@ public: newtoolbar = new Tools_toolbar(widget, this); //the new scenes toolbar - vtoolbar = new Layers_toolbar(widget, this, input, sls, output); + vtoolbar = new Layers_toolbar(widget, this, input, sskel, output); resize(w,h); widget->set_window(-1, 1, -1, 1); @@ -464,7 +466,7 @@ public slots: widget->lock(); widget->clear(); input.clear(); - sls.clear(); + sskel.clear(); offsets.clear(); output.clear(); // set the Visible Area to the Interval @@ -512,7 +514,7 @@ private slots: }; - void create_sls() + void create_skeleton() { if ( input.size() > 0 ) { @@ -521,15 +523,15 @@ private slots: LOGSTATS("Creating Straight Skeleton..."); CGAL::Real_timer t ; t.start(); - SlsBuilder builder ; + SSkelBuilder builder ; for( Region::const_iterator bit = lRegion.begin(), ebit = lRegion.end() ; bit != ebit ; ++ bit ) { builder.enter_contour((*bit)->vertices_begin(),(*bit)->vertices_end()); } - sls = builder.construct_skeleton() ; + sskel = builder.construct_skeleton() ; t.stop(); - sls_valid = Sls_const_decorator(sls).is_valid(false,3); - LOGSTATS( (sls_valid ? "Done" : "FAILED." ) << " Ellapsed time: " << t.time() << " seconds."); + sskel_valid = SSkel_const_decorator(sskel).is_valid(VERBOSE_VALIDATE,3); + LOGSTATS( (sskel_valid ? "Done" : "FAILED." ) << " Ellapsed time: " << t.time() << " seconds."); #ifdef CGAL_SLS_PROFILING_ENABLED LogProfilingResults(); #endif @@ -540,7 +542,7 @@ private slots: void create_offset() { - if ( sls_valid ) + if ( sskel_valid ) { LOGSTATS("Creating Offsets..."); output.clear(); @@ -553,7 +555,7 @@ private slots: double offset = *i ; LOGSTATS("Creating offsets at " << offset ); RegionPtr lRegion( new Region ) ; - OffsetBuilder lOffsetBuilder(sls); + OffsetBuilder lOffsetBuilder(sskel); lOffsetBuilder.construct_offset_polygons(offset, std::back_inserter(*lRegion) ); LOGSTATS("Done."); if ( lRegion->size() > 0 ) @@ -764,7 +766,7 @@ private slots: } output.clear(); - sls.clear(); + sskel.clear(); widget->redraw(); something_changed(); } diff --git a/Straight_skeleton_2/demo/Straight_skeleton_2/straight_skeleton_2_layers.h b/Straight_skeleton_2/demo/Straight_skeleton_2/straight_skeleton_2_layers.h index 5b706e91145..f7346ad190a 100755 --- a/Straight_skeleton_2/demo/Straight_skeleton_2/straight_skeleton_2_layers.h +++ b/Straight_skeleton_2/demo/Straight_skeleton_2/straight_skeleton_2_layers.h @@ -32,10 +32,12 @@ public: void draw() { - typename Sls::Rep::Construct_segment_2 construct_segment ; + typename Sls::Traits::Construct_segment_2 construct_segment ; widget->lock(); + int watchdog_limit = mSls.size_of_halfedges(); + for ( Face_const_iterator fit = mSls.faces_begin(), efit = mSls.faces_end() ; fit != efit ; ++ fit @@ -43,6 +45,9 @@ public: { Halfedge_const_handle hstart = fit->halfedge(); Halfedge_const_handle he = hstart ; + + int watchdog = watchdog_limit ; + do { if ( he == null_halfedge ) @@ -84,7 +89,7 @@ public: } he = he->next(); } - while ( he != hstart ) ; + while ( -- watchdog > 0 && he != hstart ) ; } widget->unlock(); diff --git a/Straight_skeleton_2/demo/Straight_skeleton_2/straight_skeleton_2_toolbar_layers.C b/Straight_skeleton_2/demo/Straight_skeleton_2/straight_skeleton_2_toolbar_layers.C index 113daa53f4f..00b20be0667 100755 --- a/Straight_skeleton_2/demo/Straight_skeleton_2/straight_skeleton_2_toolbar_layers.C +++ b/Straight_skeleton_2/demo/Straight_skeleton_2/straight_skeleton_2_toolbar_layers.C @@ -31,21 +31,21 @@ Layers_toolbar::Layers_toolbar(CGAL::Qt_widget* w ,QMainWindow* mw ,demo::Regions const& in - ,demo::Sls const& sls + ,demo::SSkel const& sskel ,demo::Regions const& out ) : QToolBar(mw, "LT"), nr_of_buttons(0) { - showI = new Qt_layer_show_regions (in,CGAL::RED); - showSLS = new Qt_layer_show_skeleton (sls); - showO = new Qt_layer_show_regions (out,CGAL::BLACK); + showI = new Qt_layer_show_regions (in,CGAL::RED); + showSSkel = new Qt_layer_show_skeleton (sskel); + showO = new Qt_layer_show_regions (out,CGAL::BLACK); //set the widget widget = w; window = mw; widget->attach(showI); - widget->attach(showSLS); + widget->attach(showSSkel); widget->attach(showO); @@ -78,7 +78,7 @@ Layers_toolbar::Layers_toolbar(CGAL::Qt_widget* w connect(but[0], SIGNAL(stateChanged(int)), showI, SLOT(stateChanged(int))); connect(but[1], SIGNAL(stateChanged(int)), - showSLS, SLOT(stateChanged(int))); + showSSkel, SLOT(stateChanged(int))); connect(but[2], SIGNAL(stateChanged(int)), showO, SLOT(stateChanged(int))); } @@ -86,7 +86,7 @@ Layers_toolbar::Layers_toolbar(CGAL::Qt_widget* w Layers_toolbar::~Layers_toolbar() { delete showI; - delete showSLS; + delete showSSkel; delete showO; delete button_group; }; diff --git a/Straight_skeleton_2/demo/Straight_skeleton_2/straight_skeleton_2_toolbar_layers.h b/Straight_skeleton_2/demo/Straight_skeleton_2/straight_skeleton_2_toolbar_layers.h index 9b986e7b5ef..1f2c2aa2f19 100755 --- a/Straight_skeleton_2/demo/Straight_skeleton_2/straight_skeleton_2_toolbar_layers.h +++ b/Straight_skeleton_2/demo/Straight_skeleton_2/straight_skeleton_2_toolbar_layers.h @@ -41,7 +41,7 @@ public: Layers_toolbar( CGAL::Qt_widget* w , QMainWindow* mw , demo::Regions const& in - , demo::Sls const& sls + , demo::SSkel const& sskel , demo::Regions const& out ); ~Layers_toolbar(); @@ -53,7 +53,7 @@ private: int nr_of_buttons; Qt_layer_show_regions *showI; - Qt_layer_show_skeleton *showSLS; + Qt_layer_show_skeleton *showSSkel; Qt_layer_show_regions *showO; };//end class diff --git a/Straight_skeleton_2/doc_tex/Straight_skeleton_2_ref/StraightSkeleton_2.tex b/Straight_skeleton_2/doc_tex/Straight_skeleton_2_ref/StraightSkeleton_2.tex index a604e8ad835..e69de29bb2d 100755 --- a/Straight_skeleton_2/doc_tex/Straight_skeleton_2_ref/StraightSkeleton_2.tex +++ b/Straight_skeleton_2/doc_tex/Straight_skeleton_2_ref/StraightSkeleton_2.tex @@ -1,52 +0,0 @@ -%% Copyright (c) 2006 SciSoft. All rights reserved. -%% -%% This file is part of CGAL (www.cgal.org); you may redistribute it under -%% the terms of the Q Public License version 1.0. -%% See the file LICENSE.QPL distributed with CGAL. -%% -%% Licensees holding a valid commercial license may use this file in -%% accordance with the commercial license agreement provided with the software. -%% -%% This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -%% WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -%% -%% -%% -%% Author(s) : Fernando Cacciola - -\ccRefPageBegin - -%%RefPage: end of header, begin of main body -% +------------------------------------------------------------------------+ - -\begin{ccRefConcept}{StraightSkeleton_2} - -\ccHeading{Introduction} - - A model for the \ccRefName\ concept defines the underlying - combinatorial data structure (halfedge data structure) used to - represent the 2D straight skeleton of a simple polygon. - -\ccRefines -\ccc{HalfedgeDS} - -\ccTypes - \ccNestedType{Vertex}{ - The vertex type. Should be a model of the - \ccc{StraightSkeletonVertex_2} concept.} - - \ccNestedType{Halfedge}{ - The halfedge type. Should be a model of the - \ccc{StraightSkeletonHalfedge_2} concept.} - -\ccHasModels - -There is no package-specific class serving as a model for this concept. Any model of the -\ccc{HalfedgeDS} concept whose \ccc{HalfedgeDSItems} match the \ccc{StraightSkeletonVertex_2} and \ccc{StraightSkeletonHalfedge_2} concepts (fore the Vertex and Halfedge resp.) can be used. - -\end{ccRefConcept} % StraightSkeleton_2 -% +------------------------------------------------------------------------+ -%%RefPage: end of main body, begin of footer -\ccRefPageEnd -% EOF -% +------------------------------------------------------------------------+ diff --git a/Straight_skeleton_2/doc_tex/Straight_skeleton_2_ref/main.tex b/Straight_skeleton_2/doc_tex/Straight_skeleton_2_ref/main.tex index 70c064d975d..feacd1784cd 100755 --- a/Straight_skeleton_2/doc_tex/Straight_skeleton_2_ref/main.tex +++ b/Straight_skeleton_2/doc_tex/Straight_skeleton_2_ref/main.tex @@ -11,6 +11,7 @@ \input{Straight_skeleton_2_ref/StraightSkeletonHalfedge_2.tex} \input{Straight_skeleton_2_ref/StraightSkeletonBuilderTraits_2.tex} \input{Straight_skeleton_2_ref/PolygonOffsetBuilderTraits_2.tex} +\input{Straight_skeleton_2_ref/Straight_skeleton_2.tex} \input{Straight_skeleton_2_ref/Straight_skeleton_vertex_base_2.tex} \input{Straight_skeleton_2_ref/Straight_skeleton_halfedge_base_2.tex} \input{Straight_skeleton_2_ref/Straight_skeleton_builder_traits_2.tex} diff --git a/Straight_skeleton_2/include/CGAL/Polygon_offset_builder_2.C b/Straight_skeleton_2/include/CGAL/Polygon_offset_builder_2.C index 8dcc71f245c..1abd536a11e 100755 --- a/Straight_skeleton_2/include/CGAL/Polygon_offset_builder_2.C +++ b/Straight_skeleton_2/include/CGAL/Polygon_offset_builder_2.C @@ -35,7 +35,7 @@ Polygon_offset_builder_2::Polygon_offset_builder_2( Sls const& aSls if ( !lHE->is_bisector() && handle_assigned(lHE->face()) ) { - CGAL_POLYOFFSET_SHOW (1, DrawBorder(lHE) ) ; + CGAL_POLYOFFSET_SHOW ( DrawBorder(lHE) ) ; mBorders.push_back(lHE); } } @@ -112,8 +112,8 @@ void Polygon_offset_builder_2::AddOffsetVertex( FT aTime, Halfedge_ Point_2 lP = Construct_offset_point(aTime,aHook); - CGAL_POLYOFFSET_SHOW (1, DrawBisector(aHook) ) ; - CGAL_POLYOFFSET_SHOW (1, DrawOffset(aPoly,lP) ) ; + CGAL_POLYOFFSET_SHOW ( DrawBisector(aHook) ) ; + CGAL_POLYOFFSET_SHOW ( DrawOffset(aPoly,lP) ) ; CGAL_POLYOFFSET_TRACE(3,"Constructing offset point along B" << aHook->id() ) ; aPoly->push_back(lP); @@ -150,7 +150,7 @@ OutputIterator Polygon_offset_builder_2::TraceOffsetPolygon( FT aTi break ; } - CGAL_POLYOFFSET_SHOW (1, DrawOffset(lPoly,(*lPoly)[0]) ) ; + CGAL_POLYOFFSET_SHOW ( DrawOffset(lPoly,(*lPoly)[0]) ) ; if ( lPoly->size() >= 3 ) { diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2.h index bf9ada29080..dca3bfea62c 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_2.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_2.h @@ -36,35 +36,28 @@ class Straight_skeleton_2 : public CGAL_HALFEDGEDS_DEFAULT Base ; - + typedef typename Base::Vertex_base Vertex ; typedef typename Base::Halfedge_base Halfedge ; typedef typename Base::Face_base Face ; + typedef typename Base::Vertex_handle Vertex_handle ; typedef typename Base::Halfedge_handle Halfedge_handle ; typedef typename Base::Face_handle Face_handle ; + typedef typename Base::Vertex_iterator Vertex_iterator ; typedef typename Base::Halfedge_iterator Halfedge_iterator ; Straight_skeleton_2() {} - -/* -private: - - Face_handle faces_push_back ( Face const& aF ) ; - Vertex_handle vertices_push_back ( Vertex const& aV ) ; - Halfedge_handle edges_push_back ( Halfedge const& aA, Halfedge const& aB ) ; - - void vertices_erase ( Vertex_iterator first, Vertex_iterator last ) ; - void edges_erase ( Halfedge_handle h ) ; -*/ }; + CGAL_END_NAMESPACE + #endif // CGAL_STRAIGHT_SKELETON_2_H // // EOF // diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_aux.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_aux.h index 77af8f74dc8..a83c4900eaa 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_aux.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_aux.h @@ -48,9 +48,9 @@ #endif #ifdef CGAL_STRAIGHT_SKELETON_ENABLE_SHOW -# define CGAL_SSBUILDER_SHOW(l,code) if ( l <= CGAL_STRAIGHT_SKELETON_ENABLE_SHOW ) { code } +# define CGAL_SSBUILDER_SHOW(code) { code } #else -# define CGAL_SSBUILDER_SHOW(l,code) +# define CGAL_SSBUILDER_SHOW(code) #endif #ifdef CGAL_POLYGON_OFFSET_ENABLE_TRACE @@ -60,9 +60,9 @@ #endif #ifdef CGAL_POLYGON_OFFSET_ENABLE_SHOW -# define CGAL_POLYOFFSET_SHOW(l,code) if ( l <= CGAL_POLYGON_OFFSET_ENABLE_SHOW ) { code } +# define CGAL_POLYOFFSET_SHOW(code) { code } #else -# define CGAL_POLYOFFSET_SHOW(l,code) +# define CGAL_POLYOFFSET_SHOW(code) #endif CGAL_BEGIN_NAMESPACE diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_2.C b/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_2.C index fea76fa4a01..c67c5e1cc02 100755 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_2.C +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_2.C @@ -81,16 +81,10 @@ Straight_skeleton_builder_2::FindEdgeEvent( Vertex_handle aLNode, Vertex_ bool lAccepted = true ; if ( aLNode->is_skeleton() && IsNewEventInThePast(lBorderA,lBorderB,lBorderC,aLNode) ) - { - CGAL_SSBUILDER_TRACE(1,"New edge event for Left seed N" << aLNode->id() << " is in the past. discarded." ) ; lAccepted = false ; - } if ( aRNode->is_skeleton() && IsNewEventInThePast(lBorderA,lBorderB,lBorderC,aRNode) ) - { - CGAL_SSBUILDER_TRACE(1,"New edge event for Right seed N" << aRNode->id() << " is in the past. discarded." ) ; lAccepted = false ; - } if ( lAccepted ) { @@ -112,22 +106,9 @@ void Straight_skeleton_builder_2::CollectSplitEvent( Vertex_handle aNod , Halfedge_handle aOppositeBorder ) { - CGAL_SSBUILDER_TRACE(2, - "Computing potential split event between E" << aReflexLBorder->id() - << ",E" <id() << " and E" << aOppositeBorder->id() - ); - if ( ExistEvent(aReflexLBorder,aReflexRBorder,aOppositeBorder) ) { - bool lAccepted = true ; - - if ( aNode->is_skeleton() && IsNewEventInThePast(aReflexLBorder,aReflexRBorder,aOppositeBorder,aNode) ) - { - CGAL_SSBUILDER_TRACE(1,"New split event for Seed N" << aNode->id() << " is in the past. discarded." ) ; - lAccepted = false ; - } - - if ( lAccepted ) + if ( ! ( aNode->is_skeleton() && IsNewEventInThePast(aReflexLBorder,aReflexRBorder,aOppositeBorder,aNode) ) ) { EventPtr lEvent( new SplitEvent( aReflexLBorder,aReflexRBorder,aOppositeBorder,aNode,aOppositeBorder) ) ; #ifdef CGAL_STRAIGHT_SKELETON_ENABLE_TRACE @@ -141,6 +122,10 @@ void Straight_skeleton_builder_2::CollectSplitEvent( Vertex_handle aNod EnqueEvent(lEvent); } } + else + { + CGAL_SSBUILDER_TRACE(1,"Spit event for Seed N" << aNode->id() << " against E" << aOppositeBorder->id() << " does not exist." ) ; + } } template @@ -157,7 +142,7 @@ void Straight_skeleton_builder_2::CollectSplitEvents( Vertex_handle aNode Halfedge_handle lRBorderP = lRBorder->opposite()->next()->opposite(); Halfedge_handle lRBorderN = lRBorder->opposite()->prev()->opposite(); - CGAL_SSBUILDER_TRACE(2 + CGAL_SSBUILDER_TRACE(3 ,"Finding SplitEvent for N" << aNode->id() << " LBorder: E" << lLBorder->id() << " RBorder: E" << lRBorder->id() << " LBorderP: E" << lLBorderP->id() << " LBorderN: E" << lLBorderN->id() @@ -187,52 +172,41 @@ void Straight_skeleton_builder_2::CollectNewEvents( Vertex_handle aNode ) Vertex_handle lNext = GetNextInLAV(aNode) ; CGAL_SSBUILDER_TRACE - ( 1 - , "Collecting new events generated by N" << aNode->id() << " at " << aNode->point() << std::endl - << "Prev: N" << lPrev->id() << " Next: N" << lNext->id() + ( 2 + , "Collecting new events generated by N" << aNode->id() << " at " << aNode->point() << " (Prev: N" << lPrev->id() << " Next: N" + << lNext->id() << ")" ) ; - EventPtr lLEdgeEvent = FindEdgeEvent( lPrev , aNode ) ; - EventPtr lREdgeEvent = FindEdgeEvent( aNode , lNext ) ; - if ( IsReflex(aNode) ) CollectSplitEvents(aNode) ; + + EventPtr lLEdgeEvent = FindEdgeEvent( lPrev , aNode ) ; + EventPtr lREdgeEvent = FindEdgeEvent( aNode , lNext ) ; - if ( lLEdgeEvent && !lREdgeEvent ) - { - EnqueEvent(lLEdgeEvent); - } - else if ( lREdgeEvent && !lLEdgeEvent ) - { - EnqueEvent(lREdgeEvent); - } - else if ( lLEdgeEvent && lREdgeEvent ) - { - CGAL_SSBUILDER_TRACE(2 - ,"Both Left and Right (candidate) EdgeEvents found:\n" - << "L: " << *lLEdgeEvent << '\n' - << "R: " << *lREdgeEvent - ); - - bool lPickLeft = true ; + bool lAcceptL = !!lLEdgeEvent, lAcceptR = !!lREdgeEvent ; + if ( lLEdgeEvent && lREdgeEvent ) + { Comparison_result lRel = CompareEvents(lLEdgeEvent,lREdgeEvent) ; - if ( lRel == LARGER ) - { - lPickLeft = false ; - } - else if ( lRel == EQUAL ) + if ( lRel == EQUAL ) { if ( CompareEventsDistanceToSeed(aNode,lLEdgeEvent,lREdgeEvent) == LARGER ) - lPickLeft = false ; + lAcceptL = false ; + else lAcceptR = false ; + + CGAL_SSBUILDER_TRACE(3,"Both Left and Right Edge Events found with the same time:" + << "LEvent:" << *lLEdgeEvent << '\n' + << "REvent:" << *lREdgeEvent << '\n' + << "Selecting the one closer to the seed: " << (lAcceptL ? "Left" : "Right") + ); } - - CGAL_SSBUILDER_TRACE(2,"Choosen: " << ( lPickLeft ? "Left" : "Right" ) ) ; - - if ( lPickLeft ) - EnqueEvent(lLEdgeEvent); - else EnqueEvent(lREdgeEvent); } + + if ( lAcceptL ) + EnqueEvent(lLEdgeEvent); + + if ( lAcceptR ) + EnqueEvent(lREdgeEvent); } //! Handles the special case of two simultaneous edge events, that is, two edges @@ -264,7 +238,7 @@ void Straight_skeleton_builder_2::HandleSimultaneousEdgeEvent( Vertex_han mSLAV.remove(aA); mSLAV.remove(aB); - CGAL_SSBUILDER_TRACE ( 2, 'N' << aA->id() << " processed\nN" << aB->id() << " processed" ) ; + CGAL_SSBUILDER_TRACE ( 3, 'N' << aA->id() << " processed\nN" << aB->id() << " processed" ) ; Halfedge_handle lOA_Prev = lOA->prev() ; Halfedge_handle lIA_Next = lIA->next() ; @@ -286,9 +260,9 @@ void Straight_skeleton_builder_2::HandleSimultaneousEdgeEvent( Vertex_han lOB->HBase::set_vertex (aA); - CGAL_SSBUILDER_SHOW (1, DrawBisector(lOB) ) ; + CGAL_SSBUILDER_SHOW ( DrawBisector(lOB) ; ) - CGAL_SSBUILDER_TRACE ( 2, "B" << lOA->id() << " and B" << lIA->id() << " erased." ) ; + CGAL_SSBUILDER_TRACE ( 3, "B" << lOA->id() << " and B" << lIA->id() << " erased." ) ; mDanglingBisectors.push_back(lOA); // @@ -300,12 +274,12 @@ void Straight_skeleton_builder_2::HandleSimultaneousEdgeEvent( Vertex_han if ( handle_assigned(lOA->vertex()) && lOA->vertex() != aA && lOA->vertex() != aB ) { lOA->vertex()->VBase::set_halfedge(lIB); - CGAL_SSBUILDER_TRACE ( 2, "N" << lOA->vertex()->id() << " has B" << lOA->id() << " as it's halfedge. Replacing it with B" << lIB->id() ) ; + CGAL_SSBUILDER_TRACE ( 1, "N" << lOA->vertex()->id() << " has B" << lOA->id() << " as it's halfedge. Replacing it with B" << lIB->id() ) ; } if ( handle_assigned(lIA->vertex()) && lIA->vertex() != aA && lIA->vertex() != aB ) { lIA->vertex()->VBase::set_halfedge(lOB); - CGAL_SSBUILDER_TRACE ( 2, "N" << lIA->vertex()->id() << " has B" << lIA->id() << " as it's halfedge. Replacing it with B" << lOB->id() ) ; + CGAL_SSBUILDER_TRACE ( 1, "N" << lIA->vertex()->id() << " has B" << lIA->id() << " as it's halfedge. Replacing it with B" << lOB->id() ) ; } CGAL_SSBUILDER_TRACE ( 2, "N" << aA->id() << " halfedge: B" << aA->halfedge()->id() ) ; @@ -317,7 +291,7 @@ void Straight_skeleton_builder_2::HandleSimultaneousEdgeEvent( Vertex_han template bool Straight_skeleton_builder_2::AreBisectorsCoincident ( Halfedge_const_handle aA, Halfedge_const_handle aB ) const { - CGAL_SSBUILDER_TRACE ( 2, "Testing for simultaneous EdgeEvents between B" << aA->id() << " and B" << aB->id() ) ; + CGAL_SSBUILDER_TRACE ( 3, "Testing for simultaneous EdgeEvents between B" << aA->id() << " and B" << aB->id() ) ; Halfedge_const_handle lA_LBorder = aA->defining_contour_edge(); Halfedge_const_handle lA_RBorder = aA->opposite()->defining_contour_edge(); @@ -334,7 +308,7 @@ void Straight_skeleton_builder_2::UpdatePQ( Vertex_handle aNode ) Vertex_handle lPrev = GetPrevInLAV(aNode) ; Vertex_handle lNext = GetNextInLAV(aNode) ; - CGAL_SSBUILDER_TRACE ( 2, "Updating PQ for N" << aNode->id() << " Prev N" << lPrev->id() << " Next N" << lNext->id() ) ; + CGAL_SSBUILDER_TRACE ( 3, "Updating PQ for N" << aNode->id() << " Prev N" << lPrev->id() << " Next N" << lNext->id() ) ; Halfedge_handle lOBisector_P = lPrev->primary_bisector() ; Halfedge_handle lOBisector_C = aNode->primary_bisector() ; @@ -352,7 +326,7 @@ template void Straight_skeleton_builder_2::CreateInitialEvents() { CGAL_SSBUILDER_TRACE(0, "Creating initial events..."); - for ( Vertex_iterator v = mSS.vertices_begin(); v != mSS.vertices_end(); ++ v ) + for ( Vertex_iterator v = mSSkel.vertices_begin(); v != mSSkel.vertices_end(); ++ v ) UpdatePQ(v); } @@ -391,7 +365,7 @@ Straight_skeleton_builder_2::FindVertexEvent( EventPtr aE0, Vertex_handle boost::tie(lDistinct1, lDistinct2, lEqual1, lEqual2) = SortTwoDistinctAndTwoEqual(lBorderX,lBorderY); - CGAL_SSBUILDER_TRACE ( 2 + CGAL_SSBUILDER_TRACE ( 3 , "Distinct1 E" << lDistinct1->id() << " Distinct2 E" << lDistinct2->id() << " Equal1 E" << lEqual1->id() << " Equal2 E" << lEqual2->id() ) ; @@ -405,10 +379,10 @@ Straight_skeleton_builder_2::FindVertexEvent( EventPtr aE0, Vertex_handle rResult = EventPtr( new VertexEvent( lDistinct1, lDistinct2, lEqual1 ,lEqual2, lSeedX, lSeedY ) ) ; - #ifdef CGAL_STRAIGHT_SKELETON_ENABLE_TRACE +#ifdef CGAL_STRAIGHT_SKELETON_ENABLE_TRACE SetEventTimeAndPoint(*rResult); - #endif - CGAL_SSBUILDER_SHOW (1, SS_IO_AUX::ScopedPointDrawing lDrawA(rResult->point(),CGAL::BLUE,"Event"); ) +#endif + CGAL_SSBUILDER_SHOW ( SS_IO_AUX::ScopedPointDrawing lDrawA(rResult->point(),CGAL::BLUE,"Event"); ) } } } @@ -437,114 +411,15 @@ Straight_skeleton_builder_2::FindVertexEvent( EventPtr aSplitEventPtr ) return rResult ; } -/* -template -void Straight_skeleton_builder_2::FindVertexEvents() -{ - -int c = 0 ; -int k = 0 ; - - CGAL_SSBUILDER_TRACE(0, "Finding vertex events..."); - for ( Vertex_iterator v0 = mSS.vertices_begin(), ev0 = mSS.vertices_end() ; v0 != ev0 ; ++ v0 ) - { - if ( IsReflex(v0) ) - { - // These are all the split events against a reflex vertex. - // That is, the event's opposite border is incident upon a reflex vertex which itself has split events, - // some possibly also against a reflex vertex. - - EventPtr_Vector lV0ReflexSplits = GetReflexSplits(v0) ; - -std::cout << "v" << v0->id() << " has " << lV0ReflexSplits.size() << " reflex splits" << std::endl ; - - for ( event_iterator e0 = lV0ReflexSplits.begin(), ee0 = lV0ReflexSplits.end() ; e0 != ee0 ; ++ e0 ) - { -++ k ; - EventPtr lE0 = *e0 ; - - if ( !lE0->is_excluded() ) - { - SplitEvent& lSE0 = dynamic_cast(*lE0) ; - - Vertex_handle lV1 = lSE0.opposite_border()->vertex(); - - CGAL_assertion(IsReflex(lV1)); - - EventPtr_Vector lV1ReflexSplits = GetReflexSplits(lV1) ; - - for ( event_iterator e1 = lV1ReflexSplits.begin(), ee1 = lV1ReflexSplits.end() ; e1 != ee1 ; ++ e1 ) - { -++ c ; - EventPtr lE1 = *e1 ; - - if ( !lE1->is_excluded() && AreEventsSimultaneous(lE0,lE1) ) - { - CGAL_SSBUILDER_TRACE(2, "Vertex Event found with\n" << *lE0 << "\n" << *lE1 ); - - lE0->Exclude(); - lE1->Exclude(); - - Halfedge_handle lBorderX[3], lBorderY[3]; - - lBorderX[0] = lE0->border_a(); - lBorderX[1] = lE0->border_b(); - lBorderX[2] = lE0->border_c(); - - lBorderY[0] = lE1->border_a(); - lBorderY[1] = lE1->border_b(); - lBorderY[2] = lE1->border_c(); - - Halfedge_handle lDistinct1, lDistinct2, lEqual1, lEqual2 ; - - boost::tie(lDistinct1, lDistinct2, lEqual1, lEqual2) = SortTwoDistinctAndTwoEqual(lBorderX,lBorderY); - - CGAL_SSBUILDER_TRACE ( 2 - , "Distinct1 E" << lDistinct1->id() << " Distinct2 E" << lDistinct2->id() - << " Equal1 E" << lEqual1->id() << " Equal2 E" << lEqual2->id() - ) ; - - if ( ExistEvent(lDistinct1, lDistinct2, lEqual1 ) - && ExistEvent(lEqual1 , lEqual2 , lDistinct1) - ) - { - Vertex_handle lSeedX = lE0->seed0(); - Vertex_handle lSeedY = lE1->seed0(); - - EventPtr lVertexEvent = EventPtr( new VertexEvent( lDistinct1, lDistinct2, lEqual1 ,lEqual2, lSeedX, lSeedY ) ) ; - - #ifdef CGAL_STRAIGHT_SKELETON_ENABLE_TRACE - SetEventTimeAndPoint(*lVertexEvent); - #endif - CGAL_SSBUILDER_SHOW (1, SS_IO_AUX::ScopedPointDrawing lDrawA(lVertexEvent->point(),CGAL::BLUE,"Event"); ) - - EnqueEvent(lVertexEvent); - - break ; - } - } - } - } - - if ( lE0->is_excluded() ) - break ; - } - } - } - -std::cout << "total reflex splits:" << k << ". Total innner iterations: " << c << std::endl ; -} -*/ - template void Straight_skeleton_builder_2::CreateContourBisectors() { CGAL_SSBUILDER_TRACE(0, "Creating contour bisectors..."); - for ( Vertex_iterator v = mSS.vertices_begin(); v != mSS.vertices_end(); ++ v ) + for ( Vertex_iterator v = mSSkel.vertices_begin(); v != mSSkel.vertices_end(); ++ v ) { // NOTE: Bisectors are always contructed with no geometric embedding. Halfedge lOB(mEdgeID++), lIB(mEdgeID++); - Halfedge_handle lOBisector = mSS.SBase::edges_push_back (lOB, lIB); + Halfedge_handle lOBisector = mSSkel.SBase::edges_push_back (lOB, lIB); Halfedge_handle lIBisector = lOBisector->opposite(); lOBisector->HBase::set_face(v->halfedge()->face()); lIBisector->HBase::set_face(v->halfedge()->next()->face()); @@ -556,7 +431,7 @@ void Straight_skeleton_builder_2::CreateContourBisectors() lOBisector->HBase::set_prev(lIBorder); lOBorder ->HBase::set_prev(lIBisector); lIBisector->HBase::set_next(lOBorder); - CGAL_SSBUILDER_TRACE(2 + CGAL_SSBUILDER_TRACE(3 ,"Adding Contour Bisector at N:" << v->id() << "\n B" << lOBisector->id() << " (Out)\n B" << lIBisector->id() << " (In)" ) ; @@ -582,7 +457,7 @@ Straight_skeleton_builder_2::ConstructEdgeEventNode( EdgeEvent& aEvent ) SetEventTimeAndPoint(aEvent); - Vertex_handle lNewNode = mSS.SBase::vertices_push_back( Vertex( mVertexID++, aEvent.point(), aEvent.time()) ) ; + Vertex_handle lNewNode = mSSkel.SBase::vertices_push_back( Vertex( mVertexID++, aEvent.point(), aEvent.time()) ) ; mSLAV.push_back(lNewNode); mWrappedVertices.push_back( VertexWrapper(lNewNode) ) ; @@ -599,10 +474,10 @@ Straight_skeleton_builder_2::ConstructEdgeEventNode( EdgeEvent& aEvent ) lLIBisector->HBase::set_prev( lROBisector ) ; lROBisector->HBase::set_next( lLIBisector ) ; - CGAL_SSBUILDER_SHOW(1, DrawBisector(lLOBisector); DrawBisector(lROBisector); ) ; + CGAL_SSBUILDER_SHOW( DrawBisector(lLOBisector); DrawBisector(lROBisector); ) ; CGAL_SSBUILDER_TRACE - ( 2 + ( 3 , "LSeed: N" << lLSeed->id() << " proccesed\n" << "RSeed: N" << lRSeed->id() << " proccesed" ) ; @@ -642,13 +517,12 @@ Straight_skeleton_builder_2::LookupOnSLAV ( Halfedge_handle aBorder, Even { Vertex_handle rResult ; - CGAL_SSBUILDER_TRACE ( 2, "Looking up for E" << aBorder->id() << " on SLAV. P=" << aEvent.point() ) ; + CGAL_SSBUILDER_TRACE ( 3, "Looking up for E" << aBorder->id() << " on SLAV. P=" << aEvent.point() ) ; - CGAL_SSBUILDER_SHOW ( 2 - , SS_IO_AUX::ScopedSegmentDrawing draw_(aBorder->vertex()->point() - ,aBorder->opposite()->vertex()->point() - ,CGAL::YELLOW,"OppBorder") ; - ) + +#ifdef CGAL_STRAIGHT_SKELETON_ENABLE_TRACE + bool lFound = false ; +#endif for ( typename std::list::const_iterator vi = mSLAV.begin(); vi != mSLAV.end(); ++ vi ) { @@ -659,24 +533,43 @@ Straight_skeleton_builder_2::LookupOnSLAV ( Halfedge_handle aBorder, Even && GetDefiningBorderA(v) == aBorder ) { +#ifdef CGAL_STRAIGHT_SKELETON_ENABLE_TRACE + lFound = true ; +#endif + Vertex_handle lPrev = GetPrevInLAV(v); Halfedge_handle lPrevBorder = GetDefiningBorderA(lPrev); Halfedge_handle lNextBorder = GetDefiningBorderB(v); - if ( IsEventInsideOffsetZone( aEvent.border_a() - , aEvent.border_b() - , aBorder - , lPrevBorder - , lNextBorder - ) - ) + + CGAL_assertion(handle_assigned(lPrevBorder)); + CGAL_assertion(handle_assigned(lNextBorder)); + + if ( IsEventInsideOffsetZone( aEvent.border_a(), aEvent.border_b(), aBorder, lPrevBorder, lNextBorder ) ) { rResult = v ; - CGAL_SSBUILDER_TRACE ( 2, 'N' << rResult->id() << " found" ) ; + CGAL_SSBUILDER_TRACE ( 2 + , 'E' << aBorder->id() << " found in SLAV: N" << lPrev->id() << "->N" << v->id() + << " (E" << lPrevBorder->id() << "->E" << aBorder->id() << "->E" << lNextBorder->id() << ")" + ) ; break ; } } } - + +#ifdef CGAL_STRAIGHT_SKELETON_ENABLE_TRACE + if ( !handle_assigned(rResult) ) + { + if ( !lFound ) + { + CGAL_SSBUILDER_TRACE(1,"Split event is no longer valid. Opposite edge vanished."); + } + else + { + CGAL_SSBUILDER_TRACE(1,"Split event is no longer valid. Not inside the opposite edge offset zone."); + } + } +#endif + return rResult ; } @@ -693,8 +586,8 @@ Straight_skeleton_builder_2::ConstructSplitEventNodes( SplitEvent& aEvent SetEventTimeAndPoint(aEvent); - Vertex_handle lNodeA = mSS.SBase::vertices_push_back( Vertex( mVertexID++, aEvent.point(), aEvent.time() ) ) ; - Vertex_handle lNodeB = mSS.SBase::vertices_push_back( Vertex( mVertexID++, aEvent.point(), aEvent.time() ) ) ; + Vertex_handle lNodeA = mSSkel.SBase::vertices_push_back( Vertex( mVertexID++, aEvent.point(), aEvent.time() ) ) ; + Vertex_handle lNodeB = mSSkel.SBase::vertices_push_back( Vertex( mVertexID++, aEvent.point(), aEvent.time() ) ) ; mSLAV.push_back(lNodeA); mSLAV.push_back(lNodeB); @@ -711,9 +604,9 @@ Straight_skeleton_builder_2::ConstructSplitEventNodes( SplitEvent& aEvent lXOutBisector->HBase::set_vertex(lNodeA); - CGAL_SSBUILDER_SHOW(1, DrawBisector(lXOutBisector); ) ; + CGAL_SSBUILDER_SHOW( DrawBisector(lXOutBisector); ) ; - CGAL_SSBUILDER_TRACE ( 2, "Seed: N" << lSeed->id() << " proccesed" ) ; + CGAL_SSBUILDER_TRACE ( 3, "Seed: N" << lSeed->id() << " proccesed" ) ; SetIsProcessed(lSeed) ; mSLAV.remove(lSeed); @@ -763,8 +656,8 @@ Straight_skeleton_builder_2::ConstructVertexEventNodes( VertexEvent& aEve SetEventTimeAndPoint(aEvent); - Vertex_handle lNewNodeA = mSS.SBase::vertices_push_back( Vertex( mVertexID++, aEvent.point(), aEvent.time()) ) ; - Vertex_handle lNewNodeB = mSS.SBase::vertices_push_back( Vertex( mVertexID++, aEvent.point(), aEvent.time()) ) ; + Vertex_handle lNewNodeA = mSSkel.SBase::vertices_push_back( Vertex( mVertexID++, aEvent.point(), aEvent.time()) ) ; + Vertex_handle lNewNodeB = mSSkel.SBase::vertices_push_back( Vertex( mVertexID++, aEvent.point(), aEvent.time()) ) ; mSLAV.push_back(lNewNodeA); mSLAV.push_back(lNewNodeB); @@ -788,11 +681,11 @@ Straight_skeleton_builder_2::ConstructVertexEventNodes( VertexEvent& aEve lLOBisector->HBase::set_next( lRIBisector ) ; lRIBisector->HBase::set_prev( lLOBisector ) ; - CGAL_SSBUILDER_SHOW(1, DrawBisector(lLOBisector); DrawBisector(lROBisector); ) ; + CGAL_SSBUILDER_SHOW( DrawBisector(lLOBisector); DrawBisector(lROBisector); ) ; CGAL_SSBUILDER_TRACE ( - 2 + 3 , "LSeed: N" << lLSeed->id() << " proccesed\n" << "RSeed: N" << lRSeed->id() << " proccesed" ) ; @@ -864,9 +757,9 @@ void Straight_skeleton_builder_2::HandleEdgeEvent( EventPtr aEvent ) if ( !handle_assigned(lLOBisector->next()) && !handle_assigned(lRIBisector->prev()) ) { - CGAL_SSBUILDER_TRACE(2,"Creating new Edge Event's Bisector"); + CGAL_SSBUILDER_TRACE(3,"Creating new Edge Event's Bisector"); - Halfedge_handle lNOBisector = mSS.SBase::edges_push_back ( Halfedge(mEdgeID),Halfedge(mEdgeID+1) ); + Halfedge_handle lNOBisector = mSSkel.SBase::edges_push_back ( Halfedge(mEdgeID),Halfedge(mEdgeID+1) ); Halfedge_handle lNIBisector = lNOBisector->opposite(); mEdgeID += 2 ; @@ -909,7 +802,21 @@ void Straight_skeleton_builder_2::HandleEdgeEvent( EventPtr aEvent ) } else { - CGAL_SSBUILDER_TRACE(3, "N" << lNewNode->id() << " is a multiple node. Bisector not created"); + Halfedge_handle lDefiningBorderA = lNewNode->halfedge()->face()->halfedge(); + Halfedge_handle lDefiningBorderB = lNewNode->halfedge()->opposite()->prev()->opposite()->face()->halfedge(); + Halfedge_handle lDefiningBorderC = lNewNode->halfedge()->opposite()->prev()->face()->halfedge(); + + SetDefiningBorderA(lNewNode, lDefiningBorderA) ; + SetDefiningBorderB(lNewNode, lDefiningBorderB) ; + SetDefiningBorderC(lNewNode, lDefiningBorderC) ; + + CGAL_SSBUILDER_TRACE(2 + , "NewNode N" << lNewNode->id() << " at " << lNewNode->point() << " defining borders:" + << " E" << lDefiningBorderA->id() + << ",E" << lDefiningBorderB->id() + << ",E" << lDefiningBorderC->id() + << ".\nThis is a multiple node (A node with these defining edges already exist in the LAV)" + ); } } @@ -930,8 +837,8 @@ void Straight_skeleton_builder_2::HandleSplitEvent( EventPtr aEvent, Vert Halfedge_handle lReflexLBorder = GetDefiningBorderA(lSeed); Halfedge_handle lReflexRBorder = GetDefiningBorderB(lSeed); - Halfedge_handle lNOBisector_L = mSS.SBase::edges_push_back ( Halfedge(mEdgeID++),Halfedge(mEdgeID++) ); - Halfedge_handle lNOBisector_R = mSS.SBase::edges_push_back ( Halfedge(mEdgeID++),Halfedge(mEdgeID++) ); + Halfedge_handle lNOBisector_L = mSSkel.SBase::edges_push_back ( Halfedge(mEdgeID++),Halfedge(mEdgeID++) ); + Halfedge_handle lNOBisector_R = mSSkel.SBase::edges_push_back ( Halfedge(mEdgeID++),Halfedge(mEdgeID++) ); Halfedge_handle lNIBisector_L = lNOBisector_L->opposite(); Halfedge_handle lNIBisector_R = lNOBisector_R->opposite(); @@ -981,7 +888,7 @@ void Straight_skeleton_builder_2::HandleSplitEvent( EventPtr aEvent, Vert << ",E" << lNewNodeLDefiningBorderC->id() << '\n' << "New Node R: N" << lNewNode_R->id() << " at " << lNewNode_R->point() << " defining borders: E" << lNewNodeRDefiningBorderA->id() - << ",E" << lNewNodeLDefiningBorderB->id() << '\n' + << ",E" << lNewNodeRDefiningBorderB->id() << '\n' << ",E" << lNewNodeRDefiningBorderC->id() << '\n' << "New Bisector OL:\nB" << lNOBisector_L->id() << "[E" << lNOBisector_L ->defining_contour_edge()->id() @@ -1027,7 +934,7 @@ bool Straight_skeleton_builder_2::SetupVertexEventNode( Vertex_handle a { rR = true ; SetIsReflex(aNode); - CGAL_SSBUILDER_TRACE(2, ( lCollinear ? "COLLINEAR ":"Reflex " ) << "*NEW* vertex: N" << aNode->id() ); + CGAL_SSBUILDER_TRACE(1, ( lCollinear ? "COLLINEAR ":"Reflex " ) << "*NEW* vertex: N" << aNode->id() ); } return rR ; @@ -1044,8 +951,8 @@ void Straight_skeleton_builder_2::HandleVertexEvent( EventPtr aEvent ) Vertex_handle lNewNode_L, lNewNode_R ; boost::tie(lNewNode_L,lNewNode_R) = ConstructVertexEventNodes(lEvent); - Halfedge_handle lNBisector_LO = mSS.SBase::edges_push_back ( Halfedge(mEdgeID++),Halfedge(mEdgeID++) ); - Halfedge_handle lNBisector_RO = mSS.SBase::edges_push_back ( Halfedge(mEdgeID++),Halfedge(mEdgeID++) ); + Halfedge_handle lNBisector_LO = mSSkel.SBase::edges_push_back ( Halfedge(mEdgeID++),Halfedge(mEdgeID++) ); + Halfedge_handle lNBisector_RO = mSSkel.SBase::edges_push_back ( Halfedge(mEdgeID++),Halfedge(mEdgeID++) ); Halfedge_handle lNBisector_LI = lNBisector_LO->opposite(); Halfedge_handle lNBisector_RI = lNBisector_RO->opposite(); @@ -1145,10 +1052,6 @@ void Straight_skeleton_builder_2::HandlePotentialSplitEvent( EventPtr aEv HandleSplitEvent (aEvent,lOppVertex); else HandleVertexEvent(lVertexEvent); } - else - { - CGAL_SSBUILDER_TRACE(3,"Split event is no longer valid. Opposite edge vanished."); - } } template @@ -1163,12 +1066,13 @@ void Straight_skeleton_builder_2::Propagate() if ( !lEvent->is_excluded() && !IsProcessed(lEvent) ) { CGAL_SSBUILDER_TRACE (0,"\nStep: " << mStepID << " Event: " << *lEvent ) ; - CGAL_SSBUILDER_SHOW (1, SS_IO_AUX::ScopedPointDrawing lDraw(lEvent->point(),CGAL::BLUE,"Event"); ) + CGAL_SSBUILDER_SHOW ( SS_IO_AUX::ScopedPointDrawing lDraw(lEvent->point(),CGAL::BLUE,"Event"); ) switch ( lEvent->type() ) { - case Event::cEdgeEvent : HandleEdgeEvent (lEvent) ; break ; - case Event::cSplitEvent: HandlePotentialSplitEvent(lEvent) ; break ; + case Event::cEdgeEvent : HandleEdgeEvent (lEvent) ; break ; + case Event::cSplitEvent : HandlePotentialSplitEvent(lEvent) ; break ; + case Event::cVertexEvent: break ; // Avoids warning about unused enum value in switch } ++ mStepID ; @@ -1211,7 +1115,7 @@ void Straight_skeleton_builder_2::MergeSplitNodes ( Vertex_handle_pair aS << 'B' << lIBisectorR2->id() << " now linked to N" << lIBisectorR2->vertex()->id() ); - mSS.SBase::vertices_erase(lRNode); + mSSkel.SBase::vertices_erase(lRNode); } template @@ -1238,10 +1142,10 @@ void Straight_skeleton_builder_2::Run() } template -typename Straight_skeleton_builder_2::Ssds Straight_skeleton_builder_2::construct_skeleton() +typename Straight_skeleton_builder_2::SSkel Straight_skeleton_builder_2::construct_skeleton() { Run(); - return mSS ; + return mSSkel ; } CGAL_END_NAMESPACE diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_2.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_2.h index bfd0505edc0..4b183c03f70 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_2.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_2.h @@ -33,47 +33,47 @@ CGAL_BEGIN_NAMESPACE -template +template class Straight_skeleton_builder_2 { public: typedef Traits_ Traits ; - typedef Ssds_ Ssds ; + typedef SSkel_ SSkel ; - typedef typename Ssds::Traits::Segment_2 Segment_2 ; + typedef typename SSkel::Traits::Segment_2 Segment_2 ; private : typedef typename Traits::FT FT ; typedef typename Traits::Point_2 Point_2 ; - typedef typename Ssds::Vertex Vertex ; - typedef typename Ssds::Halfedge Halfedge ; - typedef typename Ssds::Face Face ; + typedef typename SSkel::Vertex Vertex ; + typedef typename SSkel::Halfedge Halfedge ; + typedef typename SSkel::Face Face ; - typedef typename Ssds::Vertex_const_handle Vertex_const_handle ; - typedef typename Ssds::Halfedge_const_handle Halfedge_const_handle ; - typedef typename Ssds::Face_const_handle Face_const_handle ; + typedef typename SSkel::Vertex_const_handle Vertex_const_handle ; + typedef typename SSkel::Halfedge_const_handle Halfedge_const_handle ; + typedef typename SSkel::Face_const_handle Face_const_handle ; - typedef typename Ssds::Vertex_const_iterator Vertex_const_iterator ; - typedef typename Ssds::Halfedge_const_iterator Halfedge_const_iterator ; - typedef typename Ssds::Face_const_iterator Face_const_iterator ; + typedef typename SSkel::Vertex_const_iterator Vertex_const_iterator ; + typedef typename SSkel::Halfedge_const_iterator Halfedge_const_iterator ; + typedef typename SSkel::Face_const_iterator Face_const_iterator ; - typedef typename Ssds::Vertex_handle Vertex_handle ; - typedef typename Ssds::Halfedge_handle Halfedge_handle ; - typedef typename Ssds::Face_handle Face_handle ; + typedef typename SSkel::Vertex_handle Vertex_handle ; + typedef typename SSkel::Halfedge_handle Halfedge_handle ; + typedef typename SSkel::Face_handle Face_handle ; - typedef typename Ssds::Vertex_iterator Vertex_iterator ; - typedef typename Ssds::Halfedge_iterator Halfedge_iterator ; - typedef typename Ssds::Face_iterator Face_iterator ; + typedef typename SSkel::Vertex_iterator Vertex_iterator ; + typedef typename SSkel::Halfedge_iterator Halfedge_iterator ; + typedef typename SSkel::Face_iterator Face_iterator ; - typedef typename Ssds::size_type size_type ; + typedef typename SSkel::size_type size_type ; - typedef Straight_skeleton_builder_event_2 Event ; - typedef Straight_skeleton_builder_edge_event_2 EdgeEvent ; - typedef Straight_skeleton_builder_split_event_2 SplitEvent ; - typedef Straight_skeleton_builder_vertex_event_2 VertexEvent ; + typedef Straight_skeleton_builder_event_2 Event ; + typedef Straight_skeleton_builder_edge_event_2 EdgeEvent ; + typedef Straight_skeleton_builder_split_event_2 SplitEvent ; + typedef Straight_skeleton_builder_vertex_event_2 VertexEvent ; typedef boost::intrusive_ptr EventPtr ; @@ -89,13 +89,12 @@ private : typedef CGAL_SLS_i::Edge iEdge ; typedef CGAL_SLS_i::Triedge iTriedge ; - typedef typename Halfedge::SSBase SSBase; - typedef typename Halfedge::Base HBase; - typedef typename Vertex::Base VBase; - typedef typename Face::Base FBase; - typedef typename Ssds::Base SBase ; + typedef typename Halfedge::Base HBase; + typedef typename Vertex::Base VBase; + typedef typename Face::Base FBase; + typedef typename SSkel::Base SBase ; - typedef Straight_skeleton_builder_2 Self ; + typedef Straight_skeleton_builder_2 Self ; public: @@ -107,7 +106,7 @@ public: // template Straight_skeleton_builder_2& enter_contour ( InputPointIterator aBegin, InputPointIterator aEnd ) ; - Ssds construct_skeleton() ; + SSkel construct_skeleton() ; private : @@ -426,8 +425,7 @@ private : } else return EQUAL ; } - - + bool AreEventsSimultaneous( EventPtr const& aX, EventPtr const& aY ) const { Halfedge_handle xa = aX->border_a() ; @@ -460,7 +458,18 @@ private : , CreateTriedge(lSeedBorderA,lSeedBorderB,lSeedBorderC) ) == SMALLER ) + { +#ifdef CGAL_STRAIGHT_SKELETON_ENABLE_TRACE + FT lTime1, lTime2 ; + Point_2 lP1, lP2 ; + boost::tie(lTime1,lP1) = ConstructEventTimeAndPoint(CreateTriedge(aBorderA,aBorderB,aBorderC)); + boost::tie(lTime2,lP2) = ConstructEventTimeAndPoint(CreateTriedge(lSeedBorderA,lSeedBorderB,lSeedBorderC)); + CGAL_SSBUILDER_TRACE(1,"New event for N" << aSeedNode->id() << ", with t=" << lTime1 << ", is in the past (current t=" + << lTime2 << "). discarded." + ) ; +#endif rResult = true ; + } } return rResult ; @@ -480,7 +489,7 @@ private : void EraseBisector( Halfedge_handle aB ) { - mSS.SBase::edges_erase(aB); + mSSkel.SBase::edges_erase(aB); } BorderTriple GetDefiningBorders( Vertex_handle aA, Vertex_handle aB ) ; @@ -578,7 +587,7 @@ private: PQ mPQ ; //Output - Ssds mSS ; + SSkel mSSkel ; public: @@ -598,17 +607,17 @@ public: InputPointIterator lCurr = aBegin ; while ( lCurr != aEnd ) { - Halfedge_handle lCCWBorder = mSS.SBase::edges_push_back ( Halfedge(mEdgeID),Halfedge(mEdgeID+1) ); + Halfedge_handle lCCWBorder = mSSkel.SBase::edges_push_back ( Halfedge(mEdgeID),Halfedge(mEdgeID+1) ); Halfedge_handle lCWBorder = lCCWBorder->opposite(); mEdgeID += 2 ; mContourHalfedges.push_back(lCCWBorder); - Vertex_handle lVertex = mSS.SBase::vertices_push_back( Vertex(mVertexID++,*lCurr) ) ; + Vertex_handle lVertex = mSSkel.SBase::vertices_push_back( Vertex(mVertexID++,*lCurr) ) ; CGAL_SSBUILDER_TRACE(2,"Vertex: V" << lVertex->id() << " at " << lVertex->point() ); mWrappedVertices.push_back( VertexWrapper(lVertex) ) ; - Face_handle lFace = mSS.SBase::faces_push_back( Face() ) ; + Face_handle lFace = mSSkel.SBase::faces_push_back( Face() ) ; lCCWBorder->HBase::set_face (lFace); lFace ->FBase::set_halfedge(lCCWBorder); @@ -641,8 +650,8 @@ public: CGAL_SSBUILDER_TRACE(2,"CW Border: E" << lCWBorder ->id() << ' ' << lVertex ->point() << " -> " << lPrevVertex->point() ); CGAL_SSBUILDER_SHOW - ( 2 - , SS_IO_AUX::ScopedSegmentDrawing draw_(lPrevVertex->point(),lVertex->point(), CGAL::RED, "Border" ) ; + ( + SS_IO_AUX::ScopedSegmentDrawing draw_(lPrevVertex->point(),lVertex->point(), CGAL::RED, "Border" ) ; draw_.Release(); ) } @@ -663,8 +672,7 @@ public: lFirstCCWBorder->opposite()->HBase::set_vertex(lPrevVertex); CGAL_SSBUILDER_SHOW - ( 2 - , SS_IO_AUX::ScopedSegmentDrawing draw_(lPrevVertex->point(),lFirstVertex->point(), CGAL::RED, "Border" ) ; + ( SS_IO_AUX::ScopedSegmentDrawing draw_(lPrevVertex->point(),lFirstVertex->point(), CGAL::RED, "Border" ) ; draw_.Release(); ) @@ -682,7 +690,7 @@ public: ); } - for ( Vertex_iterator v = mSS.SBase::vertices_begin(); v != mSS.SBase::vertices_end(); ++ v ) + for ( Vertex_iterator v = mSSkel.SBase::vertices_begin(); v != mSSkel.SBase::vertices_end(); ++ v ) { mSLAV.push_back(static_cast(v)); Vertex_handle lPrev = GetPrevInLAV(v) ; diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_events_2.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_events_2.h index 6f6ee3cfa06..a5a86ee3928 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_events_2.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_events_2.h @@ -22,22 +22,22 @@ CGAL_BEGIN_NAMESPACE -template +template class Straight_skeleton_builder_event_2 : public Ref_counted_base { public: - typedef Straight_skeleton_builder_event_2 Self ; + typedef Straight_skeleton_builder_event_2 Self ; typedef boost::intrusive_ptr SelfPtr ; - typedef typename R::Rep Rep ; + typedef typename SSkel::Traits Traits ; - typedef typename Rep::Point_2 Point_2 ; - typedef typename Rep::FT FT ; + typedef typename Traits::Point_2 Point_2 ; + typedef typename Traits::FT FT ; - typedef typename R::Halfedge_handle Halfedge_handle ; - typedef typename R::Vertex_handle Vertex_handle ; + typedef typename SSkel::Halfedge_handle Halfedge_handle ; + typedef typename SSkel::Vertex_handle Vertex_handle ; enum Type { cEdgeEvent, cSplitEvent, cVertexEvent } ; @@ -73,7 +73,7 @@ public: void SetTimeAndPoint( FT aTime, Point_2 const& aP ) { mTime = aTime ; mP = aP ; } friend std::ostream& operator<< ( std::ostream& ss - ,Straight_skeleton_builder_event_2 const& e + ,Straight_skeleton_builder_event_2 const& e ) { ss << "[" ; @@ -99,19 +99,19 @@ private : bool mExcluded ; } ; -template -class Straight_skeleton_builder_edge_event_2 : public Straight_skeleton_builder_event_2 +template +class Straight_skeleton_builder_edge_event_2 : public Straight_skeleton_builder_event_2 { - typedef Straight_skeleton_builder_event_2 Base ; + typedef Straight_skeleton_builder_event_2 Base ; - typedef typename R::Rep Rep ; + typedef typename SSkel::Traits Traits ; - typedef typename Rep::Point_2 Point_2 ; - typedef typename Rep::FT FT ; + typedef typename Traits::Point_2 Point_2 ; + typedef typename Traits::FT FT ; - typedef typename R::Halfedge_handle Halfedge_handle ; - typedef typename R::Vertex_handle Vertex_handle ; + typedef typename SSkel::Halfedge_handle Halfedge_handle ; + typedef typename SSkel::Vertex_handle Vertex_handle ; typedef typename Base::Type Type ; @@ -129,7 +129,7 @@ public: , mRSeed(aRSeed) {} - virtual Type type() const { return Base::cEdgeEvent ; } + virtual Type type() const { return this->cEdgeEvent ; } virtual Vertex_handle seed0() const { return mLSeed ; } virtual Vertex_handle seed1() const { return mRSeed ; } @@ -148,19 +148,19 @@ private : Vertex_handle mRSeed ; } ; -template -class Straight_skeleton_builder_split_event_2 : public Straight_skeleton_builder_event_2 +template +class Straight_skeleton_builder_split_event_2 : public Straight_skeleton_builder_event_2 { - typedef Straight_skeleton_builder_event_2 Base ; + typedef Straight_skeleton_builder_event_2 Base ; - typedef typename R::Rep Rep ; + typedef typename SSkel::Traits Traits ; - typedef typename Rep::Point_2 Point_2 ; - typedef typename Rep::FT FT ; + typedef typename Traits::Point_2 Point_2 ; + typedef typename Traits::FT FT ; - typedef typename R::Halfedge_handle Halfedge_handle ; - typedef typename R::Vertex_handle Vertex_handle ; + typedef typename SSkel::Halfedge_handle Halfedge_handle ; + typedef typename SSkel::Vertex_handle Vertex_handle ; typedef typename Base::Type Type ; public: @@ -176,7 +176,7 @@ public: , mOppositeBorder(aOppositeBorder) {} - virtual Type type() const { return Base::cSplitEvent ; } + virtual Type type() const { return this->cSplitEvent ; } virtual Vertex_handle seed0() const { return mSeed ; } virtual Vertex_handle seed1() const { return mSeed ; } @@ -198,19 +198,19 @@ private : Halfedge_handle mOppositeBorder ; } ; -template -class Straight_skeleton_builder_vertex_event_2 : public Straight_skeleton_builder_event_2 +template +class Straight_skeleton_builder_vertex_event_2 : public Straight_skeleton_builder_event_2 { - typedef Straight_skeleton_builder_event_2 Base ; + typedef Straight_skeleton_builder_event_2 Base ; - typedef typename R::Rep Rep ; + typedef typename SSkel::Traits Traits ; - typedef typename Rep::Point_2 Point_2 ; - typedef typename Rep::FT FT ; + typedef typename Traits::Point_2 Point_2 ; + typedef typename Traits::FT FT ; - typedef typename R::Halfedge_handle Halfedge_handle ; - typedef typename R::Vertex_handle Vertex_handle ; + typedef typename SSkel::Halfedge_handle Halfedge_handle ; + typedef typename SSkel::Vertex_handle Vertex_handle ; typedef typename Base::Type Type ; @@ -230,7 +230,7 @@ public: , mRSeed(aRSeed) {} - virtual Type type() const { return Base::cVertexEvent ; } + virtual Type type() const { return this->cVertexEvent ; } Halfedge_handle border_d() const { return mBorderD ; } diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_traits_2.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_traits_2.h index 0aeeb237386..585395d6d9f 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_traits_2.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_traits_2.h @@ -49,6 +49,34 @@ struct Exist_sls_event_2 : Sls_functor_base_2 } }; +template +struct Compare_sls_event_distance_to_seed_2 : Sls_functor_base_2 +{ + typedef Sls_functor_base_2 Base ; + + typedef typename Base::Point_2 Point_2 ; + typedef typename Base::Triedge Triedge ; + + typedef Uncertain result_type ; + typedef Arity_tag<3> Arity ; + + Uncertain operator() ( Point_2 const& aP + , Triedge const& aL + , Triedge const& aR + ) const + { + return compare_offset_lines_isec_dist_to_pointC2(toVertex(aP),aL,aR) ; + } + + Uncertain operator() ( Triedge const& aS + , Triedge const& aL + , Triedge const& aR + ) const + { + return compare_offset_lines_isec_dist_to_pointC2(aS,aL,aR) ; + } + +}; template struct Compare_sls_event_times_2 : Sls_functor_base_2 @@ -70,43 +98,6 @@ struct Compare_sls_event_times_2 : Sls_functor_base_2 } }; -template -struct Compare_sls_event_distance_to_seed_2 : Sls_functor_base_2 -{ - typedef Sls_functor_base_2 Base ; - - typedef typename Base::Point_2 Point_2 ; - typedef typename Base::Triedge Triedge ; - - typedef Uncertain result_type ; - typedef Arity_tag<3> Arity ; - - Uncertain operator() ( Point_2 const& aP - , Triedge const& aL - , Triedge const& aR - ) const - { - Uncertain rResult = compare_offset_lines_isec_dist_to_pointC2(toVertex(aP),aL,aR) ; - - CGAL_SLS_ASSERT_PREDICATE_RESULT(rResult,K,"Compapre_dist_to_point:","P=" << aP << "\nL=" << aL << "\nR=" << aR); - - return rResult ; - } - - Uncertain operator() ( Triedge const& aS - , Triedge const& aL - , Triedge const& aR - ) const - { - Uncertain rResult = compare_offset_lines_isec_dist_to_pointC2(aS,aL,aR) ; - - CGAL_SLS_ASSERT_PREDICATE_RESULT(rResult,K,"Compapre_dist_to_point:","S=" << aS << "\nL=" << aL << "\nR=" << aR); - - return rResult ; - } - -}; - template struct Is_sls_event_inside_offset_zone_2 : Sls_functor_base_2 { @@ -223,7 +214,7 @@ public: typedef Unfiltered_predicate_adaptor Compare_sls_event_distance_to_seed_2 ; - + typedef Unfiltered_predicate_adaptor Is_sls_event_inside_offset_zone_2 ; @@ -270,8 +261,7 @@ public: , C2F > Compare_sls_event_distance_to_seed_2 ; - - + typedef Filtered_predicate< typename Exact ::Is_sls_event_inside_offset_zone_2 , typename Filtering::Is_sls_event_inside_offset_zone_2 , C2E diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_traits_2_aux.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_traits_2_aux.h index 9cb95b8148f..e8619fe2250 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_traits_2_aux.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_builder_traits_2_aux.h @@ -35,7 +35,6 @@ # include # include # define CGAL_SSTRAITS_TRACE(m) \ - if ( l <= CGAL_STRAIGHT_SKELETON_TRAITS_ENABLE_TRACE ) \ { \ std::ostringstream ss ; \ ss << std::setprecision(19) << m << std::ends ; \ diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_halfedge_base_2.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_halfedge_base_2.h index b610190fee4..2e2d4cb53f6 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_halfedge_base_2.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_halfedge_base_2.h @@ -49,18 +49,18 @@ public: bool is_bisector() const { - return !HBase::is_border() && !HBase::opposite()->is_border() ; + return !this->is_border() && !this->opposite()->is_border() ; } bool is_inner_bisector() const { - return !HBase::vertex()->is_contour() && !HBase::opposite()->HBase::vertex()->is_contour(); + return !this->vertex()->is_contour() && !this->opposite()->vertex()->is_contour(); } - Halfedge_const_handle defining_contour_edge() const { return HBase::face()->halfedge() ; } - Halfedge_handle defining_contour_edge() { return HBase::face()->halfedge() ; } + Halfedge_const_handle defining_contour_edge() const { return this->face()->halfedge() ; } + Halfedge_handle defining_contour_edge() { return this->face()->halfedge() ; } - void set_opposite( Halfedge_handle h) { HBase::set_opposite(h);} + //void set_opposite( Halfedge_handle h) { this->set_opposite(h);} private: @@ -73,13 +73,13 @@ class Straight_skeleton_halfedge_base_2 { public: - typedef Straight_skeleton_halfedge_base_base_2 < Refs, S > SSBase ; + typedef Straight_skeleton_halfedge_base_base_2 < Refs, S > SBase ; - typedef typename SSBase::HBase_base HBase_base ; + typedef typename SBase::HBase_base HBase_base ; + typedef typename SBase::Base HBase ; - typedef typename SSBase::Base HBase ; - - typedef typename SSBase::Segment_2 Segment_2; + typedef typename SBase::Segment_2 Segment_2; + typedef typename HBase::Halfedge_handle Halfedge_handle ; typedef typename HBase::Vertex_handle Vertex_handle ; typedef typename HBase::Face_handle Face_handle ; @@ -87,15 +87,15 @@ public: public: Straight_skeleton_halfedge_base_2() {} - Straight_skeleton_halfedge_base_2( int aID ) : SSBase(aID) {} + Straight_skeleton_halfedge_base_2( int aID ) : SBase(aID) {} - void set_opposite( Halfedge_handle h) { HBase_base::set_opposite(h);} + //void set_opposite( Halfedge_handle h) { this->set_opposite(h);} protected: - void set_prev ( Halfedge_handle h ) { HBase_base::set_prev(h) ; } - void set_vertex( Vertex_handle w ) { HBase_base::set_vertex(w); } - void set_face ( Face_handle g ) { HBase_base::set_face(g) ; } + //void set_prev ( Halfedge_handle h ) { this->set_prev(h) ; } + //void set_vertex( Vertex_handle w ) { this->set_vertex(w); } + //void set_face ( Face_handle g ) { this->set_face(g) ; } }; CGAL_END_NAMESPACE diff --git a/Straight_skeleton_2/include/CGAL/Straight_skeleton_vertex_base_2.h b/Straight_skeleton_2/include/CGAL/Straight_skeleton_vertex_base_2.h index bbe65ba630b..a56261c5141 100644 --- a/Straight_skeleton_2/include/CGAL/Straight_skeleton_vertex_base_2.h +++ b/Straight_skeleton_2/include/CGAL/Straight_skeleton_vertex_base_2.h @@ -159,31 +159,31 @@ public: FT time() const { return mTime ; } - Halfedge_const_handle primary_bisector() const { return Base::halfedge()->next(); } + Halfedge_const_handle primary_bisector() const { return this->halfedge()->next(); } - Halfedge_handle primary_bisector() { return Base::halfedge()->next(); } + Halfedge_handle primary_bisector() { return this->halfedge()->next(); } Halfedge_around_vertex_const_circulator incident_edges_begin() const { - return Halfedge_around_vertex_const_circulator(Base::halfedge()); + return Halfedge_around_vertex_const_circulator(this->halfedge()); } Halfedge_around_vertex_circulator incident_edges_begin() { - return Halfedge_around_vertex_circulator(Base::halfedge()); + return Halfedge_around_vertex_circulator(this->halfedge()); } Halfedge_across_incident_faces_const_circulator defining_contour_edges_begin() const { - return Halfedge_across_incident_faces_const_circulator(Base::halfedge()); + return Halfedge_across_incident_faces_const_circulator(this->halfedge()); } Halfedge_across_incident_faces_circulator defining_contour_edges_begin() { - return Halfedge_across_incident_faces_circulator(Base::halfedge()); + return Halfedge_across_incident_faces_circulator(this->halfedge()); } - bool is_skeleton() const { return Base::halfedge()->is_bisector() ; } - bool is_contour () const { return !Base::halfedge()->is_bisector() ; } + bool is_skeleton() const { return this->halfedge()->is_bisector() ; } + bool is_contour () const { return !this->halfedge()->is_bisector() ; } private: @@ -218,7 +218,7 @@ public: Base(aID,aP,aTime) {} protected: - void set_halfedge( Halfedge_handle h ) { Base_base::set_halfedge(h) ; } +// void set_halfedge( Halfedge_handle h ) { this->set_halfedge(h) ; } }; CGAL_END_NAMESPACE diff --git a/Straight_skeleton_2/include/CGAL/certified_numeric_predicates.h b/Straight_skeleton_2/include/CGAL/certified_numeric_predicates.h index 82e878876e9..708668c7420 100644 --- a/Straight_skeleton_2/include/CGAL/certified_numeric_predicates.h +++ b/Straight_skeleton_2/include/CGAL/certified_numeric_predicates.h @@ -128,6 +128,15 @@ inline Uncertain certified_is_larger_or_equal(const NT1& n1, const NT2& n2 return certified_is_larger_or_equal(certified_compare(n1,n2)) ; } +template +inline Uncertain certified_sign_of_determinant2x2( const NT& a00 + , const NT& a01 + , const NT& a10 + , const NT& a11 + ) +{ + return enum_cast(certified_compare(a00*a11, a10*a01)) ; +} CGAL_END_NAMESPACE diff --git a/Straight_skeleton_2/include/CGAL/constructions/Straight_skeleton_cons_ftC2.h b/Straight_skeleton_2/include/CGAL/constructions/Straight_skeleton_cons_ftC2.h index a2997396534..d6c8565123a 100644 --- a/Straight_skeleton_2/include/CGAL/constructions/Straight_skeleton_cons_ftC2.h +++ b/Straight_skeleton_2/include/CGAL/constructions/Straight_skeleton_cons_ftC2.h @@ -232,16 +232,19 @@ Rational compute_degenerate_offset_lines_isec_timeC2 ( SortedTriedge con num = (l2.a() * l0.b() - l0.a() * l2.b() ) * qx + l0.b() * l2.c() - l2.b() * l0.c() ; den = (l0.a() * l0.a() - 1) * l2.b() + ( 1 - l2.a() * l0.a() ) * l0.b() ; + + CGAL_SSTRAITS_TRACE("Non-vertical Degenerate Event:\nn=" << num << "\nd=" << den ) } else { FT qy = ( triedge.e0().t().y() + triedge.e1().s().y() ) / static_cast(2.0); - num = (l2.a() * l0.b() - l0.a() * l2.b() ) * qy + l0.a() * l2.c() - l2.a() * l0.c() ; + num = (l2.a() * l0.b() - l0.a() * l2.b() ) * qy - l0.a() * l2.c() + l2.a() * l0.c() ; den = l0.a() * l0.b() * l2.b() - l0.b() * l0.b() * l2.a() + l2.a() - l0.a() ; + + CGAL_SSTRAITS_TRACE("Vertical Degenerate Event:\nn=" << num << "\nd=" << den ) } - CGAL_SSTRAITS_TRACE("Degenerate Event:\nn=" << num << "\nd=" << den ) return Rational(num,den) ; } @@ -312,7 +315,7 @@ Vertex construct_degenerate_offset_lines_isecC2 ( SortedTriedge const& t } else { - num = (l2.a() * l0.b() - l0.a() * l2.b() ) * qy + l0.a() * l2.c() - l2.a() * l0.c() ; + num = (l2.a() * l0.b() - l0.a() * l2.b() ) * qy - l0.a() * l2.c() + l2.a() * l0.c() ; den = l0.a() * l0.b() * l2.b() - l0.b() * l0.b() * l2.a() + l2.a() - l0.a() ; } diff --git a/Straight_skeleton_2/include/CGAL/predicates/Straight_skeleton_pred_ftC2.h b/Straight_skeleton_2/include/CGAL/predicates/Straight_skeleton_pred_ftC2.h index ae31885437c..efa5d6df66b 100644 --- a/Straight_skeleton_2/include/CGAL/predicates/Straight_skeleton_pred_ftC2.h +++ b/Straight_skeleton_2/include/CGAL/predicates/Straight_skeleton_pred_ftC2.h @@ -44,6 +44,18 @@ Uncertain are_edges_collinear( Edge const& e0, Edge const& e1 ) ) ; } +template +Uncertain are_edges_parallel( Edge const& e0, Edge const& e1 ) +{ + Uncertain s = certified_sign_of_determinant2x2(e0.t().x() - e0.s().x() + ,e0.t().y() - e0.s().y() + ,e1.t().x() - e1.s().x() + ,e1.t().y() - e1.s().y() + ) ; + return s == Uncertain(ZERO); +} + + template SortedTriedge collinear_sort ( Triedge const& triedge ) { @@ -55,10 +67,10 @@ SortedTriedge collinear_sort ( Triedge const& triedge ) if ( !CGAL_NTS is_indeterminate(is_01) ) { Uncertain is_02 = are_edges_collinear(triedge.e0(),triedge.e2()); - if ( !CGAL_NTS is_indeterminate(is_01) ) + if ( !CGAL_NTS is_indeterminate(is_02) ) { Uncertain is_12 = are_edges_collinear(triedge.e1(),triedge.e2()); - if ( !CGAL_NTS is_indeterminate(is_01) ) + if ( !CGAL_NTS is_indeterminate(is_12) ) { if ( CGAL_NTS logical_and(is_01 , !is_02 , !is_12 ) ) { @@ -98,6 +110,32 @@ SortedTriedge collinear_sort ( Triedge const& triedge ) } +// Given some input edge E1, there is a sequence of offset polygons, in some time range (possibly including time 0), +// such that E1 has E0 and E2 as adjacent edges. +// At time 0, E0 and E2 are the edges adjacent to E1 in the input polygon, but later, E0 and E2 can be any edges. +// There is some time range were E0->E1->E2 are consecutive in each offset polygon. For each specific t +// in the range, the vertices (E0,E1) and (E1,E2) move along the bisectors (E0,E1) and (E1,E2). Thus, the actual length +// and position of each E1 offset varies along the time period. +// The set of all the E1 offsets which have E0 and E2 as inmediate neighbors is called the "Offset Zone" for E1 w.r.t to E0 and E2. +// +// Such offset zone is the part of the halfplane to the left of E1 (were _all_ offsets to E1 are) bounded between the bisectors +// (E0,E1) and (E1,E2) +// +// If E0 and/or E2 are parallel to E1, then there is just 1 E1 offset, located at the medial bisector of the E2 and its parallel(s). +// +// But E0 and E2 are the inmediate neighbors of E1 in the offset polygon (at some t), so if E0 and/or E2 are parallel to E1, +// it means that such an offset polygon has degenerated to an innermost segment. Thus, E1 can't be split further by any +// other reflex wavefront. +// Therefore, is E0 or E2 are parallel to E1, the offset zone for E1 w.r.t to E0,E2 is said to be "degenerate". +template +Uncertain is_offset_zone_degenerate ( Triedge const& zone ) +{ + Uncertain is_01 = are_edges_parallel(zone.e0(),zone.e1()); + Uncertain is_12 = are_edges_parallel(zone.e1(),zone.e2()); + + return CGAL_NTS logical_or(is_01,is_12); +} + // Given 3 oriented straight line segments: l0, l1, l2 [each segment is passed as (sx,sy,tx,ty)] // returns true if there exist some positive offset distance 't' for which the // leftward-offsets of their supporting lines intersect at a single point. @@ -114,7 +152,7 @@ Uncertain exist_offset_lines_isec2 ( Triedge const& triedge ) { if ( sorted.collinear_count() < 3 ) // If the 3 edges are collinear thre is no event. { - CGAL_SSTRAITS_TRACE( ( sorted.is_normal() ? " normal edges" : " collinear edges" ) ) ; + CGAL_SSTRAITS_TRACE( ( sorted.collinear_count() == 0 ? " normal edges" : " collinear edges" ) ) ; Rational t = compute_offset_lines_isec_timeC2(sorted) ; @@ -233,8 +271,9 @@ compare_offset_lines_isec_dist_to_pointC2 ( Triedge const& s } + // Given a triple of oriented lines in _normalized_ implicit form: (e0,e1,e2) such that their offsets -// at a distance 't intersects in a point (x,y); and another triple of oriented lines in _normalized_ implicit form: +// at somne distance intersects in a point (x,y); and another triple of oriented lines in _normalized_ implicit form: // (el,ec,er); returns true if the intersection point (x,y) is inside the offset zone of 'ec' w.r.t 'el' and 'er'; // that is, the locus of points to the left of 'ec', to the right of the bisector (el,ec) and to the left of the bisector // (ec,er). @@ -245,92 +284,101 @@ compare_offset_lines_isec_dist_to_pointC2 ( Triedge const& s // template Uncertain -is_offset_lines_isec_inside_offset_zoneC2 ( Triedge const& triedge, Triedge const& zone ) +is_offset_lines_isec_inside_offset_zoneC2 ( Triedge const& event, Triedge const& zone ) { Uncertain r = Uncertain::indeterminate(); - SortedTriedge sorted = collinear_sort(triedge); - if ( !sorted.is_indeterminate() ) + SortedTriedge e_sorted = collinear_sort(event); + + Uncertain degenerate_zone = is_offset_zone_degenerate(zone); + + if ( !(e_sorted.is_indeterminate() || is_indeterminate(degenerate_zone)) ) { - CGAL_assertion ( sorted.collinear_count() < 3 ) ; + CGAL_assertion ( e_sorted.collinear_count() < 3 ) ; - Line zl = compute_normalized_line_ceoffC2(zone.e0()) ; - Line zc = compute_normalized_line_ceoffC2(zone.e1()) ; - Line zr = compute_normalized_line_ceoffC2(zone.e2()) ; - - // Construct intersection point (x,y) - Vertex i = construct_offset_lines_isecC2(sorted); - - // Calculate scaled (signed) distance from (x,y) to 'zc' - FT sdc = zc.a() * i.x() + zc.b() * i.y() + zc.c() ; - - CGAL_SSTRAITS_TRACE("\nsdc=" << sdc ) ; - - // NOTE: - // if (x,y) is not on the positive side of 'ec' it isn't on it's offset zone. - // Also, if (x,y) is over 'ec' (its signed distance to ec is not certainly positive) then by definition is not on its _offset_ - // zone either. - Uncertain cok = CGAL_NTS certified_is_positive(sdc); - if ( ! CGAL_NTS is_indeterminate(cok) ) + if ( !degenerate_zone ) { - if ( cok == true ) + Line zl = compute_normalized_line_ceoffC2(zone.e0()) ; + Line zc = compute_normalized_line_ceoffC2(zone.e1()) ; + Line zr = compute_normalized_line_ceoffC2(zone.e2()) ; + + // Construct intersection point (x,y) + Vertex i = construct_offset_lines_isecC2(e_sorted); + + // Calculate scaled (signed) distance from (x,y) to 'zc' + FT sdc = zc.a() * i.x() + zc.b() * i.y() + zc.c() ; + + CGAL_SSTRAITS_TRACE("\nsdc=" << sdc ) ; + + // NOTE: + // if (x,y) is not on the positive side of 'ec' it isn't on it's offset zone. + // Also, if (x,y) is over 'ec' (its signed distance to ec is not certainly positive) then by definition is not on its _offset_ + // zone either. + Uncertain cok = CGAL_NTS certified_is_positive(sdc); + if ( ! CGAL_NTS is_indeterminate(cok) ) { - CGAL_SSTRAITS_TRACE("\nright side of ec." ) ; - - // Calculate scaled (signed) distances from (x,y) to 'el' and 'er' - FT sdl = zl.a() * i.x() + zl.b() * i.y() + zl.c() ; - FT sdr = zr.a() * i.x() + zr.b() * i.y() + zr.c() ; - - CGAL_SSTRAITS_TRACE("\nsdl=" << sdl ) ; - CGAL_SSTRAITS_TRACE("\nsdr=" << sdr ) ; - - // Determine if the vertices (el,ec) and (ec,er) are reflex. - Uncertain lcx = CGAL_NTS certified_is_smaller(zl.a()*zc.b(),zc.a()*zl.b()); - Uncertain crx = CGAL_NTS certified_is_smaller(zc.a()*zr.b(),zr.a()*zc.b()); - - if ( ! CGAL_NTS is_indeterminate(lcx) && ! CGAL_NTS is_indeterminate(crx) ) + if ( cok == true ) { - CGAL_SSTRAITS_TRACE("\n(el,ec) reflex:" << lcx ) ; - CGAL_SSTRAITS_TRACE("\n(ec,er) reflex:" << crx ) ; - - // Is (x,y) to the right|left of the bisectors (el,ec) and (ec,er)? - // It depends on whether the vertex ((el,ec) and (ec,er)) is relfex or not. - // If it is reflex, then (x,y) is to the right|left of the bisector if sdl|sdr <= sdc; otherwise, if sdc <= sdl|srd - - Uncertain lok = lcx ? CGAL_NTS certified_is_smaller_or_equal(sdl,sdc) - : CGAL_NTS certified_is_smaller_or_equal(sdc,sdl) ; - - Uncertain rok = crx ? CGAL_NTS certified_is_smaller_or_equal(sdr,sdc) - : CGAL_NTS certified_is_smaller_or_equal(sdc,sdr) ; - - CGAL_SSTRAITS_TRACE("\nlok:" << lok) ; - CGAL_SSTRAITS_TRACE("\nrok:" << rok) ; - - r = CGAL_NTS logical_and(lok , rok) ; + CGAL_SSTRAITS_TRACE("\nright side of ec." ) ; + + // Calculate scaled (signed) distances from (x,y) to 'el' and 'er' + FT sdl = zl.a() * i.x() + zl.b() * i.y() + zl.c() ; + FT sdr = zr.a() * i.x() + zr.b() * i.y() + zr.c() ; + + CGAL_SSTRAITS_TRACE("\nsdl=" << sdl ) ; + CGAL_SSTRAITS_TRACE("\nsdr=" << sdr ) ; + + // Determine if the vertices (el,ec) and (ec,er) are reflex. + Uncertain lcx = CGAL_NTS certified_is_smaller(zl.a()*zc.b(),zc.a()*zl.b()); + Uncertain crx = CGAL_NTS certified_is_smaller(zc.a()*zr.b(),zr.a()*zc.b()); + + if ( ! CGAL_NTS is_indeterminate(lcx) && ! CGAL_NTS is_indeterminate(crx) ) + { + CGAL_SSTRAITS_TRACE("\n(el,ec) reflex:" << lcx ) ; + CGAL_SSTRAITS_TRACE("\n(ec,er) reflex:" << crx ) ; + + // Is (x,y) to the right|left of the bisectors (el,ec) and (ec,er)? + // It depends on whether the vertex ((el,ec) and (ec,er)) is relfex or not. + // If it is reflex, then (x,y) is to the right|left of the bisector if sdl|sdr <= sdc; otherwise, if sdc <= sdl|srd + + Uncertain lok = lcx ? CGAL_NTS certified_is_smaller_or_equal(sdl,sdc) + : CGAL_NTS certified_is_smaller_or_equal(sdc,sdl) ; + + Uncertain rok = crx ? CGAL_NTS certified_is_smaller_or_equal(sdr,sdc) + : CGAL_NTS certified_is_smaller_or_equal(sdc,sdr) ; + + CGAL_SSTRAITS_TRACE("\nlok:" << lok) ; + CGAL_SSTRAITS_TRACE("\nrok:" << rok) ; + + r = CGAL_NTS logical_and(lok , rok) ; + } + else + { + CGAL_SSTRAITS_TRACE("\nUnable to reliably determine side-of-line." ) ; + } } else { - CGAL_SSTRAITS_TRACE("\nUnable to reliably determine side-of-line." ) ; + CGAL_SSTRAITS_TRACE("\nWRONG side of ec." ) ; + r = make_uncertain(false); } } else { - CGAL_SSTRAITS_TRACE("\nWRONG side of ec." ) ; - r = make_uncertain(false); + CGAL_SSTRAITS_TRACE("\nUnable to reliably determine side-of-line." ) ; } } else { - CGAL_SSTRAITS_TRACE("\nUnable to reliably determine side-of-line." ) ; + CGAL_SSTRAITS_TRACE("\nDegenerate offset zone. Edge collapsed." ) ; + r = make_uncertain(false); } } else { - CGAL_SSTRAITS_TRACE("\nUnable to determine collinearity of event triedge." ) ; + CGAL_SSTRAITS_TRACE("\nUnable to determine collinearity of event triedge or parallelity of zone triedge." ) ; } - - return r ; } diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate0.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate0.poly new file mode 100644 index 00000000000..841c583054d --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate0.poly @@ -0,0 +1,7 @@ +1 +5 +0 0 +4 0 +8 0 +8 2 +0 2 diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate1.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate1.poly new file mode 100644 index 00000000000..b52c737ae43 --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate1.poly @@ -0,0 +1,8 @@ +1 +6 +0 0 +4 0 +8 0 +8 2 +4 2 +0 2 diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate10.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate10.poly new file mode 100644 index 00000000000..811c09ce2a3 --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate10.poly @@ -0,0 +1,14 @@ +1 +11 +0 2 +1 2 +5 2 +5 0 +9 0 +9 2 +12 2 +13 2 +13 3 +13 5 +0 5 + diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate11.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate11.poly new file mode 100644 index 00000000000..3bd0d9ec4aa --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate11.poly @@ -0,0 +1,14 @@ +1 +12 +0 0 +1 0 +3 0 +4 0 +4 1 +4 3 +4 4 +3 4 +1 4 +0 4 +0 3 +0 1 diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate12.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate12.poly new file mode 100644 index 00000000000..d3a7e813d97 --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate12.poly @@ -0,0 +1,12 @@ +1 +10 +0 2 +3 2 +5 0 +6 1 +8 1 +8 2 +6 2 +5 1 +3 3 +0 3 diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate2.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate2.poly new file mode 100644 index 00000000000..d3c81bb4b66 --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate2.poly @@ -0,0 +1,7 @@ +1 +5 +0 0 +8 0 +8 1 +8 2 +0 2 diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate3.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate3.poly new file mode 100644 index 00000000000..025254f6d8d --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate3.poly @@ -0,0 +1,9 @@ +1 +7 +0 0 +4 0 +8 0 +8 1 +8 2 +4 2 +0 2 diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate4.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate4.poly new file mode 100644 index 00000000000..79514ee6813 --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate4.poly @@ -0,0 +1,10 @@ +1 +8 +0 0 +4 0 +8 0 +8 1 +8 2 +4 2 +0 2 +0 1 diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate5.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate5.poly new file mode 100644 index 00000000000..2d017e17d8c --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate5.poly @@ -0,0 +1,8 @@ +1 +6 +0 0 +3 0 +5 0 +8 0 +8 2 +0 2 diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate6.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate6.poly new file mode 100644 index 00000000000..d701ffddb4d --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate6.poly @@ -0,0 +1,8 @@ +1 +6 +0 0 +1 0 +7 0 +8 0 +8 2 +0 2 diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate7.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate7.poly new file mode 100644 index 00000000000..4f9bd63a396 --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate7.poly @@ -0,0 +1,9 @@ +1 +7 +0 0 +3 0 +5 0 +8 0 +8 2 +4 2 +0 2 diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate8.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate8.poly new file mode 100644 index 00000000000..1f8e1d3cf98 --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate8.poly @@ -0,0 +1,14 @@ +1 +12 +0 0 +1 0 +4 0 +7 0 +8 0 +8 1 +8 2 +7 2 +4 2 +1 2 +0 2 +0 1 diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate9.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate9.poly new file mode 100644 index 00000000000..174b11589a1 --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate9.poly @@ -0,0 +1,12 @@ +1 +9 +0 2 +2 2 +5 2 +5 0 +9 0 +9 2 +13 2 +13 5 +0 5 + diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate_multinode0.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate_multinode0.poly new file mode 100644 index 00000000000..f1e408739ec --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/degenerate_multinode0.poly @@ -0,0 +1,31 @@ +1 +28 +3 0 +4 0 +4 1 +5 1 +6 1 +6 2 +6 3 +7 3 +7 4 +6 4 +6 5 +6 6 +5 6 +4 6 +4 7 +3 7 +3 6 +2 6 +1 6 +1 5 +1 4 +0 4 +0 3 +1 3 +1 2 +1 1 +2 1 +3 1 + diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/double_edge.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/double_edge.poly new file mode 100644 index 00000000000..d0461fae6ff --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/double_edge.poly @@ -0,0 +1,8 @@ +1 +5 +0 0 +2 1 +2 6 +-2 6 +-2 1 + diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/make_list b/Straight_skeleton_2/test/Straight_skeleton_2/data/make_list new file mode 100755 index 00000000000..d8279ca0e94 --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/make_list @@ -0,0 +1 @@ +ls --format=single-column -S -r diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/multinode1.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/multinode1.poly new file mode 100644 index 00000000000..26136b473ff --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/multinode1.poly @@ -0,0 +1,23 @@ +1 +20 +0 0 +2 0 +2 1 +3 1 +3 0 +5 0 +5 2 +4 2 +4 3 +5 3 +5 5 +3 5 +3 4 +2 4 +2 5 +0 5 +0 3 +1 3 +1 2 +0 2 + diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/parallels0.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/parallels0.poly new file mode 100644 index 00000000000..3e82db170c4 --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/parallels0.poly @@ -0,0 +1,33 @@ +1 +29 +2 1 +5 3 +5 1 +6 0 +7 3 +7 0 +9 3 +10 0 +15 0 +12 2 +14 2 +12 5 +14 8 +13 8 +13 9 +12 9 +12 8 +10 10 +9 9 +8 6 +5 9 +2 7 +1 7 +1 6 +0 6 +0 5 +2 5 +0 4 +3 2 + + diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/parallels0_b.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/parallels0_b.poly new file mode 100644 index 00000000000..e3522dd39c2 --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/parallels0_b.poly @@ -0,0 +1,32 @@ +1 +28 +2 1 +5 3 +5 1 +6 0 +7 3 +7 0 +9 3 +10 0 +15 0 +12 2 +14 2 +12 5 +14 8 +13 8 +13 9 +12 9 +12 8 +10 10 +9 9 +8 6 +5 9 +2 7 +1 7 +1 6 +0 6 +0 5 +2 5 +0 4 + + diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/sample_102.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/sample_102.poly new file mode 100644 index 00000000000..1616a8208be --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/sample_102.poly @@ -0,0 +1,2 @@ +1 +781 16.2499 68.9065 16.243 68.9019 16.2459 68.8954 16.2465 68.894 16.2434 68.8895 16.275 68.8859 16.2873 68.8829 16.3441 68.8418 16.3431 68.8342 16.3358 68.8328 16.3199 68.8329 16.3084 68.8357 16.2913 68.8421 16.2804 68.8535 16.2722 68.8581 16.2652 68.8621 16.2563 68.8645 16.2086 68.8687 16.1889 68.8687 16.1602 68.8538 16.1218 68.8457 16.1105 68.8345 16.1011 68.8295 16.0881 68.8263 16.0886 68.8183 16.106 68.8063 16.117 68.7948 16.1179 68.7944 16.1265 68.7905 16.1426 68.7875 16.1557 68.7818 16.1942 68.7713 16.2086 68.7695 16.2386 68.7621 16.248 68.7581 16.2408 68.7523 16.2428 68.7497 16.2658 68.7445 16.2608 68.7421 16.2451 68.7417 16.2282 68.7388 16.1966 68.7408 16.1786 68.7374 16.1661 68.7371 16.1466 68.7384 16.13 68.7395 16.081 68.7488 16.0657 68.7492 16.0618 68.7476 16.0532 68.7423 16.0399 68.7016 16.026 68.6953 16.025 68.6879 16.0312 68.684 16.066 68.6773 16.0772 68.6734 16.0792 68.6688 16.0777 68.6651 16.0829 68.6605 16.08 68.6574 16.0931 68.6512 16.0818 68.6405 16.0735 68.6385 16.0622 68.6406 16.0525 68.6393 16.049 68.6403 16.0568 68.6482 16.0471 68.6683 16.0395 68.6749 16.0336 68.6758 16.0153 68.6737 16.0048 68.6793 15.9919 68.6781 15.9573 68.665 15.9454 68.6614 15.8915 68.6445 15.9042 68.6402 15.8976 68.637 15.8782 68.6385 15.8643 68.6366 15.8378 68.6284 15.8245 68.6265 15.8076 68.6201 15.8178 68.5968 15.8167 68.586 15.826 68.5801 15.8253 68.5739 15.8234 68.5714 15.8162 68.5625 15.8052 68.5616 15.798 68.5583 15.7884 68.5591 15.7759 68.5547 15.7586 68.5455 15.7474 68.5349 15.7344 68.5365 15.7222 68.5353 15.7176 68.5381 15.7199 68.5407 15.7406 68.5491 15.7476 68.5547 15.7489 68.563 15.7608 68.561 15.8015 68.5697 15.7765 68.6147 15.7592 68.6197 15.7712 68.6239 15.7734 68.6329 15.7748 68.6336 15.7817 68.637 15.8526 68.6545 15.8808 68.6529 15.8927 68.6575 15.8884 68.6612 15.8911 68.6648 15.9149 68.6719 15.9203 68.6811 15.9415 68.6883 15.9557 68.6981 15.9832 68.7097 15.9847 68.7151 15.9887 68.7174 15.9917 68.7192 15.9929 68.7324 16.0011 68.7387 15.9981 68.7617 16.0095 68.779 15.9996 68.7866 15.9926 68.7971 15.9712 68.7968 15.9561 68.8006 15.9474 68.7998 15.9413 68.7908 15.9298 68.7846 15.9261 68.778 15.9207 68.7769 15.8919 68.7737 15.8684 68.7633 15.8423 68.7575 15.8368 68.7545 15.8376 68.7479 15.8016 68.7414 15.7705 68.7395 15.7635 68.7417 15.766 68.7439 15.7789 68.7451 15.7939 68.7501 15.8078 68.752 15.8167 68.7562 15.8236 68.7669 15.8353 68.7701 15.8395 68.7748 15.8485 68.7771 15.8672 68.7819 15.8753 68.7866 15.8931 68.8031 15.9344 68.8666 15.9515 68.8773 15.9638 68.8957 15.9622 68.8989 15.9487 68.9054 15.913 68.9225 15.9098 68.929 15.9203 68.9554 15.9123 68.965 15.9048 68.9686 15.8945 68.9707 15.8637 68.9713 15.7876 68.9566 15.7837 68.9569 15.7759 68.9614 15.7683 68.9614 15.7565 68.9579 15.7458 68.9616 15.7497 68.9696 15.7402 68.9736 15.7223 68.9733 15.7181 68.9665 15.6889 68.9656 15.6722 68.9619 15.6332 68.9578 15.6285 68.9544 15.6313 68.9518 15.6446 68.9521 15.6308 68.9409 15.6073 68.9285 15.6073 68.9184 15.6036 68.9141 15.6051 68.9121 15.6068 68.9098 15.6008 68.9027 15.6061 68.896 15.6173 68.8907 15.6037 68.8876 15.5883 68.8919 15.5782 68.8917 15.5701 68.8888 15.548 68.8624 15.5495 68.8597 15.595 68.8425 15.6284 68.8335 15.6412 68.8333 15.6602 68.8295 15.6577 68.8271 15.6753 68.8195 15.653 68.8177 15.6203 68.8228 15.6072 68.8221 15.5854 68.8267 15.5746 68.8267 15.5697 68.8281 15.5548 68.8268 15.5405 68.8221 15.5419 68.8076 15.5387 68.8057 15.5348 68.8057 15.5127 68.8195 15.4911 68.8175 15.4637 68.8196 15.4581 68.8152 15.4616 68.8133 15.4681 68.8099 15.4644 68.7936 15.4788 68.7882 15.4793 68.783 15.477 68.7801 15.4635 68.7747 15.4588 68.758 15.4628 68.7554 15.4869 68.7513 15.5007 68.7439 15.5103 68.7415 15.511 68.7372 15.5187 68.735 15.5218 68.7312 15.5275 68.7312 15.5371 68.7369 15.556 68.7393 15.5837 68.7397 15.587 68.7407 15.6115 68.7477 15.6256 68.7492 15.6462 68.7462 15.6576 68.7464 15.6477 68.7393 15.6491 68.733 15.6592 68.7251 15.7033 68.703 15.7012 68.6997 15.6913 68.7009 15.6529 68.7168 15.6347 68.7336 15.6298 68.7381 15.6211 68.7394 15.5636 68.7311 15.5515 68.7273 15.5168 68.725 15.4954 68.7246 15.4711 68.7274 15.4572 68.7312 15.4507 68.7298 15.4337 68.7158 15.4341 68.7126 15.4402 68.7034 15.468 68.6837 15.4778 68.6767 15.4767 68.6741 15.464 68.6706 15.463 68.6676 15.4892 68.6567 15.4994 68.6486 15.5134 68.6462 15.5638 68.6423 15.5763 68.6387 15.5924 68.6276 15.6228 68.6209 15.6137 68.6179 15.6018 68.6177 15.588 68.6215 15.5839 68.6183 15.5841 68.6117 15.5792 68.6123 15.5749 68.6129 15.5688 68.6163 15.5705 68.6329 15.5604 68.6351 15.5443 68.6342 15.5316 68.6304 15.5112 68.6293 15.4872 68.6292 15.4604 68.6323 15.4289 68.6284 15.4275 68.6267 15.475 68.6083 15.4643 68.6062 15.4546 68.609 15.4439 68.6072 15.442 68.6113 15.4446 68.6127 15.4302 68.6165 15.4138 68.6245 15.401 68.6192 15.389 68.6056 15.381 68.6029 15.355 68.6055 15.3519 68.6037 15.3434 68.5986 15.3202 68.5964 15.303 68.5913 15.3021 68.5883 15.3079 68.5858 15.3257 68.5833 15.3361 68.5745 15.3324 68.5723 15.2897 68.5799 15.2325 68.5816 15.2187 68.5778 15.2022 68.578 15.2009 68.5763 15.2083 68.569 15.2087 68.5621 15.193 68.5536 15.1911 68.5526 15.1883 68.544 15.1757 68.5402 15.1725 68.5366 15.1808 68.5326 15.2026 68.5313 15.2417 68.5344 15.2626 68.5318 15.2733 68.5281 15.2768 68.5212 15.2846 68.5164 15.2842 68.512 15.2913 68.5073 15.3078 68.505 15.34 68.508 15.3595 68.504 15.3512 68.4968 15.336 68.5012 15.3346 68.501 15.3191 68.4991 15.3026 68.5016 15.2882 68.5014 15.2799 68.504 15.2553 68.5237 15.2414 68.5219 15.2362 68.5187 15.2267 68.5169 15.2453 68.5081 15.2437 68.5052 15.2197 68.5079 15.2124 68.5034 15.2259 68.4966 15.2342 68.4961 15.2414 68.4932 15.2525 68.4842 15.2867 68.4753 15.2604 68.4675 15.2382 68.4723 15.2197 68.4715 15.2078 68.4678 15.1998 68.4614 15.2027 68.4489 15.1992 68.4462 15.1863 68.4415 15.1763 68.4418 15.1584 68.4315 15.1535 68.4256 15.1408 68.4261 15.1144 68.4059 15.1269 68.4018 15.1226 68.4005 15.1032 68.3943 15.089 68.3863 15.0735 68.373 15.0681 68.3573 15.0476 68.3516 15.0411 68.3448 15.0292 68.3413 15.0102 68.331 15 68.3284 14.9971 68.3276 14.9789 68.3169 14.9906 68.297 14.989 68.2945 14.9784 68.2775 14.9855 68.273 15 68.2688 15.0013 68.2684 15.0096 68.2697 15.0312 68.2795 15.0402 68.2803 15.0543 68.2867 15.0644 68.2881 15.0726 68.2915 15.0852 68.2927 15.0943 68.297 15.0823 68.2997 15.0592 68.2998 15.0507 68.3031 15.0523 68.3057 15.069 68.306 15.0793 68.3086 15.0995 68.304 15.1094 68.3079 15.1177 68.3089 15.1231 68.3096 15.1365 68.3183 15.1306 68.3268 15.1358 68.3277 15.1703 68.3288 15.1739 68.3275 15.1669 68.3222 15.1734 68.3213 15.1766 68.3173 15.1995 68.3349 15.213 68.3352 15.2248 68.341 15.2363 68.3422 15.2423 68.3524 15.2526 68.3591 15.2492 68.3637 15.2254 68.3701 15.2185 68.37 15.2122 68.3683 15.2094 68.3675 15.1966 68.3702 15.1871 68.367 15.1807 68.3713 15.1865 68.3746 15.2064 68.3747 15.2199 68.3733 15.2321 68.3743 15.2437 68.3711 15.2522 68.3719 15.2924 68.3903 15.3047 68.3926 15.3195 68.4009 15.3281 68.3994 15.3348 68.402 15.3467 68.4018 15.3577 68.4085 15.367 68.4105 15.3684 68.4283 15.3686 68.4308 15.3772 68.4314 15.3801 68.4262 15.3934 68.4197 15.404 68.4199 15.4258 68.4298 15.4391 68.4331 15.4774 68.4522 15.4961 68.4565 15.5051 68.4617 15.5037 68.4683 15.5085 68.4708 15.5212 68.4723 15.532 68.4757 15.5419 68.4839 15.5633 68.4936 15.5654 68.4981 15.5682 68.5041 15.5748 68.5069 15.5452 68.5153 15.5378 68.5192 15.5523 68.5188 15.5684 68.5154 15.5799 68.5108 15.5834 68.5057 15.58 68.4984 15.6055 68.4928 15.6124 68.4889 15.6036 68.487 15.58 68.4864 15.5684 68.4834 15.5145 68.4569 15.5088 68.454 15.4937 68.4403 15.4903 68.4314 15.4666 68.4194 15.4524 68.413 15.4346 68.4081 15.4099 68.4052 15.3815 68.3904 15.3717 68.3879 15.3664 68.3849 15.3648 68.3784 15.3559 68.373 15.3677 68.3712 15.3532 68.3621 15.3451 68.3633 15.3368 68.3646 15.3263 68.3643 15.32 68.3625 15.3192 68.3553 15.3249 68.3512 15.3441 68.3476 15.3591 68.3474 15.3753 68.3513 15.3845 68.3519 15.3896 68.3572 15.3965 68.3552 15.4061 68.3584 15.4132 68.3575 15.4174 68.3542 15.4244 68.3536 15.4344 68.3495 15.4394 68.3554 15.4441 68.3563 15.448 68.3539 15.4432 68.3452 15.4516 68.3463 15.4653 68.3425 15.4717 68.3437 15.4761 68.3517 15.4893 68.3573 15.4992 68.3573 15.5064 68.3541 15.4987 68.3471 15.5085 68.3436 15.5123 68.3374 15.5271 68.3359 15.5446 68.3394 15.5508 68.3358 15.5688 68.3358 15.5732 68.3337 15.5854 68.3342 15.59 68.3317 15.6002 68.3307 15.5991 68.3284 15.5741 68.3262 15.5724 68.3261 15.5713 68.3217 15.5596 68.3173 15.5668 68.3162 15.5807 68.3175 15.5796 68.3128 15.5841 68.3126 15.5976 68.315 15.6191 68.312 15.6581 68.3143 15.6538 68.3162 15.6571 68.3197 15.647 68.3221 15.6382 68.3265 15.6467 68.3313 15.642 68.3343 15.6532 68.3343 15.6633 68.3379 15.6711 68.3387 15.6824 68.3364 15.6901 68.3377 15.6894 68.342 15.6975 68.3442 15.699 68.3493 15.7151 68.3536 15.7141 68.3588 15.713 68.3648 15.7319 68.3722 15.7268 68.3748 15.7134 68.3738 15.7028 68.3694 15.699 68.3697 15.6943 68.3751 15.6806 68.3791 15.683 68.3813 15.7081 68.3809 15.717 68.3843 15.7355 68.385 15.7539 68.392 15.7546 68.3959 15.7385 68.4017 15.7401 68.4149 15.7566 68.4224 15.7688 68.4355 15.7693 68.436 15.7747 68.4367 15.7787 68.4339 15.7765 68.4164 15.7819 68.4108 15.789 68.41 15.7922 68.4057 15.7985 68.4035 15.8062 68.409 15.8224 68.4069 15.8323 68.4073 15.8385 68.4115 15.8349 68.4153 15.8344 68.4293 15.8245 68.4312 15.8204 68.4344 15.8087 68.4358 15.788 68.4446 15.7836 68.4488 15.7897 68.4532 15.772 68.4603 15.7769 68.4626 15.7797 68.4623 15.784 68.4619 15.7938 68.4584 15.8082 68.4418 15.8161 68.4384 15.8261 68.4381 15.8333 68.4352 15.846 68.4364 15.8523 68.4385 15.8732 68.454 15.8707 68.4604 15.8784 68.466 15.8693 68.4778 15.8728 68.4889 15.8677 68.4977 15.8696 68.5166 15.8805 68.5113 15.878 68.5032 15.8809 68.4932 15.8803 68.4911 15.8759 68.4764 15.8861 68.4674 15.8929 68.4677 15.8952 68.4664 15.8887 68.4567 15.8912 68.4524 15.8999 68.4484 15.8803 68.4449 15.8778 68.4429 15.8756 68.4376 15.8816 68.4282 15.8711 68.413 15.877 68.4098 15.8601 68.3956 15.8585 68.3861 15.8622 68.3842 15.8748 68.3858 15.876 68.3855 15.8836 68.3834 15.8955 68.3853 15.9094 68.3847 15.914 68.386 15.9168 68.3914 15.9254 68.3941 15.9224 68.3958 15.9256 68.3975 15.9343 68.3953 15.9477 68.3986 15.9586 68.3956 15.999 68.4107 15.9997 68.4232 16.0089 68.4366 16.0121 68.4492 16.0392 68.4633 16.0484 68.4655 16.0726 68.4713 16.0833 68.4754 16.0852 68.4837 16.0915 68.4879 16.0809 68.4943 16.0964 68.4993 16.1053 68.5162 16.1108 68.5166 16.1232 68.5127 16.1301 68.5146 16.1224 68.5198 16.1117 68.5219 16.1083 68.525 16.1175 68.5389 16.1173 68.544 16.1094 68.5494 16.0884 68.5548 16.0925 68.5582 16.0936 68.5581 16.1047 68.5573 16.1212 68.5522 16.127 68.5473 16.1252 68.536 16.1306 68.5325 16.1493 68.531 16.1628 68.5317 16.1944 68.5483 16.2247 68.5609 16.2359 68.5636 16.2588 68.5626 16.2778 68.5574 16.2913 68.5563 16.308 68.5592 16.3175 68.5657 16.3242 68.5666 16.3394 68.5684 16.4004 68.5699 16.4246 68.5665 16.451 68.5596 16.4618 68.5591 16.5162 68.5689 16.5171 68.5746 16.5266 68.5791 16.5122 68.5813 16.5088 68.5847 16.5104 68.5971 16.5002 68.6094 16.5004 68.6133 16.5302 68.6143 16.5431 68.6178 16.5686 68.6329 16.5756 68.6442 16.5955 68.6499 16.5935 68.6549 16.5964 68.6582 16.587 68.6607 16.5865 68.6648 16.6004 68.6669 16.6079 68.6742 16.5926 68.6772 16.5916 68.6833 16.5469 68.6877 16.5526 68.6923 16.5637 68.6931 16.5642 68.6947 16.5651 68.6973 16.5783 68.6973 16.5872 68.6995 16.5844 68.7051 16.592 68.7145 16.6003 68.7187 16.5937 68.7247 16.5957 68.7337 16.5919 68.7361 16.5793 68.7313 16.5715 68.7225 16.5502 68.722 16.5453 68.7237 16.5602 68.7338 16.5785 68.7386 16.5715 68.7485 16.5651 68.7508 16.573 68.7591 16.568 68.7662 16.5637 68.7723 16.566 68.7781 16.5799 68.7758 16.5916 68.7864 16.591 68.7907 16.5998 68.8004 16.5851 68.801 16.5742 68.8039 16.5621 68.8039 16.5527 68.8013 16.5494 68.7902 16.5422 68.7887 16.5376 68.7916 16.5403 68.8002 16.5554 68.8193 16.5602 68.8227 16.5769 68.8267 16.5925 68.8277 16.5928 68.8281 16.5988 68.8346 16.5968 68.8375 16.5602 68.8413 16.5495 68.8363 16.5418 68.8248 16.5214 68.8183 16.516 68.8218 16.4926 68.8239 16.4863 68.8283 16.4945 68.8467 16.4841 68.8572 16.4745 68.8616 16.4576 68.861 16.4363 68.855 16.4233 68.8569 16.4039 68.8598 16.3595 68.8749 16.3417 68.8842 16.3045 68.8961 16.2895 68.9041 16.2834 68.9165 16.2754 68.9224 16.27 68.9231 16.2623 68.9212 16.2558 68.9237 \ No newline at end of file diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/data/split_at_zero_0.poly b/Straight_skeleton_2/test/Straight_skeleton_2/data/split_at_zero_0.poly new file mode 100644 index 00000000000..e555f3e54d6 --- /dev/null +++ b/Straight_skeleton_2/test/Straight_skeleton_2/data/split_at_zero_0.poly @@ -0,0 +1,14 @@ +1 +11 +0 0 +3 0 +4 1 +5 0 +9 0 +9 1 +5 1 +5 2 +3 2 +3 1 +0 1 + diff --git a/Straight_skeleton_2/test/Straight_skeleton_2/test_sls_builder.cmd b/Straight_skeleton_2/test/Straight_skeleton_2/test_sls_builder.cmd index 30107230992..0fab436d15f 100644 --- a/Straight_skeleton_2/test/Straight_skeleton_2/test_sls_builder.cmd +++ b/Straight_skeleton_2/test/Straight_skeleton_2/test_sls_builder.cmd @@ -1,36 +1,55 @@ ./data -sample_85.poly -sample_298.poly -sample_147.poly -sample_698.poly -sample_235.poly -sample_73.poly -sample_101.poly -sample_638.poly -sample_333.poly -sample_319.poly -sample_325.poly -sample_46.poly -sample_4.poly -sample_2.poly -sample_0.poly -vertex_event_9.poly -sample_5.poly -alley_3.poly -sample_1.poly -alley_2.poly -sample_6.poly -sample_3.poly -hole.poly -closer_edge_event_0.poly -closer_edge_event_1.poly -double_split.poly -masked_double_split.poly -alley_0.poly -alley_1.poly -region_4.poly -single_split.poly -vertex_event_0.poly -rectangle.poly -square.poly +degenerate2.poly +degenerate0.poly +double_edge.poly +degenerate6.poly +degenerate5.poly +degenerate1.poly triangle.poly +degenerate7.poly +degenerate3.poly +degenerate4.poly +square.poly +rectangle.poly +degenerate9.poly +degenerate12.poly +vertex_event_0.poly +split_at_zero_0.poly +single_split.poly +degenerate8.poly +region_4.poly +degenerate10.poly +alley_1.poly +alley_0.poly +masked_double_split.poly +double_split.poly +closer_edge_event_1.poly +closer_edge_event_0.poly +hole.poly +multinode1.poly +degenerate_multinode0.poly +parallels0_b.poly +parallels0.poly +sample_3.poly +sample_6.poly +alley_2.poly +sample_1.poly +alley_3.poly +sample_5.poly +vertex_event_9.poly +sample_0.poly +sample_2.poly +sample_4.poly +sample_46.poly +sample_325.poly +sample_319.poly +sample_333.poly +sample_638.poly +sample_101.poly +sample_73.poly +sample_235.poly +sample_698.poly +sample_147.poly +sample_298.poly +sample_85.poly +sample_102.poly