Implement polygon conversion in output iterator

This commit is contained in:
Simon Giraudot 2020-08-26 15:48:41 +02:00
parent a85549da02
commit 7a6beefdf7
1 changed files with 37 additions and 6 deletions

View File

@ -81,7 +81,7 @@ convert_polygon (const Polygon_with_holes_2<Kernel>& pwh,
template <typename OutputIterator, typename Traits> template <typename OutputIterator, typename Traits>
OutputIterator convert_polygon_back (OutputIterator output, OutputIterator convert_polygon_back (OutputIterator output,
const typename Traits::Polygon_2&, const typename Traits::Polygon_2&,
const Traits&) Traits&)
{ {
return output; return output;
} }
@ -89,7 +89,7 @@ OutputIterator convert_polygon_back (OutputIterator output,
template <typename OutputIterator, typename Traits> template <typename OutputIterator, typename Traits>
OutputIterator convert_polygon_back (OutputIterator output, OutputIterator convert_polygon_back (OutputIterator output,
const typename Traits::Polygon_with_holes_2&, const typename Traits::Polygon_with_holes_2&,
const Traits&) Traits&)
{ {
return output; return output;
} }
@ -98,11 +98,42 @@ template <typename OutputIterator, typename Kernel>
struct Polygon_converter struct Polygon_converter
{ {
using Polyline_traits = typename Gps_polyline_traits<Kernel>::Traits; using Polyline_traits = typename Gps_polyline_traits<Kernel>::Traits;
using Input_type = typename Polyline_traits::Polygon_with_holes_2;
using Input_polygon = typename Input_type::General_polygon_2;
using Output_type = Polygon_with_holes_2<Kernel>;
using Output_polygon = typename Output_type::Polygon_2;
OutputIterator& output; OutputIterator& output;
Polygon_converter (OutputIterator& output) : output (output) { } Polygon_converter (OutputIterator& output) : output (output) { }
void operator() (const typename Polyline_traits::Polygon_with_holes_2& pwh) const
{
void operator() (const Input_type& pwh) const
{
Output_polygon outer_boundary;
convert_polygon (pwh.outer_boundary(), outer_boundary);
std::vector<Output_polygon> holes;
for (const Input_polygon& h : pwh.holes())
{
holes.emplace_back ();
convert_polygon (h, holes.back());
}
*(output ++) = Output_type (outer_boundary, holes.begin(), holes.end());
}
private:
void convert_polygon (const Input_polygon& input,
Output_polygon& out) const
{
for (typename Input_polygon::Curve_const_iterator
it = input.curves_begin(); it != input.curves_end(); ++ it)
for (typename Input_polygon::X_monotone_curve_2::Point_const_iterator
it2 = it->points_begin(); it2 != it->points_end(); ++ it2)
out.push_back (*it2);
} }
}; };
@ -127,7 +158,7 @@ template <typename OutputIterator, typename Kernel>
Polygon_converter_output_iterator<OutputIterator, Kernel> Polygon_converter_output_iterator<OutputIterator, Kernel>
convert_polygon_back (OutputIterator output, convert_polygon_back (OutputIterator output,
const Polygon_2<Kernel>&, const Polygon_2<Kernel>&,
const typename Gps_polyline_traits<Kernel>::Traits&) typename Gps_polyline_traits<Kernel>::Traits&)
{ {
return Polygon_converter_output_iterator<OutputIterator, Kernel>(output); return Polygon_converter_output_iterator<OutputIterator, Kernel>(output);
} }
@ -136,7 +167,7 @@ template <typename OutputIterator, typename Kernel>
Polygon_converter_output_iterator<OutputIterator, Kernel> Polygon_converter_output_iterator<OutputIterator, Kernel>
convert_polygon_back (OutputIterator output, convert_polygon_back (OutputIterator output,
const Polygon_with_holes_2<Kernel>&, const Polygon_with_holes_2<Kernel>&,
const typename Gps_polyline_traits<Kernel>::Traits&) typename Gps_polyline_traits<Kernel>::Traits&)
{ {
return Polygon_converter_output_iterator<OutputIterator, Kernel>(output); return Polygon_converter_output_iterator<OutputIterator, Kernel>(output);
} }