mirror of https://github.com/KLayout/klayout.git
Triangles: enhanced API
This commit is contained in:
parent
dfe6699ef9
commit
e416c04a1c
|
|
@ -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 ®ion, double dbu)
|
||||
{
|
||||
|
|
@ -1421,25 +1438,36 @@ Triangles::create_constrained_delaunay (const db::Region ®ion, 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 ¶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.
|
||||
|
|
|
|||
|
|
@ -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<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 ¶m);
|
||||
template<class Poly, class Trans> void make_contours (const Poly &poly, const Trans &trans, std::vector<std::vector<db::Vertex *> > &contours);
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue