mirror of
https://github.com/NGSolve/netgen.git
synced 2024-12-24 21:10:33 +05:00
Mesh::Mirror()
This commit is contained in:
parent
a8a0b9d50b
commit
2f18c2b1f7
@ -6860,4 +6860,90 @@ namespace netgen
|
|||||||
if (surfelementht)
|
if (surfelementht)
|
||||||
surfelementht->PrintMemInfo (cout);
|
surfelementht->PrintMemInfo (cout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
shared_ptr<Mesh> Mesh :: Mirror ( netgen::Point<3> p_plane, Vec<3> n_plane )
|
||||||
|
{
|
||||||
|
Mesh & m = *this;
|
||||||
|
auto nm_ = make_shared<Mesh>();
|
||||||
|
Mesh & nm = *nm_;
|
||||||
|
nm = m;
|
||||||
|
|
||||||
|
Point3d pmin, pmax;
|
||||||
|
GetBox(pmin, pmax);
|
||||||
|
auto v = pmax-pmin;
|
||||||
|
double eps = v.Length()*1e-8;
|
||||||
|
|
||||||
|
auto onPlane = [&] (const MeshPoint & p) -> bool
|
||||||
|
{
|
||||||
|
auto v = p_plane-p;
|
||||||
|
auto l = v.Length();
|
||||||
|
if(l<eps) return true;
|
||||||
|
|
||||||
|
auto ret = fabs(v*n_plane)/l;
|
||||||
|
return fabs(v*n_plane) < eps;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto mirror = [&] (PointIndex pi) -> PointIndex
|
||||||
|
{
|
||||||
|
auto & p = m[pi];
|
||||||
|
|
||||||
|
auto v = p_plane-p;
|
||||||
|
auto l = v.Length();
|
||||||
|
if(l<eps)
|
||||||
|
return pi;
|
||||||
|
|
||||||
|
if(fabs(v*n_plane)/l < eps)
|
||||||
|
return pi;
|
||||||
|
|
||||||
|
auto new_point = p + 2*(v*n_plane)*n_plane;
|
||||||
|
return nm.AddPoint( new_point, p.GetLayer(), p.Type() );
|
||||||
|
};
|
||||||
|
|
||||||
|
Array<PointIndex, PointIndex> point_map;
|
||||||
|
point_map.SetSize(GetNP());
|
||||||
|
point_map = -1;
|
||||||
|
|
||||||
|
for(auto pi : Range(points))
|
||||||
|
point_map[pi] = mirror(pi);
|
||||||
|
|
||||||
|
for(auto & el : VolumeElements())
|
||||||
|
{
|
||||||
|
auto nel = el;
|
||||||
|
for(auto i : Range(el.GetNP()))
|
||||||
|
nel[i] = point_map[el[i]];
|
||||||
|
nm.AddVolumeElement(nel);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto ei : Range(SurfaceElements()))
|
||||||
|
{
|
||||||
|
auto & el = m[ei];
|
||||||
|
auto nel = el;
|
||||||
|
for(auto i : Range(el.GetNP()))
|
||||||
|
nel[i] = point_map[el[i]];
|
||||||
|
|
||||||
|
if(!(nel==el))
|
||||||
|
nm.AddSurfaceElement(nel);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto ei : Range(LineSegments()))
|
||||||
|
{
|
||||||
|
auto & el = LineSegments()[ei];
|
||||||
|
auto nel = el;
|
||||||
|
bool is_same = true;
|
||||||
|
|
||||||
|
for(auto i : Range(el.GetNP()))
|
||||||
|
{
|
||||||
|
auto pi = el[i];
|
||||||
|
nel[i] = point_map[pi];
|
||||||
|
if(point_map[pi]!=pi)
|
||||||
|
is_same = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!is_same)
|
||||||
|
nm.AddSegment(nel);
|
||||||
|
}
|
||||||
|
|
||||||
|
return nm_;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -923,6 +923,7 @@ namespace netgen
|
|||||||
NgArray<int> & segment_weights){ }
|
NgArray<int> & segment_weights){ }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
shared_ptr<Mesh> Mirror( netgen::Point<3> p, Vec<3> n );
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1150,6 +1150,7 @@ grow_edges : bool = False
|
|||||||
})
|
})
|
||||||
.def ("CalcTotalBadness", &Mesh::CalcTotalBad)
|
.def ("CalcTotalBadness", &Mesh::CalcTotalBad)
|
||||||
.def ("GetQualityHistogram", &Mesh::GetQualityHistogram)
|
.def ("GetQualityHistogram", &Mesh::GetQualityHistogram)
|
||||||
|
.def("Mirror", &Mesh::Mirror);
|
||||||
;
|
;
|
||||||
|
|
||||||
m.def("ImportMesh", [](const string& filename)
|
m.def("ImportMesh", [](const string& filename)
|
||||||
|
Loading…
Reference in New Issue
Block a user