Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
MeshLine.cpp
Go to the documentation of this file.
1/* This file is part of MoDELib, the Mechanics Of Defects Evolution Library.
2 *
3 *
4 * MoDELib is distributed without any warranty under the
5 * GNU General Public License (GPL) v2 <http://www.gnu.org/licenses/>.
6 */
7
8#ifndef model_MeshLine_cpp_
9#define model_MeshLine_cpp_
10
11#include <numbers>
12#include <cfloat>
13#include <map>
14#include <tuple>
15#include <vector>
16#include <Eigen/Dense>
17
18#include <MeshModule.h>
19#include <Polyhedron.h>
21#include <Polygon2D.h>
22
23namespace model
24{
25
26 template <int dim>
28 const VectorDim& lineP,
29 const VectorDim& lineD)
30 {
31 const double dNorm(lineD.norm());
32 if(dNorm<FLT_EPSILON)
33 {
34 throw std::runtime_error("Line direction has zero norm");
35 }
36 const VectorDim unitD(lineD/dNorm);
37 std::map<float,VectorDim> rootsMap;
38 for(const auto& region : mesh.regions())
39 {
40 for(const auto& face : region.second->faces())
41 {
42 const auto plane(face.second->asPlane());
43 PlaneLineIntersection<dim> pli(plane.P,plane.unitNormal,lineP,unitD);
45 {
46
47 const auto& faceHull(face.second->convexHull());
48 std::vector<Eigen::Matrix<double,dim-1,1>> localHull;
49 for(const auto& vtx : faceHull)
50 {
51 localHull.push_back(plane.localPosition(vtx->P0));
52 }
53 const int wn(Polygon2D::windingNumber(plane.localPosition(pli.P),localHull));
54 if(wn!=0)
55 {
56 const double u((pli.P-lineP).dot(unitD));
57 rootsMap.emplace(u,pli.P);
58 }
59 }
60 }
61 }
62 if(rootsMap.size()>=2)
63 {
64 return FiniteLineSegment<dim>(rootsMap.begin()->second,rootsMap.rbegin()->second);
65 }
66 else
67 {
68 throw std::runtime_error("FiniteLineSegment::getFiniteLineSegment failed ("+std::to_string(rootsMap.size())+" intersections)");
69 return FiniteLineSegment<dim>(VectorDim::Zero(),VectorDim::Zero());
70 }
71 }
72
73 template <int dim>
75 const VectorDim& lineP,
76 const VectorDim& lineD):
77 /* init */ FiniteLineSegment<dim>(getFiniteLineSegment(mesh,lineP,lineD))
78 {
79
80 }
81
82 template <int dim>
84 const Line<dim>& line):
85 /* init */ FiniteLineSegment<dim>(getFiniteLineSegment(mesh,line.P,line.d))
86 {
87
88 }
89
90 template struct MeshLine<3>;
91// template struct MeshLine<2>;
92
93}
94#endif
int regions
Definition triangle.cpp:696
FiniteLineSegment(const VectorDim &p0, const VectorDim &p1)
Eigen::Matrix< double, dim, 1 > VectorDim
Definition MeshLine.h:36
static FiniteLineSegment< dim > getFiniteLineSegment(const SimplicialMesh< dim > &mesh, const VectorDim &p, const VectorDim &d)
Definition MeshLine.cpp:27
MeshLine(const SimplicialMesh< dim > &mesh, const VectorDim &p, const VectorDim &d)
Definition MeshLine.cpp:74
static int windingNumber(const PointType &P, const std::vector< PointType > &V)
Definition Polygon2D.h:56
REAL u[4]