Uma porta C ++ do earcut.js, uma biblioteca de triangulação rápida e somente para cabeçalho.
A biblioteca implementa um algoritmo de corte de ouvido modificado, otimizado por hash de curva de ordem Z e estendido para lidar com orifícios, polígonos torcidos, degeneresciosos e auto-intercepções de uma maneira que não garante a correção da triangulação, mas tenta sempre produzir resultados aceitáveis para dados práticos como formas geográficas.
Baseia-se em idéias de Fist: Triangulação de polígonos de força industrial rápida de Martin Held e Triangulação por recorte de ouvido por David Eberly.
# include < earcut.hpp > // The number type to use for tessellation
using Coord = double ;
// The index type. Defaults to uint32_t, but you can also pass uint16_t if you know that your
// data won't have more than 65536 vertices.
using N = uint32_t ;
// Create array
using Point = std::array<Coord, 2 >;
std::vector<std::vector< Point >> polygon;
// Fill polygon structure with actual data. Any winding order works.
// The first polyline defines the main polygon.
polygon.push_back({{ 100 , 0 }, { 100 , 100 }, { 0 , 100 }, { 0 , 0 }});
// Following polylines define holes.
polygon.push_back({{ 75 , 25 }, { 75 , 75 }, { 25 , 75 }, { 25 , 25 }});
// Run tessellation
// Returns array of indices that refer to the vertices of the input polygon.
// e.g: the index 6 would refer to {25, 75} in this example.
// Three subsequent indices form a triangle. Output triangles are clockwise.
std::vector<N> indices = mapbox::earcut<N>(polygon);Earcut pode triangular um polígono simples e planar de qualquer ordem de enrolamento, incluindo orifícios. Ele até retornará uma solução robusta e aceitável para Poygons não simples. Earcut funciona em um plano 2D. Se você tiver três ou mais dimensões, poderá projetá -las em uma superfície 2D antes da triangulação ou usar uma biblioteca mais adequada para a tarefa (por exemplo, CGAL).
Também é possível usar seu tipo de ponto personalizado como entrada. Existem acessores padrão definidos para std::tuple , std::pair e std::array . Para um tipo personalizado (como o tipo IntPoint de Clipper), faça isso:
// struct IntPoint {
// int64_t X, Y;
// };
namespace mapbox {
namespace util {
template <>
struct nth < 0 , IntPoint> {
inline static auto get ( const IntPoint &t) {
return t. X ;
};
};
template <>
struct nth < 1 , IntPoint> {
inline static auto get ( const IntPoint &t) {
return t. Y ;
};
};
} // namespace util
} // namespace mapbox Você também pode usar um tipo de contêiner personalizado para o seu polígono. Semelhante ao STD :: Vector, ele deve atender aos requisitos do contêiner, em particular size() , empty() e operator[] .
Caso você queira apenas usar a biblioteca de triangulação do Earcut; Copie e inclua o arquivo de cabeçalho <earcut.hpp> em seu projeto e siga as etapas documentadas no uso da seção.
Se você deseja criar os programas de teste, referência e visualização, siga estas instruções:
Antes de continuar, certifique -se de instalar as seguintes ferramentas e bibliotecas:
NOTA: Em alguns sistemas operacionais, como Windows, são necessárias etapas manuais para adicionar cmake e git à sua variável de ambiente de caminho.
git clone --recursive https://github.com/mapbox/earcut.hpp.git
cd earcut.hpp
mkdir build
cd build
cmake ..
make
# ./tests
# ./bench
# ./vizgit clone --recursive https://github.com/mapbox/earcut.hpp.git
cd earcut.hpp
mkdir project
cd project
cmake .. -G " Visual Studio 14 2015 "
:: you can also generate projects for "Visual Studio 12 2013", "XCode", "Eclipse CDT4 - Unix Makefiles"Após a conclusão, abra o projeto gerado com seu IDE.
Importe o projeto de https://github.com/mapbox/earcut.hpp.git e você deve estar pronto!
Atualmente, é baseado no Earcut 2.2.4.