void ArrPolyIpelet::protected_run(int fn){ if (fn==1) { show_help(); return; } X_monotone_list output_curves; Curve_list input_curves; //Argt std::list<Segment_2> sg_list; std::list<Circle_2> cir_list; std::list<Polygon_2> pol_list; std::list<Circular_arc_2> arc_list; read_active_objects( CGAL::dispatch_or_drop_output<Polygon_2,Circle_2,Segment_2,Circular_arc_2>( std::back_inserter(pol_list), std::back_inserter(cir_list), std::back_inserter(sg_list), std::back_inserter(arc_list) ), true,true ); for (std::list<Polygon_2>::iterator it=pol_list.begin();it!=pol_list.end();++it) for(Polygon_2::Edge_const_iterator edge_it=it->edges_begin();edge_it!=it->edges_end();++edge_it) input_curves.push_back(Curve_2(edge_it->point(0),edge_it->point(1))); for (std::list<Segment_2>::iterator it=sg_list.begin();it!=sg_list.end();++it) input_curves.push_back(Curve_2(it->point(0),it->point(1))); for (std::list<Circle_2>::iterator it=cir_list.begin();it!=cir_list.end();++it) input_curves.push_back(Curve_2(it->center(),sqrt(CGAL::to_double(it->squared_radius())))); for (std::list<Circular_arc_2>::iterator it=arc_list.begin();it!=arc_list.end();++it) input_curves.push_back( Curve_2( std::get<0>(*it).center(), sqrt(CGAL::to_double(std::get<0>(*it).squared_radius())), std::get<3>(*it), Traits::Point_2(std::get<1>(*it).x(),std::get<1>(*it).y()), Traits::Point_2(std::get<2>(*it).x(),std::get<2>(*it).y()) ) ); Traits T; CGAL::compute_subcurves(input_curves.begin(),input_curves.end(),std::back_inserter(output_curves),false,T); for (X_monotone_list::iterator it=output_curves.begin();it!=output_curves.end();++it){ Point_2 S(CGAL::to_double(it->source().x()),CGAL::to_double(it->source().y())); Point_2 T(CGAL::to_double(it->target().x()),CGAL::to_double(it->target().y())); if (it->is_linear ()) draw_in_ipe(Segment_2(S,T)); if (it->is_circular()) draw_in_ipe(Circular_arc_2(it->supporting_circle(),S,T,it->supporting_circle().orientation())); } return; }
void SubSelectIpelet::protected_run(int fn) { if (fn==2) { show_help(); return; } std::list<Circle_2> cir_list; std::list<Polygon_2> pol_list; Iso_rectangle_2 bbox= read_active_objects( CGAL::dispatch_or_drop_output<Polygon_2,Circle_2>( std::back_inserter(pol_list), std::back_inserter(cir_list) ) ); if (fn==0 && pol_list.size()!=2){ print_error_message("You must select exactly two polygons"); return; } std::list<double> r_offsets; for (std::list<Circle_2>::iterator it=cir_list.begin();it!=cir_list.end();++it) r_offsets.push_back(sqrt(CGAL::to_double(it->squared_radius()))); IpeMatrix tfm (1,0,0,1,-CGAL::to_double(bbox.min().x()),-CGAL::to_double(bbox.min().y())); for (std::list<Polygon_2>::iterator it=pol_list.begin();it!=pol_list.end();++it) if(!it->is_simple()){ print_error_message("Polygon(s) must be simple"); } if (fn==0){ Polygon_2 polygon1=*pol_list.begin(); Polygon_2 polygon2=*++pol_list.begin(); Polygon_with_holes_2 sum = minkowski_sum_2 (polygon1, polygon2); std::list<Point_2> LP; for (Polygon_2::iterator it=sum.outer_boundary().vertices_begin();it!= sum.outer_boundary().vertices_end();++it) LP.push_back(*it); draw_polyline_in_ipe(LP.begin(),LP.end(),true,false,false); for (Polygon_with_holes_2::Hole_const_iterator poly_it = sum.holes_begin(); poly_it != sum.holes_end(); ++poly_it){ LP.clear(); for (Polygon_2::iterator it=poly_it->vertices_begin();it!= poly_it->vertices_end();++it) LP.push_back(*it); draw_polyline_in_ipe(LP.begin(),LP.end(),true,false,false); } create_polygon_with_holes(true); transform_selected_objects_(tfm); } else{ if (r_offsets.size()==0) r_offsets.push_back(10); for (std::list<Polygon_2>::iterator it_pol=pol_list.begin();it_pol!=pol_list.end();++it_pol){ for(std::list<double>::iterator it=r_offsets.begin();it!=r_offsets.end();++it){ Offset_polygon_with_holes_2 offset=approximated_offset_2 (*it_pol, *it, 0.0001); std::list<Segment_2> LS; for( Offset_polygon_2::Curve_iterator itt=offset.outer_boundary().curves_begin(); itt!=offset.outer_boundary().curves_end();++itt){ Point_2 S=Point_2(CGAL::to_double(itt->source().x()),CGAL::to_double(itt->source().y())); Point_2 T=Point_2(CGAL::to_double(itt->target().x()),CGAL::to_double(itt->target().y())); if (itt->is_linear ()) LS.push_back(Segment_2(S,T)); if (itt->is_circular()) draw_in_ipe(Circular_arc_2(itt->supporting_circle(),S,T,itt->supporting_circle().orientation())); } draw_in_ipe(LS.begin(),LS.end()); } } } }