mirror of https://github.com/CGAL/cgal
123 lines
3.5 KiB
C++
123 lines
3.5 KiB
C++
// Copyright (c) 2005-2009 INRIA Sophia-Antipolis (France).
|
|
// All rights reserved.
|
|
//
|
|
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
|
|
// modify it under the terms of the GNU Lesser General Public License as
|
|
// published by the Free Software Foundation; version 2.1 of the License.
|
|
// See the file LICENSE.LGPL distributed with CGAL.
|
|
//
|
|
// Licensees holding a valid commercial license may use this file in
|
|
// accordance with the commercial license agreement provided with the software.
|
|
//
|
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
//
|
|
// $URL$
|
|
// $Id$
|
|
//
|
|
//
|
|
// Author(s) : Sebastien Loriot, Sylvain Pion
|
|
|
|
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
|
#include <CGAL/partition_2.h>
|
|
#include <CGAL/CGAL_Ipelet_base.h>
|
|
|
|
|
|
namespace CGAL_convex_part{
|
|
|
|
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
|
|
|
|
const std::string Slab[] = {
|
|
"Y monotone partition", "Greene's approx Convex Partition","Approx Convex Partition","Optimal Convex Partition", "Help"
|
|
};
|
|
|
|
const std::string Hmsg[] = {
|
|
"Y monotonic decomposition of a polygon",
|
|
"Approximation of convex decomposition of a polygon using Greene's algorithm",
|
|
"Approximation of convex decomposition of a polygon using Hertel and Mehlhorn's algorithm",
|
|
"Optimal convex decomposition of a polygon"
|
|
};
|
|
|
|
class ConvexpartitionIpelet
|
|
: public CGAL::Ipelet_base<Kernel,5>{
|
|
public:
|
|
ConvexpartitionIpelet()
|
|
:CGAL::Ipelet_base<Kernel,5>("Polygon Partition",Slab,Hmsg){}
|
|
void protected_run(int);
|
|
};
|
|
|
|
|
|
void ConvexpartitionIpelet::protected_run(int fn)
|
|
{
|
|
|
|
if (fn==4) {
|
|
show_help();
|
|
return;
|
|
}
|
|
|
|
std::list<Polygon_2> pol_list;
|
|
Iso_rectangle_2 bbox=
|
|
read_active_objects( CGAL::dispatch_or_drop_output<Polygon_2>( std::back_inserter(pol_list) ) );
|
|
|
|
|
|
|
|
if (pol_list.size ()==0){
|
|
print_error_message("No polygon selected");
|
|
return;
|
|
}
|
|
|
|
for (std::list<Polygon_2>::iterator itp=pol_list.begin();itp!=pol_list.end();++itp){
|
|
//~ Polygon_2 polygon=*itp;
|
|
//~ std::list<Polygon_2> partition_polys;
|
|
CGAL::Polygon_2<Kernel,std::list<Kernel::Point_2> > polygon(itp->vertices_begin(),itp->vertices_end());
|
|
std::list<CGAL::Polygon_2<Kernel,std::list<Kernel::Point_2> > > partition_polys;
|
|
|
|
if (!polygon.is_simple()){
|
|
print_error_message("Polygon must be simple");
|
|
continue;
|
|
}
|
|
|
|
if (polygon.orientation()!=CGAL::COUNTERCLOCKWISE)
|
|
polygon.reverse_orientation();
|
|
|
|
switch(fn){
|
|
case 0:
|
|
CGAL::y_monotone_partition_2(polygon.vertices_begin(),
|
|
polygon.vertices_end(),
|
|
std::back_inserter(partition_polys));
|
|
break;
|
|
|
|
case 1:
|
|
CGAL::greene_approx_convex_partition_2(polygon.vertices_begin(),
|
|
polygon.vertices_end(),
|
|
std::back_inserter(partition_polys));
|
|
break;
|
|
|
|
case 2:
|
|
CGAL::approx_convex_partition_2(polygon.vertices_begin(),
|
|
polygon.vertices_end(),
|
|
std::back_inserter(partition_polys));
|
|
break;
|
|
|
|
case 3:
|
|
CGAL::optimal_convex_partition_2(polygon.vertices_begin(),
|
|
polygon.vertices_end(),
|
|
std::back_inserter(partition_polys));
|
|
break;
|
|
}
|
|
|
|
draw_in_ipe(partition_polys.begin(),partition_polys.end());
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CGAL_IPELET(CGAL_convex_part::ConvexpartitionIpelet)
|
|
|