This example shows how to partition a polygon (free of self-intersection) with an arbitrary number of holes into a set of convex polygons using the PolygonPartition class of Easy3D.
Note: For complex unknown structures that have self-intersection, you need to use the CSG operators provided in easy3d/algo/tessellator.h to obtain simply polygons (free of self-intersection) first.
27#include <easy3d/viewer/viewer.h>
28#include <easy3d/renderer/camera.h>
29#include <easy3d/core/surface_mesh.h>
30#include <easy3d/renderer/drawable_points.h>
31#include <easy3d/renderer/drawable_lines.h>
32#include <easy3d/renderer/renderer.h>
33#include <easy3d/algo/polygon_partition.h>
34#include <easy3d/util/initializer.h>
49int main(
int argc,
char** argv) {
55 Viewer viewer(EXAMPLE_TITLE);
56 viewer.camera()->setUpVector(
vec3(0, 1, 0));
57 viewer.camera()->setViewDirection(
vec3(0, 0, -1));
60 std::vector<vec2> points = {
76 std::vector<PolygonPartition::Polygon> polygons = {
81 std::vector<PolygonPartition::Polygon> holes = {
87 std::vector<PolygonPartition::Polygon> parts;
88 if (!PolygonPartition::apply(points, polygons, holes, parts))
96 for (
const auto& p : points)
97 mesh->add_vertex({p.x, p.y, 0});
98 for (
const auto& poly : parts) {
99 std::vector<SurfaceMesh::Vertex> vts;
100 for (
const auto&
id : poly)
101 vts.push_back(
SurfaceMesh::Vertex(static_cast<int>(id)));
105 viewer.add_model(std::shared_ptr<SurfaceMesh>(mesh));
108 mesh->renderer()->get_points_drawable(
"vertices")->set_visible(
true);
110 mesh->renderer()->get_points_drawable(
"vertices")->set_point_size(12);
112 mesh->renderer()->get_lines_drawable(
"edges")->set_visible(
true);
114 mesh->renderer()->get_lines_drawable(
"borders")->set_visible(
true);
@ SPHERE
The points will be drawn as spheres.
Definition drawable_points.h:62
A halfedge data structure for polygonal meshes of 2-manifold.
Definition surface_mesh.h:51
The built-in Easy3D viewer.
Definition viewer.h:63
Definition collider.cpp:182