mirror of
https://github.com/NGSolve/netgen.git
synced 2024-12-25 05:20:34 +05:00
Rename Polygon2d to Loop
This commit is contained in:
parent
334faad054
commit
b9487cc07a
@ -628,9 +628,9 @@ void ComputeIntersections(Solid2d & sp, Solid2d & sq)
|
|||||||
auto & PP = sp.polys;
|
auto & PP = sp.polys;
|
||||||
auto & QQ = sq.polys;
|
auto & QQ = sq.polys;
|
||||||
|
|
||||||
for (Polygon2d& P : PP)
|
for (Loop& P : PP)
|
||||||
for (Edge edgeP : P.Edges(SOURCE))
|
for (Edge edgeP : P.Edges(SOURCE))
|
||||||
for (Polygon2d& Q : QQ)
|
for (Loop& Q : QQ)
|
||||||
for (Edge edgeQ : Q.Edges(SOURCE))
|
for (Edge edgeQ : Q.Edges(SOURCE))
|
||||||
{
|
{
|
||||||
double alpha = 0.0;
|
double alpha = 0.0;
|
||||||
@ -688,10 +688,10 @@ void ComputeIntersections(Solid2d & sp, Solid2d & sq)
|
|||||||
} while(!curr->is_source);
|
} while(!curr->is_source);
|
||||||
};
|
};
|
||||||
|
|
||||||
for (Polygon2d& P : PP)
|
for (Loop& P : PP)
|
||||||
for (Vertex* v : P.Vertices(SOURCE))
|
for (Vertex* v : P.Vertices(SOURCE))
|
||||||
split_spline_at_vertex(v);
|
split_spline_at_vertex(v);
|
||||||
for (Polygon2d& Q : QQ)
|
for (Loop& Q : QQ)
|
||||||
for (Vertex* v : Q.Vertices(SOURCE))
|
for (Vertex* v : Q.Vertices(SOURCE))
|
||||||
split_spline_at_vertex(v);
|
split_spline_at_vertex(v);
|
||||||
}
|
}
|
||||||
@ -770,7 +770,7 @@ void LabelIntersections(Solid2d & sp, Solid2d & sq, Solid2d & sr, bool UNION)
|
|||||||
auto & RR = sr.polys;
|
auto & RR = sr.polys;
|
||||||
|
|
||||||
// 1) initial classification
|
// 1) initial classification
|
||||||
for (Polygon2d& P : PP)
|
for (Loop& P : PP)
|
||||||
for (Vertex* I : P.Vertices(INTERSECTION))
|
for (Vertex* I : P.Vertices(INTERSECTION))
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -818,7 +818,7 @@ void LabelIntersections(Solid2d & sp, Solid2d & sq, Solid2d & sr, bool UNION)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 2) classify intersection chains
|
// 2) classify intersection chains
|
||||||
for (Polygon2d& P : PP)
|
for (Loop& P : PP)
|
||||||
for (Vertex* I : P.Vertices(INTERSECTION))
|
for (Vertex* I : P.Vertices(INTERSECTION))
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -862,19 +862,19 @@ void LabelIntersections(Solid2d & sp, Solid2d & sq, Solid2d & sr, bool UNION)
|
|||||||
|
|
||||||
// 3) copy labels from P to Q
|
// 3) copy labels from P to Q
|
||||||
// loop over intersection vertices of P
|
// loop over intersection vertices of P
|
||||||
for (Polygon2d& P : PP)
|
for (Loop& P : PP)
|
||||||
for (Vertex* I : P.Vertices(INTERSECTION))
|
for (Vertex* I : P.Vertices(INTERSECTION))
|
||||||
I->neighbour->label = I->label;
|
I->neighbour->label = I->label;
|
||||||
|
|
||||||
// 3.5) check for special cases
|
// 3.5) check for special cases
|
||||||
|
|
||||||
set<Polygon2d*> noIntersection[2];
|
set<Loop*> noIntersection[2];
|
||||||
set<Polygon2d*> identical[2];
|
set<Loop*> identical[2];
|
||||||
|
|
||||||
for (int i=0; i<2; ++i)
|
for (int i=0; i<2; ++i)
|
||||||
{
|
{
|
||||||
Array<Polygon2d>* P_or_Q = &PP; // if i=0, then do it for P w.r.t. Q
|
Array<Loop>* P_or_Q = &PP; // if i=0, then do it for P w.r.t. Q
|
||||||
Array<Polygon2d>* Q_or_P = &QQ;
|
Array<Loop>* Q_or_P = &QQ;
|
||||||
|
|
||||||
if (i==1) { // if i=1, then do it for Q w.r.t. P
|
if (i==1) { // if i=1, then do it for Q w.r.t. P
|
||||||
P_or_Q = &QQ;
|
P_or_Q = &QQ;
|
||||||
@ -882,7 +882,7 @@ void LabelIntersections(Solid2d & sp, Solid2d & sq, Solid2d & sr, bool UNION)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// loop over all components of P (or Q)
|
// loop over all components of P (or Q)
|
||||||
for (Polygon2d& P : *P_or_Q)
|
for (Loop& P : *P_or_Q)
|
||||||
if (P.noCrossingVertex(UNION))
|
if (P.noCrossingVertex(UNION))
|
||||||
{
|
{
|
||||||
// P_ has no crossing vertex (but may have bounces or delayed bounces, except for UNION),
|
// P_ has no crossing vertex (but may have bounces or delayed bounces, except for UNION),
|
||||||
@ -899,7 +899,7 @@ void LabelIntersections(Solid2d & sp, Solid2d & sq, Solid2d & sr, bool UNION)
|
|||||||
// is P inside Q_or_P?
|
// is P inside Q_or_P?
|
||||||
bool isInside = false;
|
bool isInside = false;
|
||||||
auto p = P.getNonIntersectionPoint();
|
auto p = P.getNonIntersectionPoint();
|
||||||
for (Polygon2d& Q : *Q_or_P)
|
for (Loop& Q : *Q_or_P)
|
||||||
if ( Q.IsInside(p) )
|
if ( Q.IsInside(p) )
|
||||||
isInside = !isInside;
|
isInside = !isInside;
|
||||||
if (isInside ^ UNION)
|
if (isInside ^ UNION)
|
||||||
@ -909,20 +909,20 @@ void LabelIntersections(Solid2d & sp, Solid2d & sq, Solid2d & sr, bool UNION)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// handle components of P that are identical to some component of Q
|
// handle components of P that are identical to some component of Q
|
||||||
for (Polygon2d* P : identical[0])
|
for (Loop* P : identical[0])
|
||||||
{
|
{
|
||||||
// is P a hole?
|
// is P a hole?
|
||||||
bool P_isHole = false;
|
bool P_isHole = false;
|
||||||
for (Polygon2d& P_ : PP)
|
for (Loop& P_ : PP)
|
||||||
if ( ( P_.first.get() != P->first.get() ) && (P_.IsInside(*P->first)) )
|
if ( ( P_.first.get() != P->first.get() ) && (P_.IsInside(*P->first)) )
|
||||||
P_isHole = !P_isHole;
|
P_isHole = !P_isHole;
|
||||||
|
|
||||||
for (Polygon2d* Q : identical[1])
|
for (Loop* Q : identical[1])
|
||||||
for (Vertex* V : Q->Vertices(ALL))
|
for (Vertex* V : Q->Vertices(ALL))
|
||||||
if (V == P->first->neighbour) { // found Q that matches P
|
if (V == P->first->neighbour) { // found Q that matches P
|
||||||
// is Q a hole?
|
// is Q a hole?
|
||||||
bool Q_isHole = false;
|
bool Q_isHole = false;
|
||||||
for (Polygon2d& Q_ : QQ)
|
for (Loop& Q_ : QQ)
|
||||||
if ( ( Q_.first.get() != Q->first.get() ) && (Q_.IsInside(*Q->first)) )
|
if ( ( Q_.first.get() != Q->first.get() ) && (Q_.IsInside(*Q->first)) )
|
||||||
Q_isHole = !Q_isHole;
|
Q_isHole = !Q_isHole;
|
||||||
|
|
||||||
@ -940,8 +940,8 @@ next_P: ;
|
|||||||
|
|
||||||
for (int i=0; i<2; ++i)
|
for (int i=0; i<2; ++i)
|
||||||
{
|
{
|
||||||
Array<Polygon2d>* P_or_Q = &PP; // if i=0, then do it for P w.r.t. Q
|
Array<Loop>* P_or_Q = &PP; // if i=0, then do it for P w.r.t. Q
|
||||||
Array<Polygon2d>* Q_or_P = &QQ;
|
Array<Loop>* Q_or_P = &QQ;
|
||||||
|
|
||||||
if (i==1) { // if i=1, then do it for Q w.r.t. P
|
if (i==1) { // if i=1, then do it for Q w.r.t. P
|
||||||
P_or_Q = &QQ;
|
P_or_Q = &QQ;
|
||||||
@ -949,7 +949,7 @@ next_P: ;
|
|||||||
}
|
}
|
||||||
|
|
||||||
// loop over all components of P (or Q)
|
// loop over all components of P (or Q)
|
||||||
for (Polygon2d& P : *P_or_Q)
|
for (Loop& P : *P_or_Q)
|
||||||
{
|
{
|
||||||
|
|
||||||
// ignore P if it does not intersect with Q_or_P (detected in step 3.5 above)
|
// ignore P if it does not intersect with Q_or_P (detected in step 3.5 above)
|
||||||
@ -962,7 +962,7 @@ next_P: ;
|
|||||||
// check if it is inside or outside Q (or P)
|
// check if it is inside or outside Q (or P)
|
||||||
// and set ENTRY/EXIT status accordingly
|
// and set ENTRY/EXIT status accordingly
|
||||||
EntryExitLabel status = ENTRY;
|
EntryExitLabel status = ENTRY;
|
||||||
for (Polygon2d& Q : *Q_or_P)
|
for (Loop& Q : *Q_or_P)
|
||||||
if (Q.IsInside(*V))
|
if (Q.IsInside(*V))
|
||||||
ToggleLabel(status);
|
ToggleLabel(status);
|
||||||
|
|
||||||
@ -1122,11 +1122,11 @@ void CreateResult(Solid2d & sp, Solid2d & sr, bool UNION)
|
|||||||
// so that they cannot serve as start vertex of another component
|
// so that they cannot serve as start vertex of another component
|
||||||
//
|
//
|
||||||
|
|
||||||
for (Polygon2d& P : PP)
|
for (Loop& P : PP)
|
||||||
{
|
{
|
||||||
for (Vertex* I : P.Vertices(CROSSING_INTERSECTION))
|
for (Vertex* I : P.Vertices(CROSSING_INTERSECTION))
|
||||||
{
|
{
|
||||||
Polygon2d R; // result polygon component
|
Loop R; // result polygon component
|
||||||
|
|
||||||
Vertex* V = I; // start traversal at I
|
Vertex* V = I; // start traversal at I
|
||||||
V->is_intersection = false; // mark visited vertices
|
V->is_intersection = false; // mark visited vertices
|
||||||
@ -1179,7 +1179,7 @@ void CreateResult(Solid2d & sp, Solid2d & sr, bool UNION)
|
|||||||
void CleanUpResult(Solid2d & sr)
|
void CleanUpResult(Solid2d & sr)
|
||||||
{
|
{
|
||||||
auto & RR = sr.polys;
|
auto & RR = sr.polys;
|
||||||
for (Polygon2d& R : RR)
|
for (Loop& R : RR)
|
||||||
{
|
{
|
||||||
while ( (R.first.get() != NULL) && (fabs(Area(*R.first->prev,*R.first,*R.first->next)) < EPSILON) )
|
while ( (R.first.get() != NULL) && (fabs(Area(*R.first->prev,*R.first,*R.first->next)) < EPSILON) )
|
||||||
R.Remove(R.first.get());
|
R.Remove(R.first.get());
|
||||||
@ -1211,9 +1211,9 @@ void RemoveDuplicates(Solid2d & sr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Polygon2d RectanglePoly(double x0, double x1, double y0, double y1, string bc)
|
Loop RectanglePoly(double x0, double x1, double y0, double y1, string bc)
|
||||||
{
|
{
|
||||||
Polygon2d r;
|
Loop r;
|
||||||
r.Append( {x0, y0} );
|
r.Append( {x0, y0} );
|
||||||
r.Append( {x1, y0} );
|
r.Append( {x1, y0} );
|
||||||
r.Append( {x1, y1} );
|
r.Append( {x1, y1} );
|
||||||
@ -1235,7 +1235,7 @@ Solid2d Circle(double x, double y, double r, string name, string bc)
|
|||||||
{
|
{
|
||||||
Solid2d s;
|
Solid2d s;
|
||||||
s.name = name;
|
s.name = name;
|
||||||
Polygon2d poly;
|
Loop poly;
|
||||||
|
|
||||||
Point<2> ps[] =
|
Point<2> ps[] =
|
||||||
{
|
{
|
||||||
|
@ -356,20 +356,20 @@ inline int CalcSide( const Point<2> & p0, const Point<2> & p1, const Point<2> &
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Polygon2d
|
struct Loop
|
||||||
{
|
{
|
||||||
unique_ptr<Vertex> first = nullptr;
|
unique_ptr<Vertex> first = nullptr;
|
||||||
|
|
||||||
Polygon2d() = default;
|
Loop() = default;
|
||||||
|
|
||||||
Polygon2d(const Polygon2d & p)
|
Loop(const Loop & p)
|
||||||
: first(nullptr)
|
: first(nullptr)
|
||||||
{
|
{
|
||||||
for(auto v : p.Vertices(ALL))
|
for(auto v : p.Vertices(ALL))
|
||||||
AppendVertex(*v);
|
AppendVertex(*v);
|
||||||
}
|
}
|
||||||
|
|
||||||
Polygon2d & operator=(const Polygon2d & p)
|
Loop & operator=(const Loop & p)
|
||||||
{
|
{
|
||||||
first = nullptr;
|
first = nullptr;
|
||||||
if(p.first)
|
if(p.first)
|
||||||
@ -532,7 +532,7 @@ struct Polygon2d
|
|||||||
|
|
||||||
struct Solid2d
|
struct Solid2d
|
||||||
{
|
{
|
||||||
Array<Polygon2d> polys;
|
Array<Loop> polys;
|
||||||
|
|
||||||
string name = "";
|
string name = "";
|
||||||
|
|
||||||
@ -543,7 +543,7 @@ struct Solid2d
|
|||||||
Solid2d operator*(Solid2d & other);
|
Solid2d operator*(Solid2d & other);
|
||||||
Solid2d operator-(Solid2d other);
|
Solid2d operator-(Solid2d other);
|
||||||
|
|
||||||
void Append( const Polygon2d & poly )
|
void Append( const Loop & poly )
|
||||||
{
|
{
|
||||||
polys.Append(poly);
|
polys.Append(poly);
|
||||||
}
|
}
|
||||||
|
@ -408,15 +408,6 @@ DLL_HEADER void ExportGeom2d(py::module &m)
|
|||||||
.def("SetBC", &Solid2d::SetBC)
|
.def("SetBC", &Solid2d::SetBC)
|
||||||
;
|
;
|
||||||
|
|
||||||
py::class_<Polygon2d>(m, "Polygon2d")
|
|
||||||
.def(py::init<>())
|
|
||||||
.def("SetBC", &Polygon2d::SetBC)
|
|
||||||
.def("Append", [](Polygon2d & self, double x, double y)
|
|
||||||
{
|
|
||||||
self.Append({x,y});
|
|
||||||
})
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
m.def("Rectangle", [](double x0, double x1, double y0, double y1, string bc, string mat)
|
m.def("Rectangle", [](double x0, double x1, double y0, double y1, string bc, string mat)
|
||||||
{ return Rectangle(x0,x1,y0,y1,bc,mat); },
|
{ return Rectangle(x0,x1,y0,y1,bc,mat); },
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
from .libngpy._geom2d import SplineGeometry, Solid2d, Polygon2d, CSG2d, Rectangle, Circle
|
from .libngpy._geom2d import SplineGeometry, Solid2d, CSG2d, Rectangle, Circle
|
||||||
from .meshing import meshsize
|
from .meshing import meshsize
|
||||||
|
|
||||||
unit_square = SplineGeometry()
|
unit_square = SplineGeometry()
|
||||||
|
Loading…
Reference in New Issue
Block a user