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;
|
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
|
void
|
||||||
Triangles::create_constrained_delaunay (const db::Region ®ion, double dbu)
|
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;
|
std::vector<std::vector<db::Vertex *> > edge_contours;
|
||||||
|
|
||||||
|
db::CplxTrans trans (dbu);
|
||||||
for (auto p = region.begin_merged (); ! p.at_end (); ++p) {
|
for (auto p = region.begin_merged (); ! p.at_end (); ++p) {
|
||||||
|
make_contours (*p, trans, edge_contours);
|
||||||
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
constrain (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)
|
static bool is_skinny (const db::Triangle *tri, const Triangles::TriangulateParameters ¶m)
|
||||||
{
|
{
|
||||||
if (param.min_b < db::epsilon) {
|
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");
|
tl::SelfTimer timer (tl::verbosity () > parameters.base_verbosity, "Triangles::triangulate");
|
||||||
|
|
||||||
create_constrained_delaunay (region, dbu);
|
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) {
|
if (parameters.min_b < db::epsilon && parameters.max_area < db::epsilon && parameters.max_area_border < db::epsilon) {
|
||||||
|
|
||||||
// no refinement requested - we're done.
|
// no refinement requested - we're done.
|
||||||
|
|
|
||||||
|
|
@ -154,6 +154,16 @@ public:
|
||||||
*/
|
*/
|
||||||
void triangulate (const db::Region ®ion, const TriangulateParameters ¶meters, double dbu = 1.0);
|
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)
|
* @brief Statistics: number of flips (fixing)
|
||||||
*/
|
*/
|
||||||
|
|
@ -271,6 +281,16 @@ protected:
|
||||||
*/
|
*/
|
||||||
void create_constrained_delaunay (const db::Region ®ion, double dbu = 1.0);
|
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)
|
* @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);
|
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);
|
std::vector<db::TriangleEdge *> ensure_edge_inner (db::Vertex *from, db::Vertex *to);
|
||||||
void join_edges (std::vector<TriangleEdge *> &edges);
|
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