Port C ++ dari earcut.js, perpustakaan triangulasi poligon yang cepat dan hanya header.
Perpustakaan mengimplementasikan algoritma pengiris telinga yang dimodifikasi, dioptimalkan oleh hashing kurva Z-order dan diperluas untuk menangani lubang, poligon terpelintir, degenerasi dan pengintalan diri dengan cara yang tidak menjamin kebenaran triangulasi, tetapi upaya untuk selalu menghasilkan hasil yang dapat diterima untuk data praktis seperti bentuk geografis.
Ini didasarkan pada ide-ide dari Fist: Triangulasi Kekuatan Industri Cepat Poligon oleh Martin Held dan Triangulasi oleh Kliping Telinga oleh 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 dapat melakukan triangulasi poligon planar sederhana dari setiap pesanan berliku termasuk lubang. Ini bahkan akan mengembalikan solusi yang kuat dan dapat diterima untuk Poygons non-sederhana. Earcut bekerja pada bidang 2D. Jika Anda memiliki tiga dimensi atau lebih, Anda dapat memproyeksikannya ke permukaan 2D sebelum triangulasi, atau menggunakan perpustakaan yang lebih cocok untuk tugas tersebut (misalnya CGAL).
Dimungkinkan juga untuk menggunakan jenis titik khusus Anda sebagai input. Ada aksesor default yang ditentukan untuk std::tuple , std::pair , dan std::array . Untuk jenis kustom (seperti tipe IntPoint Clipper), lakukan ini:
// 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 Anda juga dapat menggunakan jenis wadah khusus untuk poligon Anda. Mirip dengan std :: vektor, ia harus memenuhi persyaratan wadah, khususnya size() , empty() dan operator[] .
Jika Anda hanya ingin menggunakan perpustakaan triangulasi earcut; Salin dan sertakan file header <earcut.hpp> dalam proyek Anda dan ikuti langkah -langkah yang didokumentasikan dalam penggunaan bagian.
Jika Anda ingin membangun tes, benchmark, dan program visualisasi sebagai gantinya, ikuti instruksi ini:
Sebelum Anda melanjutkan, pastikan untuk menginstal alat dan perpustakaan berikut:
Catatan: Pada beberapa sistem operasi seperti Windows, langkah manual diperlukan untuk menambahkan CMake dan Git ke variabel lingkungan jalur Anda.
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"Setelah selesai, buka proyek yang dihasilkan dengan IDE Anda.
Impor proyek dari https://github.com/mapbox/earcut.hpp.git dan Anda harus baik untuk pergi!
Ini saat ini didasarkan pada earcut 2.2.4.