dust3d/thirdparty/carve-1.4.0/include/carve/triangulator.hpp

176 lines
6.7 KiB
C++

// Begin License:
// Copyright (C) 2006-2008 Tobias Sargeant (tobias.sargeant@gmail.com).
// All rights reserved.
//
// This file is part of the Carve CSG Library (http://carve-csg.com/)
//
// This file may be used under the terms of the GNU General Public
// License version 2.0 as published by the Free Software Foundation
// and appearing in the file LICENSE.GPL2 included in the packaging of
// this file.
//
// This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
// INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE.
// End:
#pragma once
#include <list>
#include <vector>
#include <algorithm>
#include <carve/carve.hpp>
#include <carve/geom2d.hpp>
namespace carve {
namespace triangulate {
/**
* \brief Merge a set of holes into a polygon. (templated)
*
* Take a polygon loop and a collection of hole loops, and patch
* the hole loops into the polygon loop, returning a vector of
* vertices from the polygon and holes, which describes a new
* polygon boundary with no holes. The new polygon boundary is
* constructed via the addition of edges * joining the polygon
* loop to the holes.
*
* This may be applied to arbitrary vertex data (generally
* carve::geom3d::Vertex pointers), but a projection function must
* be supplied to convert vertices to coordinates in 2-space, in
* which the work is performed.
*
* @tparam project_t A functor which converts vertices to a 2d
* projection.
* @tparam vert_t The vertex type.
* @param project The projection functor.
* @param f_loop The polygon loop into which holes are to be
* incorporated.
* @param h_loops The set of hole loops to be incorporated.
*
* @return A vector of vertex pointers.
*/
template<typename project_t, typename vert_t>
static std::vector<vert_t>
incorporateHolesIntoPolygon(const project_t &project,
const std::vector<vert_t> &f_loop,
const std::vector<std::vector<vert_t> > &h_loops);
void
incorporateHolesIntoPolygon(const std::vector<std::vector<carve::geom2d::P2> > &poly,
std::vector<std::pair<size_t, size_t> > &result,
size_t poly_loop,
const std::vector<size_t> &hole_loops);
/**
* \brief Merge a set of holes into a polygon. (2d)
*
* Take a polygon loop and a collection of hole loops, and patch
* the hole loops into the polygon loop, returning a vector of
* containing the vertices from the polygon and holes which
* describes a new polygon boundary with no holes, through the
* addition of edges joining the polygon loop to the holes.
*
* @param poly A vector containing the face loop (the first
* element of poly) and the hole loops (second and
* subsequent elements of poly).
*
* @return A vector of pairs of <loop_number, index> that
* reference poly and define the result polygon loop.
*/
std::vector<std::pair<size_t, size_t> > incorporateHolesIntoPolygon(const std::vector<std::vector<carve::geom2d::P2> > &poly);
std::vector<std::vector<std::pair<size_t, size_t> > > mergePolygonsAndHoles(const std::vector<std::vector<carve::geom2d::P2> > &poly);
struct tri_idx {
union {
unsigned v[3];
struct { unsigned a, b, c; };
};
tri_idx() : a(0), b(0), c(0) {
}
tri_idx(unsigned _a, unsigned _b, unsigned _c) : a(_a), b(_b), c(_c) {
}
};
/**
* \brief Triangulate a 2-dimensional polygon.
*
* Given a 2-dimensional polygon described as a vector of 2-d
* points, with no holes and no self-crossings, produce a
* triangulation using an ear-clipping algorithm.
*
* @param [in] poly A vector containing the input polygon.
* @param [out] result A vector of triangles, represented as
* indicies into poly.
*/
void triangulate(const std::vector<carve::geom2d::P2> &poly, std::vector<tri_idx> &result);
/**
* \brief Triangulate a polygon (templated).
*
* @tparam project_t A functor which converts vertices to a 2d
* projection.
* @tparam vert_t The vertex type.
* @param [in] project The projection functor.
* @param [in] poly A vector containing the input polygon,
* represented as vert_t pointers.
* @param [out] result A vector of triangles, represented as
* indicies into poly.
*/
template<typename project_t, typename vert_t>
void triangulate(const project_t &project,
const std::vector<vert_t> &poly,
std::vector<tri_idx> &result);
/**
* \brief Improve a candidate triangulation of poly by minimising
* the length of internal edges. (templated)
*
* @tparam project_t A functor which converts vertices to a 2d
* projection.
* @tparam vert_t The vertex type.
* @param [in] project The projection functor.
* @param [in] poly A vector containing the input polygon,
* represented as vert_t pointers.
* @param [inout] result A vector of triangles, represented as
* indicies into poly. On input, this vector
* must contain a candidate triangulation of
* poly. Calling improve() modifies the
* contents of the vector, returning an
* improved triangulation.
*/
template<typename project_t, typename vert_t>
void improve(const project_t &project,
const std::vector<vert_t> &poly,
std::vector<tri_idx> &result);
/**
* \brief Improve a candidate triangulation of poly by minimising
* the length of internal edges.
*
* @param [in] poly A vector containing the input polygon.
* @param [inout] result A vector of triangles, represented as
* indicies into poly. On input, this vector
* must contain a candidate triangulation of
* poly. Calling improve() modifies the
* contents of the vector, returning an
* improved triangulation.
*/
static inline void improve(const std::vector<carve::geom2d::P2> &poly, std::vector<tri_idx> &result) {
improve(carve::geom2d::p2_adapt_ident(), poly, result);
}
}
}
#include <carve/triangulator_impl.hpp>