mirror of
https://github.com/NGSolve/netgen.git
synced 2024-12-24 21:10:33 +05:00
csg2d - fix bug in getNonIntersectionVertex()
If a loop has no non-intersecting vertex, a new one is inserted -> set all vertex properties correctly (info, spline)
This commit is contained in:
parent
45059fa7af
commit
8b14f399c1
@ -1565,6 +1565,39 @@ Solid2d ClipSolids ( Solid2d && s1, Solid2d && s2, char op)
|
|||||||
return std::move(res);
|
return std::move(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vertex* Loop :: getNonIntersectionVertex()
|
||||||
|
{
|
||||||
|
for (Vertex* v : Vertices(ALL))
|
||||||
|
if (!v->is_intersection)
|
||||||
|
return(v);
|
||||||
|
|
||||||
|
// no non-intersection vertex found -> generate and return temporary vertex
|
||||||
|
for (Vertex* v : Vertices(ALL))
|
||||||
|
// make sure that edge from V to V->next is not collinear with other polygon
|
||||||
|
if ( (v->next->neighbour != v->neighbour->prev) && (v->next->neighbour != v->neighbour->next) )
|
||||||
|
{
|
||||||
|
// add edge midpoint as temporary vertex
|
||||||
|
if(v->spline)
|
||||||
|
{
|
||||||
|
auto p = v->spline->GetPoint(0.5);
|
||||||
|
auto s = *v->spline;
|
||||||
|
v->spline = Split(s, 0, 0.5);
|
||||||
|
auto vnew = v->Insert(p);
|
||||||
|
vnew->info = v->info;
|
||||||
|
vnew->spline = Split(s, 0.5, 1.0);
|
||||||
|
return vnew;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
auto p = Center(*v, *v->next);
|
||||||
|
auto vnew = v->Insert(p);
|
||||||
|
vnew->info = v->info;
|
||||||
|
return vnew;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
bool Loop :: IsInside( Point<2> r ) const
|
bool Loop :: IsInside( Point<2> r ) const
|
||||||
{
|
{
|
||||||
int w = 0;
|
int w = 0;
|
||||||
|
@ -29,10 +29,10 @@ enum IntersectionType
|
|||||||
T_INTERSECTION_Q,
|
T_INTERSECTION_Q,
|
||||||
T_INTERSECTION_P,
|
T_INTERSECTION_P,
|
||||||
V_INTERSECTION,
|
V_INTERSECTION,
|
||||||
X_OVERLAP,
|
X_OVERLAP, // Q0 -- P1 -- Q1 -- P0 (different direction)
|
||||||
T_OVERLAP_Q,
|
T_OVERLAP_Q, // same direction or P inside Q
|
||||||
T_OVERLAP_P,
|
T_OVERLAP_P, // same direction or Q inside P
|
||||||
V_OVERLAP
|
V_OVERLAP // one common point
|
||||||
};
|
};
|
||||||
|
|
||||||
enum IntersectionLabel
|
enum IntersectionLabel
|
||||||
@ -588,23 +588,7 @@ struct Loop
|
|||||||
//
|
//
|
||||||
// return and insert a non-intersection vertex
|
// return and insert a non-intersection vertex
|
||||||
//
|
//
|
||||||
Vertex* getNonIntersectionVertex()
|
Vertex* getNonIntersectionVertex();
|
||||||
{
|
|
||||||
for (Vertex* v : Vertices(ALL))
|
|
||||||
if (!v->is_intersection)
|
|
||||||
return(v);
|
|
||||||
|
|
||||||
// no non-intersection vertex found -> generate and return temporary vertex
|
|
||||||
for (Vertex* v : Vertices(ALL))
|
|
||||||
// make sure that edge from V to V->next is not collinear with other polygon
|
|
||||||
if ( (v->next->neighbour != v->neighbour->prev) && (v->next->neighbour != v->neighbour->next) )
|
|
||||||
{
|
|
||||||
// add edge midpoint as temporary vertex
|
|
||||||
auto p = Center(*v, *v->next);
|
|
||||||
return v->Insert(p);
|
|
||||||
}
|
|
||||||
return(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetBC(string bc)
|
void SetBC(string bc)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user