Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
PlanePlaneIntersection.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_PlanePlaneIntersection_CPP_
9#define model_PlanePlaneIntersection_CPP_
10
11#include <tuple>
12#include <map>
13#include <Eigen/Dense>
14#include <Eigen/Cholesky>
15#include <Plane.h>
16
17#include <iostream>
18#include<iomanip>
20
21namespace model
22{
23
24 /**********************************************************************/
25 template <int dim>
27 const VectorDimD& p1,
28 const VectorDimD& n1,
29 const VectorDimD& p2,
30 const VectorDimD& n2,
31 const double& tol)
32 {
33
34 // Check that segments C-p1 and C-p2 are orthogonal to n1 and n2, respectively
35 const double Cp1((C-p1).norm());
36 const double Cp2((C-p2).norm());
37 const bool Cp1OK((Cp1<tol)? true : fabs((C-p1).dot(n1))<tol*Cp1);
38 const bool Cp2OK((Cp2<tol)? true : fabs((C-p2).dot(n2))<tol*Cp2);
39 const bool success(Cp1OK && Cp2OK);
40 if(!success)
41 {
42 std::cout<<"PlanePlaneIntersection FAILED"<<std::endl;
43 std::cout<<std::setprecision(15)<<std::scientific<<"C="<<C.transpose()<<std::endl;
44 std::cout<<std::setprecision(15)<<std::scientific<<"p1="<<p1.transpose()<<std::endl;
45 std::cout<<std::setprecision(15)<<std::scientific<<"n1="<<n1.transpose()<<std::endl;
46 std::cout<<std::setprecision(15)<<std::scientific<<"p2="<<p2.transpose()<<std::endl;
47 std::cout<<std::setprecision(15)<<std::scientific<<"n2="<<n2.transpose()<<std::endl;
48 std::cout<<std::setprecision(15)<<std::scientific<<"Cp1="<<Cp1<<std::endl;
49 std::cout<<std::setprecision(15)<<std::scientific<<"Cp2="<<Cp2<<std::endl;
50 std::cout<<std::setprecision(15)<<std::scientific<<"tol="<<tol<<std::endl;
51 }
52
53 return success;
54 }
55
56 /**********************************************************************/
57 template <int dim>
59 const VectorDimD& N1,
60 const VectorDimD& p2,
61 const VectorDimD& N2,
62 const double& tol)
63 {
64
65 const double normN1(N1.norm());
66 const double normN2(N2.norm());
67 assert(normN1>tol);
68 assert(normN2>tol);
69
70 const VectorDimD n1(N1/normN1);
71 const VectorDimD n2(N2/normN2);
72 const VectorDimD D(n1.cross(n2));
73 const double normD(D.norm());
74
75 if(normD>tol)
76 {
77 // Find the Cartesian point P which minimizes (C-p1)^2+(C-p2)^2 under
78 // the constraints (C-p1)*n1=0 and (C-p2)*n2=0
79 Eigen::Matrix<double,dim+2,dim+2> M(Eigen::Matrix<double,dim+2,dim+2>::Zero());
80 M.template block<dim,dim>(0,0)=2.0*Eigen::Matrix<double,dim,dim>::Identity();
81 M.template block<dim,1>(0,dim+0)=n1;
82 M.template block<dim,1>(0,dim+1)=n2;
83 M.template block<1,dim>(dim+0,0)=n1.transpose();
84 M.template block<1,dim>(dim+1,0)=n2.transpose();
85
86 Eigen::Matrix<double,dim+2,1> b(Eigen::Matrix<double,dim+2,1>::Zero());
87 b.template segment<dim>(0)=p1+p2;
88 b(dim+0)=p1.dot(n1);
89 b(dim+1)=p2.dot(n2);
90
91 const VectorDimD C=M.ldlt().solve(b).template segment<dim>(0);
92 assert(checkIntersection(C,p1,n1,p2,n2,tol) && "PlanePlaneIntersection FAILED.");
93
94 return std::make_tuple(INCIDENT,C,D/normD);
95 }
96 else
97 {
98 if(fabs((p1-p2).dot(n1))<tol)
99 {// coincident planes
100 return std::make_tuple(COINCIDENT,0.5*(p1+p2),VectorDimD::Zero());
101 }
102 else
103 {// paralle planes
104 return std::make_tuple(PARALLEL,0.5*(p1+p2),VectorDimD::Zero());
105 }
106 }
107 }
108
109 /**********************************************************************/
110 template <int dim>
112 const VectorDimD& n1,
113 const VectorDimD& p2,
114 const VectorDimD& n2,
115 const double& tolerance) :
116 /* init */ sol(findIntersection(p1,n1,p2,n2,tolerance)),
117 /* init */ type(std::get<0>(sol)),
118 /* init */ P(std::get<1>(sol)),
119 /* init */ d(std::get<2>(sol))
120 {
121 }
122
123 /**********************************************************************/
124 template <int dim>
126 const Plane<dim>& plane1,
127 const double& tolerance) :
128 /* init */ sol(findIntersection(plane0.P,plane0.unitNormal,plane1.P,plane1.unitNormal,tolerance)),
129 /* init */ type(std::get<0>(sol)),
130 /* init */ P(std::get<1>(sol)),
131 /* init */ d(std::get<2>(sol))
132 {
133 }
134
135 template struct PlanePlaneIntersection<3>;
136
137}
138#endif
Eigen::Matrix3d M
b
Definition int_R.m:16
static SolutionType findIntersection(const VectorDimD &p1, const VectorDimD &N1, const VectorDimD &p2, const VectorDimD &N2, const double &tol)
PlanePlaneIntersection(const VectorDimD &p1, const VectorDimD &n1, const VectorDimD &p2, const VectorDimD &n2, const double &tolerance=FLT_EPSILON)
std::tuple< IntersectionType, VectorDimD, VectorDimD > SolutionType
Eigen::Matrix< double, dim, 1 > VectorDimD
static bool checkIntersection(const VectorDimD &C, const VectorDimD &p1, const VectorDimD &n1, const VectorDimD &p2, const VectorDimD &n2, const double &tol)
vertex p2
REAL D[16]
vertex p1
enum insertvertexresult success