Triangles: enhanced API

This commit is contained in:
Matthias Koefferlein 2023-08-19 20:40:15 +02:00
parent dfe6699ef9
commit e416c04a1c
2 changed files with 86 additions and 13 deletions

View File

@ -1414,6 +1414,23 @@ Triangles::clear ()
m_id = 0;
}
template<class Poly, class Trans>
void
Triangles::make_contours (const Poly &poly, const Trans &trans, std::vector<std::vector<db::Vertex *> > &edge_contours)
{
edge_contours.push_back (std::vector<db::Vertex *> ());
for (auto pt = poly.begin_hull (); pt != poly.end_hull (); ++pt) {
edge_contours.back ().push_back (insert_point (trans * *pt));
}
for (unsigned int h = 0; h < poly.holes (); ++h) {
edge_contours.push_back (std::vector<db::Vertex *> ());
for (auto pt = poly.begin_hole (h); pt != poly.end_hole (h); ++pt) {
edge_contours.back ().push_back (insert_point (trans * *pt));
}
}
}
void
Triangles::create_constrained_delaunay (const db::Region &region, double dbu)
{
@ -1421,25 +1438,36 @@ Triangles::create_constrained_delaunay (const db::Region &region, double dbu)
std::vector<std::vector<db::Vertex *> > edge_contours;
db::CplxTrans trans (dbu);
for (auto p = region.begin_merged (); ! p.at_end (); ++p) {
edge_contours.push_back (std::vector<db::Vertex *> ());
for (auto pt = p->begin_hull (); pt != p->end_hull (); ++pt) {
edge_contours.back ().push_back (insert_point (db::DPoint (*pt) * dbu));
}
for (unsigned int h = 0; h < p->holes (); ++h) {
edge_contours.push_back (std::vector<db::Vertex *> ());
for (auto pt = p->begin_hole (h); pt != p->end_hole (h); ++pt) {
edge_contours.back ().push_back (insert_point (db::DPoint (*pt) * dbu));
}
}
make_contours (*p, trans, edge_contours);
}
constrain (edge_contours);
}
void
Triangles::create_constrained_delaunay (const db::Polygon &p, double dbu)
{
clear ();
std::vector<std::vector<db::Vertex *> > edge_contours;
make_contours (p, db::CplxTrans (dbu), edge_contours);
constrain (edge_contours);
}
void
Triangles::create_constrained_delaunay (const db::DPolygon &p)
{
clear ();
std::vector<std::vector<db::Vertex *> > edge_contours;
make_contours (p, db::DUnitTrans (), edge_contours);
constrain (edge_contours);
}
static bool is_skinny (const db::Triangle *tri, const Triangles::TriangulateParameters &param)
{
if (param.min_b < db::epsilon) {
@ -1479,7 +1507,30 @@ Triangles::triangulate (const db::Region &region, const TriangulateParameters &p
tl::SelfTimer timer (tl::verbosity () > parameters.base_verbosity, "Triangles::triangulate");
create_constrained_delaunay (region, dbu);
refine (parameters);
}
void
Triangles::triangulate (const db::Polygon &poly, const TriangulateParameters &parameters, double dbu)
{
tl::SelfTimer timer (tl::verbosity () > parameters.base_verbosity, "Triangles::triangulate");
create_constrained_delaunay (poly, dbu);
refine (parameters);
}
void
Triangles::triangulate (const db::DPolygon &poly, const TriangulateParameters &parameters)
{
tl::SelfTimer timer (tl::verbosity () > parameters.base_verbosity, "Triangles::triangulate");
create_constrained_delaunay (poly);
refine (parameters);
}
void
Triangles::refine (const TriangulateParameters &parameters)
{
if (parameters.min_b < db::epsilon && parameters.max_area < db::epsilon && parameters.max_area_border < db::epsilon) {
// no refinement requested - we're done.

View File

@ -154,6 +154,16 @@ public:
*/
void triangulate (const db::Region &region, const TriangulateParameters &parameters, double dbu = 1.0);
/**
* @brief Triangulates a polygon
*/
void triangulate (const db::Polygon &poly, const TriangulateParameters &parameters, double dbu = 1.0);
/**
* @brief Triangulates a floating-point polygon
*/
void triangulate (const db::DPolygon &poly, const TriangulateParameters &parameters);
/**
* @brief Statistics: number of flips (fixing)
*/
@ -271,6 +281,16 @@ protected:
*/
void create_constrained_delaunay (const db::Region &region, double dbu = 1.0);
/**
* @brief Creates a constrained Delaunay triangulation from the given Polygon
*/
void create_constrained_delaunay (const db::Polygon &poly, double dbu = 1.0);
/**
* @brief Creates a constrained Delaunay triangulation from the given DPolygon
*/
void create_constrained_delaunay (const db::DPolygon &poly);
/**
* @brief Returns a value indicating whether the edge is "illegal" (violates the Delaunay criterion)
*/
@ -312,6 +332,8 @@ private:
void insert_new_vertex(db::Vertex *vertex, std::list<tl::weak_ptr<Triangle> > *new_triangles_out);
std::vector<db::TriangleEdge *> ensure_edge_inner (db::Vertex *from, db::Vertex *to);
void join_edges (std::vector<TriangleEdge *> &edges);
void refine (const TriangulateParameters &param);
template<class Poly, class Trans> void make_contours (const Poly &poly, const Trans &trans, std::vector<std::vector<db::Vertex *> > &contours);
};
}