89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira/* This file is part of the libdepixelize project
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Copyright (C) 2013 Vinícius dos Santos Oliveira <vini.ipsmaker@gmail.com>
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira GNU Lesser General Public License Usage
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira This library is free software; you can redistribute it and/or modify it
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira under the terms of the GNU Lesser General Public License as published by the
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Free Software Foundation; either version 2.1 of the License, or (at your
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira option) any later version.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira You should have received a copy of the GNU Lesser General Public License
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira along with this library. If not, see <http://www.gnu.org/licenses/>.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira GNU General Public License Usage
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Alternatively, this library may be used under the terms of the GNU General
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Public License as published by the Free Software Foundation, either version
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira 2 of the License, or (at your option) any later version.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira You should have received a copy of the GNU General Public License along with
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira this library. If not, see <http://www.gnu.org/licenses/>.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira This library is distributed in the hope that it will be useful,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira but WITHOUT ANY WARRANTY; without even the implied warranty of
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Lesser General Public License for more details.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira*/
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira#ifndef LIBDEPIXELIZE_TRACER_HOMOGENEOUSSPLINES_H
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira#define LIBDEPIXELIZE_TRACER_HOMOGENEOUSSPLINES_H
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira#include "simplifiedvoronoi.h"
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira#include "point.h"
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira#include <algorithm>
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira#include <utility>
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveiranamespace Tracer {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveiratemplate<typename T>
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveiraclass HomogeneousSplines
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveirapublic:
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira struct Polygon
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira typedef std::vector< Point<T> > Points;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira typedef typename Points::iterator points_iter;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira typedef typename Points::const_iterator const_points_iter;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira typedef typename std::vector<Points>::iterator holes_iter;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira typedef typename std::vector<Points>::const_iterator const_holes_iter;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Polygon() {}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Polygon(const guint8 (&rgba)[4])
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( int i = 0 ; i != 4 ; ++i )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira this->rgba[i] = rgba[i];
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira std::vector< Point<T> > vertices;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira /**
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * It may be benefited from C++11 move references.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira */
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira std::vector< std::vector< Point<T> > > holes;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira guint8 rgba[4];
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira };
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira typedef typename std::vector<Polygon>::iterator iterator;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira typedef typename std::vector<Polygon>::const_iterator const_iterator;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira typedef typename std::vector<Polygon>::size_type size_type;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira template<bool adjust_splines>
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira HomogeneousSplines(const SimplifiedVoronoi<T, adjust_splines> &voronoi);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Iterators
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira iterator begin()
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return _polygons.begin();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira const_iterator begin() const
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return _polygons.begin();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira iterator end()
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return _polygons.end();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira const_iterator end() const
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return _polygons.end();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira size_type size() const
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return _polygons.size();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira int width() const
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return _width;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira int height() const
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return _height;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveiraprivate:
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira typedef std::vector< Point<T> > Points;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira typedef typename Points::iterator points_iter;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira typedef typename Points::const_iterator points_citer;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira typedef typename Points::reverse_iterator points_riter;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira typedef typename Points::const_reverse_iterator points_criter;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira typedef std::pair<points_iter, points_iter> points_range;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira typedef std::pair<points_citer, points_citer> points_crange;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira struct CommonEdge
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira bool ok; //< share an edge
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Points *dst;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira const Points *src;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // the interval is closed on both ends
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // different from [begin, end) STL style
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira points_iter dst_begin, dst_end;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira points_citer src_begin, src_end;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira };
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira struct SelfCommonEdge
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira bool ok; //< share an edge
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Greater range. The one that should be erased from the vector.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira points_riter grt_begin, grt_end;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Smaller range. The one that should be used to create a new vector.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira points_riter sml_begin, sml_end;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira };
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira /**
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * Return ok == true if they share an edge (more than one point).
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira */
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira CommonEdge _common_edge(Points &dst, const Points &src);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira /**
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * Return ok == true if they share an edge (more than one point).
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira *
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * - [dst_begin, dst_end) will contain the hole polygon
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * - [src_begin, src_end) will contain the range to be erased
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira *
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * It's required to do the search in backward order.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira */
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira SelfCommonEdge _common_edge(Points &points, points_riter it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira /*!
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * Add polygon represented by \p common_edge.src to \p common_edge.dst.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira */
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira void _polygon_union(CommonEdge common_edge);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira /**
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * Weird recursive function created to solve the complex problem to fill
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * polygons holes without the need to store temporaries on the heap nor
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * changing requirements to some data type that don't invalidate iterators
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * that point before the current element (maybe I'll write some poetry about
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * the problem someday).
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira */
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira void _fill_holes(std::vector<Points> &holes, points_iter region_begin,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira points_iter region_end);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira std::vector<Polygon> _polygons;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira int _width;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira int _height;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira};
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveiratemplate<class T>
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveiratemplate<bool adjust_splines>
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos OliveiraHomogeneousSplines<T>::HomogeneousSplines(const SimplifiedVoronoi<T,
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira adjust_splines> &voronoi) :
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _width(voronoi.width()),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _height(voronoi.height())
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira //if (!voronoi.size())
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // return;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira using colorspace::same_color;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira typedef typename SimplifiedVoronoi<T, adjust_splines>::const_iterator
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira voronoi_citer;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Identify visible edges (group polygons with the same color)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( voronoi_citer cell_it = voronoi.begin(), cell_end = voronoi.end()
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ; cell_it != cell_end ; ++cell_it ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira bool found = false;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( iterator polygon_it = _polygons.begin(),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira polygon_end = _polygons.end()
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ; polygon_it != polygon_end ; ++polygon_it ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( same_color(polygon_it->rgba, cell_it->rgba) ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira CommonEdge common_edge = _common_edge(polygon_it->vertices,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cell_it->vertices);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( common_edge.ok ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _polygon_union(common_edge);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira found = true;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( iterator polygon2_it = polygon_it + 1
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ; polygon2_it != polygon_end ; ++polygon2_it ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( same_color(polygon_it->rgba, polygon2_it->rgba) ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira CommonEdge common_edge2
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira = _common_edge(polygon_it->vertices,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira polygon2_it->vertices);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( common_edge2.ok ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _polygon_union(common_edge2);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _polygons.erase(polygon2_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira break;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira break;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( !found ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Polygon polygon(cell_it->rgba);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira polygon.vertices = cell_it->vertices;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _polygons.insert(_polygons.end(), polygon);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Find polygons with holes and fix them
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // This iteration runs such complex time-consuming algorithm, but each
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // polygon has an independent result. They wouldn't even need to share/sync
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // results and the only waste would be a join at the end of the for.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( typename std::vector<Polygon>::iterator it = _polygons.begin(),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira end = _polygons.end() ; it != end ; ++it ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira SelfCommonEdge ce = _common_edge(it->vertices, it->vertices.rbegin());
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira while ( ce.ok ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _fill_holes(it->holes, ce.sml_end.base(), ce.sml_begin.base());
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira it->vertices.erase(ce.grt_end.base() + 1, ce.grt_begin.base());
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ce = _common_edge(it->vertices, ce.grt_end);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira// it can infinite loop if points of both entities are equal,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira// but this shouldn't happen if user has only access to Kopf2011 interface
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveiratemplate<class T>
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveiratypename HomogeneousSplines<T>::CommonEdge
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos OliveiraHomogeneousSplines<T>::_common_edge(Points &dst, const Points &src)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // It's an edge, then the points are closer together. After we find the
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // first point, there is no need for check against all points of the src
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // a second time
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira const points_iter dst_begin = dst.begin();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira const points_iter dst_end = dst.end();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira const points_citer src_begin = src.begin();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira const points_citer src_end = src.end();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( points_iter it = dst_begin ; it != dst_end ; ++it ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira points_citer src_it = std::find(src_begin, src_end, *it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( src_it == src_end )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira continue;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira points_iter dst_common_edge_begin = it;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira points_citer src_common_edge_end = src_it;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // iterate until find the beginning of the common edge range
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira while ( *dst_common_edge_begin == *src_common_edge_end ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( dst_common_edge_begin == dst_begin )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira dst_common_edge_begin = dst_end - 1;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira else
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira --dst_common_edge_begin;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ++src_common_edge_end;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( src_common_edge_end == src_end )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira src_common_edge_end = src_begin;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // fix {dst_begin, src_end} range
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ++dst_common_edge_begin;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( dst_common_edge_begin == dst_end )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira dst_common_edge_begin = dst_begin;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( src_common_edge_end == src_begin )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira src_common_edge_end = src_end - 1;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira else
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira --src_common_edge_end;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira points_iter dst_common_edge_end = it;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira points_citer src_common_edge_begin = src_it;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // find the end of the common edge range
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira while ( *dst_common_edge_end == *src_common_edge_begin ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ++dst_common_edge_end;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( dst_common_edge_end == dst_end )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira dst_common_edge_end = dst_begin;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( src_common_edge_begin == src_begin )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira src_common_edge_begin = src_end - 1;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira else
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira --src_common_edge_begin;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // fix {dst_end, src_begin} range
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( dst_common_edge_end == dst_begin )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira dst_common_edge_end = dst_end - 1;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira else
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira --dst_common_edge_end;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ++src_common_edge_begin;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( src_common_edge_begin == src_end )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira src_common_edge_begin = src_begin;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira CommonEdge ret;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // if only one point in common
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( dst_common_edge_begin == dst_common_edge_end )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira continue;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ret.ok = true;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ret.dst = &dst;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ret.dst_begin = dst_common_edge_begin;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ret.dst_end = dst_common_edge_end;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ret.src = &src;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ret.src_begin = src_common_edge_begin;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ret.src_end = src_common_edge_end;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return ret;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira CommonEdge ret;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ret.ok = false;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return ret;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveiratemplate<class T>
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveiratypename HomogeneousSplines<T>::SelfCommonEdge
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos OliveiraHomogeneousSplines<T>::_common_edge(Points &points, points_riter it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira SelfCommonEdge ret;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ret.grt_end = points.rend();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( ; it != ret.grt_end ; ++it ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ret.sml_end = std::find(it + 1, ret.grt_end, *it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( ret.sml_end == ret.grt_end )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira continue;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ret.grt_begin = it;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ret.grt_end = ret.sml_end + 1;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ret.sml_begin = it;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira while ( *ret.sml_begin == *ret.sml_end ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ++ret.sml_begin;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira --ret.sml_end;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira --ret.sml_begin;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ++ret.sml_end;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ++ret.sml_end;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ret.ok = true;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return ret;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ret.ok = false;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return ret;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveiratemplate<class T>
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveiravoid HomogeneousSplines<T>::_polygon_union(CommonEdge common_edge)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Points &dst = *common_edge.dst;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira const Points &src = *common_edge.src;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // the rotated cell must be inserted before (dst.begin() + index)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira typename Points::difference_type index;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // first, we remove the common edge in dst
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( common_edge.dst_begin < common_edge.dst_end ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // common edge is in the middle of dst
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira index = dst.erase(common_edge.dst_begin,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira common_edge.dst_end + 1) - dst.begin();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira } else {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // common edge cross the end of dst
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira dst.erase(common_edge.dst_begin, dst.end());
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira dst.erase(dst.begin(), common_edge.dst_end);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira index = dst.end() - dst.begin();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // second, we copy src points to polygon
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( common_edge.src_begin < common_edge.src_end ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // common edge is in the middle of src
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira const typename Points::difference_type nfirstinserted
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira = src.end() - common_edge.src_end;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira const typename Points::difference_type nsecondinserted
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira = 1 + (common_edge.src_begin - src.begin());
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira dst.reserve(dst.size() + nfirstinserted + nsecondinserted);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira dst.insert(dst.begin() + index, common_edge.src_end, src.end());
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira dst.insert(dst.begin() + index + nfirstinserted,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira src.begin(), common_edge.src_begin + 1);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira } else {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // common edge cross the end of src
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira dst.reserve(dst.size() + 1
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira + (common_edge.src_begin - common_edge.src_end));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira dst.insert(dst.begin() + index,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira common_edge.src_end, common_edge.src_begin + 1);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira// The following piece of code is so evil that you could end up invoking an
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira// ancient beast if you proceed to read it, but I'll be able to explain it in
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira// the form of some video (text is not so representative as an image).
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveiratemplate<class T>
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveiravoid HomogeneousSplines<T>::_fill_holes(std::vector<Points> &holes,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira points_iter region_begin,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira points_iter region_end)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // the exact location might not always be back and iterators will be
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // invalidated after some insertions, then the index is required
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira const typename std::vector<Points>::size_type hole_index = holes.size();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira holes.resize(hole_index + 1);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( points_iter it = region_begin + 1 ; it != region_end ; ++it ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira points_iter res = std::find(it + 1, region_end, *it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( res == region_end )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira continue;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira holes[hole_index].insert(holes[hole_index].end(), region_begin,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira region_begin = res;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira do {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ++it;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira --res;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira } while ( *it == *res );
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _fill_holes(holes, it - 1, res + 2);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira it = region_begin;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira holes[hole_index].insert(holes[hole_index].end(), region_begin,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira region_end - 1);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira} // namespace Tracer
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira#endif // LIBDEPIXELIZE_TRACER_HOMOGENEOUSSPLINES_H
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira/*
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Local Variables:
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira mode:c++
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira c-file-style:"stroustrup"
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira indent-tabs-mode:nil
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira fill-column:99
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira End:
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira*/
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :