diff --git a/src/db/db/dbTriangles.cc b/src/db/db/dbTriangles.cc index 92add3390..6f4e928f5 100644 --- a/src/db/db/dbTriangles.cc +++ b/src/db/db/dbTriangles.cc @@ -1414,6 +1414,23 @@ Triangles::clear () m_id = 0; } +template +void +Triangles::make_contours (const Poly &poly, const Trans &trans, std::vector > &edge_contours) +{ + edge_contours.push_back (std::vector ()); + 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 ()); + 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 ®ion, double dbu) { @@ -1421,25 +1438,36 @@ Triangles::create_constrained_delaunay (const db::Region ®ion, double dbu) std::vector > edge_contours; + db::CplxTrans trans (dbu); for (auto p = region.begin_merged (); ! p.at_end (); ++p) { - - edge_contours.push_back (std::vector ()); - 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 ()); - 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 > 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 > edge_contours; + make_contours (p, db::DUnitTrans (), edge_contours); + + constrain (edge_contours); +} + static bool is_skinny (const db::Triangle *tri, const Triangles::TriangulateParameters ¶m) { if (param.min_b < db::epsilon) { @@ -1479,7 +1507,30 @@ Triangles::triangulate (const db::Region ®ion, 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 ¶meters, 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 ¶meters) +{ + tl::SelfTimer timer (tl::verbosity () > parameters.base_verbosity, "Triangles::triangulate"); + + create_constrained_delaunay (poly); + refine (parameters); +} + +void +Triangles::refine (const TriangulateParameters ¶meters) +{ if (parameters.min_b < db::epsilon && parameters.max_area < db::epsilon && parameters.max_area_border < db::epsilon) { // no refinement requested - we're done. diff --git a/src/db/db/dbTriangles.h b/src/db/db/dbTriangles.h index 0e54508b8..26bb8d88c 100644 --- a/src/db/db/dbTriangles.h +++ b/src/db/db/dbTriangles.h @@ -154,6 +154,16 @@ public: */ void triangulate (const db::Region ®ion, const TriangulateParameters ¶meters, double dbu = 1.0); + /** + * @brief Triangulates a polygon + */ + void triangulate (const db::Polygon &poly, const TriangulateParameters ¶meters, double dbu = 1.0); + + /** + * @brief Triangulates a floating-point polygon + */ + void triangulate (const db::DPolygon &poly, const TriangulateParameters ¶meters); + /** * @brief Statistics: number of flips (fixing) */ @@ -271,6 +281,16 @@ protected: */ void create_constrained_delaunay (const db::Region ®ion, 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 > *new_triangles_out); std::vector ensure_edge_inner (db::Vertex *from, db::Vertex *to); void join_edges (std::vector &edges); + void refine (const TriangulateParameters ¶m); + template void make_contours (const Poly &poly, const Trans &trans, std::vector > &contours); }; }