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_SIMPLIFIEDVORONOI_H
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira#define LIBDEPIXELIZE_TRACER_SIMPLIFIEDVORONOI_H
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira#include "pixelgraph.h"
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira#include "colorspace.h"
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira#include "point.h"
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira#include "branchless.h"
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveiranamespace Tracer {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<typename T, bool adjust_splines>
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveiraclass SimplifiedVoronoi
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveirapublic:
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira /**
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * The "smooth" attribute of each vertex is only accurate if edge is
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * visible. This decision was made because invisible edges will disappear
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * during polygon-union, the next phase of Kopf-Lischinski.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira */
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira struct Cell
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // There may not exist more than 8 vertices per cell and a
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // "small vector optimization" could improve the performance
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // by avoiding memory fragmentation. Serious testing is needed.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // The vertices are filled in clockwise order
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira std::vector< Point<T> > vertices;
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<Cell>::iterator iterator;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira typedef typename std::vector<Cell>::const_iterator const_iterator;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira typedef typename std::vector<Cell>::reverse_iterator reverse_iterator;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira typedef typename std::vector<Cell>::const_reverse_iterator
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira const_reverse_iterator;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira /*
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira It will work correctly if no crossing-edges are present.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira */
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira SimplifiedVoronoi(const PixelGraph &graph);
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 _cells.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 _cells.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 _cells.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 _cells.end();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira reverse_iterator rbegin()
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return _cells.rbegin();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira const_reverse_iterator rbegin() const
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return _cells.rbegin();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira reverse_iterator rend()
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return _cells.rend();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira const_reverse_iterator rend() const
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return _cells.rend();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira size_t size() const
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return _cells.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:
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_VERY_TYPE_SAFE
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira typedef void (*PointTransform)(Point<T> &p, T dx, T dy);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira typedef bool (*NodeTransform)(PixelGraph::const_iterator);
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira#endif // LIBDEPIXELIZE_VERY_TYPE_SAFE
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira /**
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * Output is translated by -.5 in each axis. This function fixes this error.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira */
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static Point<T> _adjust(Point<T> p)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return Point<T>(p.x + .5, p.y + .5);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira /**
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * Output is translated by -.5 in each axis. This function fixes this error.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira */
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static Point<T> _adjust(Point<T> p, bool smooth)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return Point<T>(p.x + .5, p.y + .5, smooth);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira void _complexTopLeft(const PixelGraph &graph,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator graph_it,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Cell *const cells_it, int x, int y);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira void _complexTopRight(const PixelGraph &graph,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator graph_it,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Cell *const cells_it, int x, int y);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira void _complexBottomRight(const PixelGraph &graph,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator graph_it,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Cell *const cells_it, int x, int y);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira void _complexBottomLeft(const PixelGraph &graph,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator graph_it,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Cell *const cells_it, int x, int y);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static void _complexTopLeftTransform(Point<T> &p, T dx, T dy);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static void _complexTopRightTransform(Point<T> &p, T dx, T dy);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static void _complexBottomRightTransform(Point<T> &p, T dx, T dy);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static void _complexBottomLeftTransform(Point<T> &p, T dx, T dy);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexTopLeftTransformTop(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexTopLeftTransformTopRight(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexTopLeftTransformRight(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexTopLeftTransformBottomRight(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexTopLeftTransformBottom(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexTopLeftTransformBottomLeft(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexTopLeftTransformLeft(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexTopLeftTransformTopLeft(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexTopRightTransformTop(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexTopRightTransformTopRight(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexTopRightTransformRight(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexTopRightTransformBottomRight(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexTopRightTransformBottom(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexTopRightTransformBottomLeft(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexTopRightTransformLeft(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexTopRightTransformTopLeft(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexBottomRightTransformTop(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexBottomRightTransformTopRight(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexBottomRightTransformRight(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexBottomRightTransformBottomRight(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexBottomRightTransformBottom(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexBottomRightTransformBottomLeft(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexBottomRightTransformLeft(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexBottomRightTransformTopLeft(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexBottomLeftTransformTop(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexBottomLeftTransformTopRight(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexBottomLeftTransformRight(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexBottomLeftTransformBottomRight(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexBottomLeftTransformBottom(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexBottomLeftTransformBottomLeft(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexBottomLeftTransformLeft(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira static bool _complexBottomLeftTransformTopLeft(PixelGraph::const_iterator graph_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira /*
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * The memory layout assumed goes like this (with a_it being the current
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * iterated element):
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira *
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * (a_it) | (b_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * -------+-------
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * (c_it) | (d_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira *
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * If you want to use it with another directions (topleft, topright, ...)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * **DO NOT** invert x or y axis, because the insertion order will go mad.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira *
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * The idea behind this abstraction is to rotate the iterators, then the
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * insertion order will be preserved.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira *
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * The initial value of all nodes that will be inserted is {x, y}. All
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * changes to this node **MUST** occur through \p transform or _adjust.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira *
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * Some maintainers may like this function because they will handle a
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * code base 4 times smaller and bugs will be MUCH MUCH difficult to hide.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira *
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * Some maintainers may go mad because the level extra level of
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira * abstraction.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira *
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * "All problems in computer science can be solved by another level of
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * indirection, except for the problem of too many layers of indirection."
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * -- David J. Wheeler
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira */
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira#ifndef LIBDEPIXELIZE_VERY_TYPE_SAFE
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira template<class PointTransform, class NodeTransform>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira#endif // LIBDEPIXELIZE_VERY_TYPE_SAFE
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira void _genericComplexBottomRight(PixelGraph::const_iterator a_it,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator b_it,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator c_it,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator d_it,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Cell *const cells_it, int x, int y,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PointTransform transform,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira NodeTransform top,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira NodeTransform topright,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira NodeTransform right,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira NodeTransform bottomright,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira NodeTransform bottom,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira NodeTransform bottomleft,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira NodeTransform left,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira NodeTransform topleft);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira int _width;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira int _height;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira std::vector<Cell> _cells;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira};
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos OliveiraSimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::SimplifiedVoronoi(const PixelGraph &graph) :
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _width(graph.width()),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _height(graph.height()),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _cells(graph.size())
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if (!graph.size())
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira /*
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira * The insertion order of cells is not a big deal. Here I just follow
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira * the order of PixelGraph arrangement.
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira */
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // ...the "center" cells first...
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( _width > 2 && _height > 2 ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator graph_it = graph.begin() + _width + 1;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Cell *cells_it = &_cells.front() + _width + 1;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( int i = 1 ; i != _height - 1 ; ++i ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( int j = 1 ; j != _width - 1 ; ++j, ++graph_it, ++cells_it ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( int k = 0 ; k != 4 ; ++k )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->rgba[k] = graph_it->rgba[k];
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Top-left
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _complexTopLeft(graph, graph_it, cells_it, j, i);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Top-right
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _complexTopRight(graph, graph_it, cells_it, j, i);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Bottom-right
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _complexBottomRight(graph, graph_it, cells_it, j, i);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Bottom-left
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _complexBottomLeft(graph, graph_it, cells_it, j, i);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira // After the previous loop, 'it' is pointing to the last cell from
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // the row.
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Go south, then first node in the row (increment 'it' by 1)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Go to the second node in the line (increment 'it' by 1)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira graph_it += 2;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it += 2;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // ...then the "top" cells...
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( _width > 2 ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator graph_it = graph.begin() + 1;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Cell *cells_it = &_cells.front() + 1;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira if ( _height > 1 ) {
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira for ( int i = 1 ; i != _width - 1 ; ++i, ++graph_it, ++cells_it ) {
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira for ( int j = 0 ; j != 4 ; ++j )
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->rgba[j] = graph_it->rgba[j];
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira // Top-left
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(i, 0, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira // Top-right
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(i + 1, 0, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira // Bottom-right
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira _complexBottomRight(graph, graph_it, cells_it, i, 0);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira // Bottom-left
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira _complexBottomLeft(graph, graph_it, cells_it, i, 0);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira }
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira } else {
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira for ( int i = 1 ; i != _width - 1 ; ++i, ++graph_it, ++cells_it ) {
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira for ( int j = 0 ; j != 4 ; ++j )
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->rgba[j] = graph_it->rgba[j];
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira // Top-left
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(i, 0, false));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira // Top-right
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(i + 1, 0, false));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira // Bottom-right
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(i + 1, 1, false));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira // Bottom-left
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(i, 1, false));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // ...then the "bottom" cells...
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( _width > 2 && _height > 1 ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Node *it = &((*this)[1][_height - 1]);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator graph_it
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira = graph.begin() + (_height - 1) * _width + 1;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Cell *cells_it = &_cells.front() + (_height - 1) * _width + 1;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( int i = 1 ; i != _width - 1 ; ++i, ++graph_it, ++cells_it ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( int j = 0 ; j != 4 ; ++j )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->rgba[j] = graph_it->rgba[j];
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Top-left
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _complexTopLeft(graph, graph_it, cells_it, i, _height - 1);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Top-right
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _complexTopRight(graph, graph_it, cells_it, i, _height - 1);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Bottom-right
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(i + 1, _height, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Bottom-left
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(i, _height, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // ...then the "left" cells...
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( _height > 2 ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator graph_it = graph.begin() + _width;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Cell *cells_it = &_cells.front() + _width;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira if ( _width > 1 ) {
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira for ( int i = 1 ; i != _height - 1 ; ++i) {
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira for ( int j = 0 ; j != 4 ; ++j )
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->rgba[j] = graph_it->rgba[j];
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira // Top-left
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(0, i, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira // Top-right
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira _complexTopRight(graph, graph_it, cells_it, 0, i);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira // Bottom-right
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira _complexBottomRight(graph, graph_it, cells_it, 0, i);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira // Bottom-left
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(0, i + 1, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira graph_it += _width;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it += _width;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira }
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira } else {
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira for ( int i = 1 ; i != _height - 1 ; ++i) {
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira for ( int j = 0 ; j != 4 ; ++j )
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->rgba[j] = graph_it->rgba[j];
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira // Top-left
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(0, i, false));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira // Top-right
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(1, i, false));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira // Bottom-right
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(1, i, false));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira // Bottom-left
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(0, i + 1, false));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira graph_it += _width;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it += _width;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // ...then the "right" cells...
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( _height > 2 && _width > 1 ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator graph_it = graph.begin() + 2 * _width - 1;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Cell *cells_it = &_cells.front() + 2 * _width - 1;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( int i = 1 ; i != _height - 1 ; ++i ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( int j = 0 ; j != 4 ; ++j )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->rgba[j] = graph_it->rgba[j];
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Top-left
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _complexTopLeft(graph, graph_it, cells_it, _width - 1, i);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Top-right
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(_width, i, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Bottom-right
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(_width, i + 1, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Bottom-left
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _complexBottomLeft(graph, graph_it, cells_it, _width - 1, i);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira graph_it += _width;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it += _width;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // ...and the 4 corner nodes
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // top-left
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator graph_it = graph.begin();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Cell *cells_it = &_cells.front();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( int i = 0 ; i != 4 ; ++i )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->rgba[i] = graph_it->rgba[i];
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Top-left
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(0, 0, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Top-right
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(1, 0, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Bottom-right
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( _width > 1 && _height > 1 )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _complexBottomRight(graph, graph_it, cells_it, 0, 0);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira else
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(1, 1, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Bottom-left
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(0, 1, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // top-right
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( _width > 1 ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator graph_it = graph.begin() + _width - 1;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Cell *cells_it = &_cells.front() + _width - 1;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( int i = 0 ; i != 4 ; ++i )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->rgba[i] = graph_it->rgba[i];
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Top-left
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(_width - 1, 0, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Top-right
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(_width, 0, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Bottom-right
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(_width, 1, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Bottom-left
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( _height > 1 )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _complexBottomLeft(graph, graph_it, cells_it, _width - 1, 0);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira else
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(_width - 1, 1, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // bottom-left
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( _height > 1 ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator graph_it
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira = graph.begin() + (_height - 1) * _width;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Cell *cells_it = &_cells.front() + (_height - 1) * _width;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( int i = 0 ; i != 4 ; ++i )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->rgba[i] = graph_it->rgba[i];
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Top-left
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(0, _height - 1, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Top-right
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( _width > 1)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _complexTopRight(graph, graph_it, cells_it, 0, _height - 1);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira else
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(1, _height - 1, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Bottom-right
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(1, _height, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Bottom-left
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(0, _height, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // bottom-right
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( _width > 1 && _height > 1 ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator graph_it = --graph.end();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Cell *cells_it = &_cells.back();
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira for ( int i = 0 ; i != 4 ; ++i )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->rgba[i] = graph_it->rgba[i];
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Top-left
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _complexTopLeft(graph, graph_it, cells_it, _width - 1, _height - 1);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Top-right
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(_width, _height - 1, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Bottom-right
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(_width, _height, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Bottom-left
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(Point<T>(_width - 1, _height, false));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines> void
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos OliveiraSimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopLeft(const PixelGraph &graph,
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira PixelGraph::const_iterator graph_it, Cell *const cells_it,
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira int x, int y)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _genericComplexBottomRight(graph_it,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira graph.nodeLeft(graph_it),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira graph.nodeTop(graph_it),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira graph.nodeTopLeft(graph_it),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it, x, y,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexTopLeftTransform,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexTopLeftTransformTop,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexTopLeftTransformTopRight,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexTopLeftTransformRight,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexTopLeftTransformBottomRight,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexTopLeftTransformBottom,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexTopLeftTransformBottomLeft,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexTopLeftTransformLeft,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexTopLeftTransformTopLeft);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines> void
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos OliveiraSimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopRight(const PixelGraph &graph,
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira PixelGraph::const_iterator graph_it, Cell *const cells_it,
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira int x, int y)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _genericComplexBottomRight(graph_it,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira graph.nodeTop(graph_it),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira graph.nodeRight(graph_it),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira graph.nodeTopRight(graph_it),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it, x, y,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexTopRightTransform,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexTopRightTransformTop,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexTopRightTransformTopRight,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexTopRightTransformRight,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexTopRightTransformBottomRight,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexTopRightTransformBottom,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexTopRightTransformBottomLeft,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexTopRightTransformLeft,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexTopRightTransformTopLeft);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines> void
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos OliveiraSimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomRight(const PixelGraph &graph,
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira PixelGraph::const_iterator graph_it, Cell *const cells_it,
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira int x, int y)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _genericComplexBottomRight(graph_it,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira graph.nodeRight(graph_it),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira graph.nodeBottom(graph_it),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira graph.nodeBottomRight(graph_it),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it, x, y,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexBottomRightTransform,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexBottomRightTransformTop,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexBottomRightTransformTopRight,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexBottomRightTransformRight,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexBottomRightTransformBottomRight,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexBottomRightTransformBottom,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexBottomRightTransformBottomLeft,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexBottomRightTransformLeft,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexBottomRightTransformTopLeft);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines> void
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos OliveiraSimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomLeft(const PixelGraph &graph,
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira PixelGraph::const_iterator graph_it, Cell *const cells_it,
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira int x, int y)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira _genericComplexBottomRight(graph_it,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira graph.nodeBottom(graph_it),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira graph.nodeLeft(graph_it),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira graph.nodeBottomLeft(graph_it),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it, x, y,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexBottomLeftTransform,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexBottomLeftTransformTop,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexBottomLeftTransformTopRight,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexBottomLeftTransformRight,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexBottomLeftTransformBottomRight,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexBottomLeftTransformBottom,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexBottomLeftTransformBottomLeft,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexBottomLeftTransformLeft,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira &SimplifiedVoronoi::_complexBottomLeftTransformTopLeft);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines> void
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos OliveiraSimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopLeftTransform(Point<T> &p, T dx, T dy)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira p.x -= dx;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira p.y -= dy;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines> void
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos OliveiraSimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopRightTransform(Point<T> &p, T dx, T dy)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira p.x += dy;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira p.y -= dx;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines> void
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos OliveiraSimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomRightTransform(Point<T> &p, T dx, T dy)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira p.x += dx;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira p.y += dy;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines> void
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos OliveiraSimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomLeftTransform(Point<T> &p, T dx, T dy)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira p.x -= dy;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira p.y += dx;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopLeftTransformTop(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.bottom;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopLeftTransformTopRight(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.bottomleft;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopLeftTransformRight(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.left;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopLeftTransformBottomRight(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.topleft;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopLeftTransformBottom(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.top;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopLeftTransformBottomLeft(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.topright;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopLeftTransformLeft(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.right;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopLeftTransformTopLeft(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.bottomright;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopRightTransformTop(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.left;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopRightTransformTopRight(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.topleft;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopRightTransformRight(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.top;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopRightTransformBottomRight(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.topright;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopRightTransformBottom(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.right;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopRightTransformBottomLeft(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.bottomright;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopRightTransformLeft(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.bottom;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexTopRightTransformTopLeft(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.bottomleft;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomRightTransformTop(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.top;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomRightTransformTopRight(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.topright;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomRightTransformRight(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.right;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomRightTransformBottomRight(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.bottomright;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomRightTransformBottom(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.bottom;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomRightTransformBottomLeft(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.bottomleft;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomRightTransformLeft(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.left;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomRightTransformTopLeft(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.topleft;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomLeftTransformTop(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.right;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomLeftTransformTopRight(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.bottomright;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomLeftTransformRight(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.bottom;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomLeftTransformBottomRight(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.bottomleft;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomLeftTransformBottom(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.left;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomLeftTransformBottomLeft(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.topleft;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomLeftTransformLeft(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.top;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveirabool SimplifiedVoronoi<T, adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira::_complexBottomLeftTransformTopLeft(PixelGraph::const_iterator graph_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira return graph_it->adj.topright;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira}
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class T, bool adjust_splines>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira#ifndef LIBDEPIXELIZE_VERY_TYPE_SAFE
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveiratemplate<class PointTransform, class NodeTransform>
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira#endif // LIBDEPIXELIZE_VERY_TYPE_SAFE
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveiravoid
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos OliveiraSimplifiedVoronoi<T, adjust_splines>
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira::_genericComplexBottomRight(PixelGraph::const_iterator a_it,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator b_it,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator c_it,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PixelGraph::const_iterator d_it,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Cell *const cells_it, int x, int y,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira PointTransform transform,
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira NodeTransform,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira NodeTransform topright,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira NodeTransform right,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira NodeTransform bottomright,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira NodeTransform bottom,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira NodeTransform bottomleft,
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira NodeTransform,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira NodeTransform topleft)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira{
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira using colorspace::contour_edge;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira using colorspace::same_color;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira const Point<T> initial(x, y);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira /*
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira * The insertion order of points within the cell is very important. You must
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira * follow current practice: Clockwise order.
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira */
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( bottomright(a_it) ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // this and bottom-right are connected
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira bool smooth[2] = {
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira ( same_color(a_it->rgba, d_it->rgba)
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira || same_color(a_it->rgba, b_it->rgba)
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira || same_color(b_it->rgba, d_it->rgba) ),
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira ( same_color(a_it->rgba, d_it->rgba)
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira || same_color(a_it->rgba, c_it->rgba)
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira || same_color(c_it->rgba, d_it->rgba) )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira };
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> borderMid = initial;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(borderMid, 1, 1);
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira borderMid = midpoint(initial, borderMid);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> vertices[2] = {initial, initial};
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(vertices[0], 1, 0);
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira vertices[0] = _adjust(midpoint(borderMid, vertices[0]), smooth[0]);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(vertices[1], 0, 1);
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira vertices[1] = _adjust(midpoint(borderMid, vertices[1]), smooth[1]);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira if ( !smooth[0] && adjust_splines ) {
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_1ST_IS_INVISIBLE
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(vertices[0].invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(vertices[0]);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertices[0];
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( 0.1875
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( topright(a_it) - topleft(b_it) ) * 0.1875 ),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // y
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( 0.5625
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( topright(a_it) + topleft(b_it) ) * 0.1875 ));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_2ND_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertices[0];
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( 0.0625
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( topright(a_it) - topleft(b_it) ) * 0.0625 ),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // y
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( 0.1875
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( topright(a_it) + topleft(b_it) ) * 0.0625) );
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira another.smooth = true;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_3RD_IS_INVISIBLE
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertices[0];
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira 0.1875
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( bottomright(b_it) + topright(d_it) ) * 0.0625,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // y
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira 0.0625
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira + ( bottomright(b_it) - topright(d_it) ) * 0.0625);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_4TH_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(vertices[0],
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira 0.0625
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira + ( topright(a_it) - topright(d_it) - topleft(b_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - bottomright(b_it) ) * 0.03125,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // y
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( 0.0625
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira + ( topright(d_it) - topright(a_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - topleft(b_it) - bottomright(b_it) )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * 0.03125 ));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_5TH_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira vertices[0].visible = false;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(vertices[0]);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira if ( !smooth[1] && adjust_splines ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertices[1];
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( 0.0625
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira + ( bottomleft(d_it) - bottomleft(a_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - topleft(c_it) - bottomright(c_it) )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * 0.03125 ),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // y
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira 0.0625
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira + ( bottomleft(a_it) - bottomleft(d_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - topleft(c_it) - bottomright(c_it) ) * 0.03125);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_1ST_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertices[1];
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira 0.0625
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira + ( bottomright(c_it) - bottomleft(d_it) ) * 0.0625,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // y
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira 0.1875
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( bottomright(c_it) + bottomleft(d_it) ) * 0.0625);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_2ND_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertices[1];
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( 0.1875
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( bottomleft(a_it) + topleft(c_it) )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * 0.0625 ),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // y
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( 0.0625
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( bottomleft(a_it) - topleft(c_it) )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * 0.0625 ));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira another.smooth = true;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_3RD_IS_INVISIBLE
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertices[1];
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( 0.5625
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( bottomleft(a_it) + topleft(c_it) )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * 0.1875 ),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // y
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( 0.1875
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( bottomleft(a_it) - topleft(c_it) )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * 0.1875 ));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_4TH_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_5TH_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira vertices[1].visible = false;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(vertices[1]);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira } else if ( bottomleft(b_it) ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // right and bottom are connected
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> vertex = initial;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(vertex, 1, 1);
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira vertex = _adjust(midpoint(midpoint(initial, vertex), initial), true);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(vertex);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira } else {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // Connections don't affect the shape of this squared-like
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // pixel
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> vertex = initial;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(vertex, 1, 1);
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira vertex = _adjust(midpoint(initial, vertex));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // compute smoothness
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira if ( right(a_it) && adjust_splines ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // this and right are connected
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( !right(c_it) && !( bottom(a_it) && bottom(b_it) ) ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // bottom and bottom-right are disconnected
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira bool foreign_is_contour = contour_edge(c_it->rgba, d_it->rgba);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira bool twin_is_contour = contour_edge(b_it->rgba, d_it->rgba);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira bool another_is_contour = contour_edge(a_it->rgba, c_it->rgba);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( another_is_contour + twin_is_contour
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira + foreign_is_contour == 2 ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira vertex.smooth = !foreign_is_contour;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( !vertex.smooth ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( another_is_contour ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.125
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( ( bottomright(c_it) + topleft(c_it) )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * 0.03125 );
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another, - amount, amount);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_1ST_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.0625 * bottomright(c_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another, amount, 0.25 - amount);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_2ND_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.0625 * topleft(c_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another, - ( 0.25 - amount ),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - amount);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira another.smooth = true;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_3RD_IS_INVISIBLE
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.1875 * topleft(c_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another, - ( 0.75 - amount ),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - amount);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_4TH_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_5TH_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira vertex.visible = false;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira } else if ( twin_is_contour ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.125
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( ( bottomleft(d_it) + topright(d_it) )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * 0.03125 );
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(vertex, amount, amount);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira } else if ( !same_color(a_it->rgba, b_it->rgba) ) {
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira vertex.smooth = false;
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira // This is the same code of the if ( special )
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira // I REALLY NEED lambdas to improve this code without
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira // creating yet another interface that takes a million
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira // of function parameters and keep code locality
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira {
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira Point<T> another = vertex;
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira T amount = 0.03125;
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira transform(another,
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira amount
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira * ( topleft(c_it) - topright(d_it)
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira + bottomleft(a_it) - bottomright(b_it) ),
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira // y
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira - amount
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira * ( topleft(c_it) + topright(d_it)
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira - bottomleft(a_it) - bottomright(b_it) ));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_1ST_IS_INVISIBLE
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira }
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira {
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira Point<T> another = vertex;
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira T amount = 0.0625;
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira transform(another,
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira 0.25 - amount
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira * ( topright(d_it) + bottomright(b_it) ),
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira // y
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira - amount
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira * ( topright(d_it) - bottomright(b_it) ));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_2ND_IS_INVISIBLE
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira }
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira {
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira Point<T> another = vertex;
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira T amount = 0.0625;
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira transform(another,
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira - ( 0.25 - amount
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira * ( topleft(c_it) + bottomleft(a_it) ) ),
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira // y
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira - amount
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira * ( topleft(c_it) - bottomleft(a_it) ));
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira another.smooth = true;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_3RD_IS_INVISIBLE
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira }
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira {
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira Point<T> another = vertex;
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira T amount = 0.1875;
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira transform(another,
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira - ( 0.75 - amount
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira * ( topleft(c_it) + bottomleft(a_it) ) ),
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira // y
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira - amount
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira * ( topleft(c_it) - bottomleft(a_it) ));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_4TH_IS_INVISIBLE
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira }
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_5TH_IS_INVISIBLE
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira vertex.visible = false;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira } else {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // {this, right} is the pair with the angle
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // closest to 180 degrees
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira vertex.smooth = same_color(a_it->rgba, b_it->rgba);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira } else {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // there might be 2-color, then vertex.smooth = true
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // or it might be 1-color and doesn't matter,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // because the current node will disappear
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira vertex.smooth
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira = same_color(a_it->rgba, b_it->rgba)
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira + same_color(a_it->rgba, c_it->rgba)
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira + same_color(d_it->rgba, b_it->rgba)
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira + same_color(d_it->rgba, c_it->rgba) == 2;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira } else if ( bottom(a_it) && adjust_splines ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // this and bottom are connected
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( !bottom(b_it) && !( right(a_it) && right(c_it) ) ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // right and bottom-right are disconnected
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira bool foreign_is_contour = contour_edge(b_it->rgba, d_it->rgba);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira bool twin_is_contour = contour_edge(c_it->rgba, d_it->rgba);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira bool another_is_contour = contour_edge(a_it->rgba, b_it->rgba);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( another_is_contour + twin_is_contour
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira + foreign_is_contour == 2 ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira vertex.smooth = !foreign_is_contour;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( !vertex.smooth ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( another_is_contour ) {
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_1ST_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(vertex.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(vertex);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.1875 * topleft(b_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another, - amount,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( 0.75 - amount ));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_2ND_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.0625 * topleft(b_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another, - amount,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( 0.25 - amount ));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira another.smooth = true;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_3RD_IS_INVISIBLE
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.0625 * bottomright(b_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another, 0.25 - amount, amount);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_4TH_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.125
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - (bottomright(b_it) + topleft(b_it))
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * 0.03125;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(vertex, amount, - amount);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_5TH_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira vertex.visible = false;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira } else if ( twin_is_contour ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.125
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( ( topright(d_it) + bottomleft(d_it) )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * 0.03125 );
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(vertex, amount, amount);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira } else if ( !same_color(a_it->rgba, c_it->rgba) ) {
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira vertex.smooth = false;
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira // This is the same code of the if ( special )
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira // I REALLY NEED lambdas to improve this code without
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira // creating yet another interface that takes a million
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira // of function parameters and keep code locality
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_1ST_IS_INVISIBLE
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira cells_it->vertices.push_back(vertex.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(vertex);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira {
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira Point<T> another = vertex;
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira T amount = 0.1875;
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira transform(another,
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira - ( topleft(b_it) - topright(a_it) ) * amount,
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira // y
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira - ( 0.75
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira - ( topleft(b_it) + topright(a_it) )
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira * amount ));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_2ND_IS_INVISIBLE
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira }
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira {
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira Point<T> another = vertex;
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira T amount = 0.0625;
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira transform(another,
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira - ( topleft(b_it) - topright(a_it) ) * amount,
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira // y
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira - ( 0.25
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira - ( topleft(b_it) + topright(a_it) )
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira * amount ));
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira another.smooth = true;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_3RD_IS_INVISIBLE
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira }
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira {
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira Point<T> another = vertex;
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira T amount = 0.0625;
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira transform(another, - amount
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira * ( bottomleft(d_it) - bottomright(c_it) ),
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira // y
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira 0.25 - amount
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira * ( bottomleft(d_it) + bottomright(c_it) ));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_4TH_IS_INVISIBLE
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira }
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira {
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira transform(vertex,
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira - ( topleft(b_it) + bottomleft(d_it)
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira - topright(a_it) - bottomright(c_it) )
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira * 0.03125,
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira // y
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira ( topleft(b_it) - bottomleft(d_it)
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira + topright(a_it) - bottomright(c_it) )
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira * 0.03125);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_5TH_IS_INVISIBLE
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira vertex.visible = false;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira } else {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // {this, bottom} is the pair with the angle
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // closest to 180 degrees
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira vertex.smooth = same_color(a_it->rgba, c_it->rgba);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira } else {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // there might be 2-color, then vertex.smooth = true
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // or it might be 1-color and doesn't matter,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // because the current node will disappear
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira vertex.smooth
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira = same_color(a_it->rgba, c_it->rgba)
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira + same_color(a_it->rgba, b_it->rgba)
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira + same_color(d_it->rgba, b_it->rgba)
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira + same_color(d_it->rgba, c_it->rgba) == 2;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira } else if ( bottom(b_it) && adjust_splines ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // right and bottom-right are connected
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira bool special = false;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira bool foreign_is_contour = contour_edge(c_it->rgba, d_it->rgba);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // the neighbor similar in 90° feature
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira bool similar_neighbor_is_contour
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira = contour_edge(a_it->rgba, c_it->rgba);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( contour_edge(a_it->rgba, b_it->rgba)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira + similar_neighbor_is_contour
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira + foreign_is_contour == 2 ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira vertex.smooth = !foreign_is_contour;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( !vertex.smooth ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( similar_neighbor_is_contour ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.125
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( topleft(c_it) + bottomright(c_it) )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * 0.03125;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another, - amount, amount);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_1ST_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.0625 * bottomright(c_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another, amount, 0.25 - amount);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_2ND_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.0625 * topleft(c_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another, - ( 0.25 - amount ), - amount);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira another.smooth = true;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_3RD_IS_INVISIBLE
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.1875 * topleft(c_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another, - ( 0.75 - amount ), - amount);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_4TH_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_5TH_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira vertex.visible = false;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira } else {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira special = true;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira } else {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // {right, bottom-right} is the pair with the
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // angle closest to 180 degrees
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira vertex.smooth = false;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira special = true;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( special ) {
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_1ST_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(vertex.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(vertex);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.1875;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( topleft(b_it) - topright(a_it) ) * amount,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // y
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( 0.75
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( topleft(b_it) + topright(a_it) )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * amount ));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_2ND_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.0625;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( topleft(b_it) - topright(a_it) ) * amount,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // y
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( 0.25
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( topleft(b_it) + topright(a_it) )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * amount ));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira another.smooth = true;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_3RD_IS_INVISIBLE
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.0625;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another, - amount
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * ( bottomleft(d_it) - bottomright(c_it) ),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // y
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira 0.25 - amount
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * ( bottomleft(d_it) + bottomright(c_it) ));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_4TH_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(vertex,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( topleft(b_it) + bottomleft(d_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - topright(a_it) - bottomright(c_it) )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * 0.03125,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // y
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira ( topleft(b_it) - bottomleft(d_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira + topright(a_it) - bottomright(c_it) )
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * 0.03125);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_5TH_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira vertex.visible = false;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
3b711c89939d4f10cb1b81da2726a49aa45a2ab7Vinícius dos Santos Oliveira } else if ( right(c_it) && adjust_splines ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // bottom and bottom-right are connected
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira bool special = false;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira bool foreign_is_contour = contour_edge(b_it->rgba, d_it->rgba);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // the neighbor similar in 90° feature
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira bool similar_neighbor_is_contour
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira = contour_edge(a_it->rgba, b_it->rgba);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( contour_edge(a_it->rgba, c_it->rgba)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira + similar_neighbor_is_contour
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira + foreign_is_contour == 2 ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira vertex.smooth = !foreign_is_contour;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( !vertex.smooth ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( similar_neighbor_is_contour ) {
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_1ST_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(vertex.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(vertex);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.1875 * topleft(b_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another, - amount, - ( 0.75 - amount ));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_2ND_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.0625 * topleft(b_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another, - amount, - ( 0.25 - amount ));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira another.smooth = true;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_3RD_IS_INVISIBLE
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.0625 * bottomright(b_it);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another, 0.25 - amount, amount);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_4TH_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.125
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - 0.03125 * (topleft(b_it) + bottomright(b_it));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(vertex, amount, - amount);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_5TH_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira vertex.visible = false;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira } else {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira special = true;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira } else {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // {bottom, bottom-right} is the pair with the
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // angle closest to 180 degrees
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira vertex.smooth = false;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira special = true;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira if ( special ) {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.03125;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira amount
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * ( topleft(c_it) - topright(d_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira + bottomleft(a_it) - bottomright(b_it) ),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // y
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - amount
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * ( topleft(c_it) + topright(d_it)
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - bottomleft(a_it) - bottomright(b_it) ));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_1ST_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.0625;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira 0.25 - amount
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * ( topright(d_it) + bottomright(b_it) ),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // y
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - amount
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * ( topright(d_it) - bottomright(b_it) ));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_2ND_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.0625;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( 0.25 - amount
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * ( topleft(c_it) + bottomleft(a_it) ) ),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // y
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - amount
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * ( topleft(c_it) - bottomleft(a_it) ));
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira another.smooth = true;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_3RD_IS_INVISIBLE
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira Point<T> another = vertex;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira T amount = 0.1875;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira transform(another,
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - ( 0.75 - amount
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * ( topleft(c_it) + bottomleft(a_it) ) ),
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // y
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira - amount
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira * ( topleft(c_it) - bottomleft(a_it) ));
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_4TH_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira cells_it->vertices.push_back(another.invisible());
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#else
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira cells_it->vertices.push_back(another);
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#ifdef LIBDEPIXELIZE_ENABLE_EXPERIMENTAL_FEATURES_5TH_IS_INVISIBLE
3bbe1e386a73e405bba4c70f3845cd46cce14d13Vinícius dos Santos Oliveira vertex.visible = false;
ba9df310bea83917d22bde09c788998b820e9ee3Vinícius dos Santos Oliveira#endif
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira } else {
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // there is a 4-color pattern, where the current node
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira // won't be smooth
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira vertex.smooth = false;
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira cells_it->vertices.push_back(vertex);
89403dd20985abf3b4689cea57344290de56849cVinícius dos Santos Oliveira }
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_SIMPLIFIEDVORONOI_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 :