NeoPZ
pzplane.cpp
Go to the documentation of this file.
1 
6 #include "pzplane.h"
7 #include <numeric>
8 using namespace std;
9 void MatrixDet(REAL matrix[3][3], REAL &det);
10 REAL MatrixDet(REAL matrix[3][3]);
11 
13 }
15 }
16 
18 int TPZPlane::SetPlane(const TPZVec<REAL> &p1, const TPZVec<REAL> &p2,const TPZVec<REAL> &p3){
19  REAL matrix[3][3];
20  TPZVec<REAL> desloc1(3), desloc2(3);
21  TPZVec<REAL> aux(3);
22  int i ;
23 
24  for(i=0; i<3;i++){
25  desloc1[i] = p1[i]- p2[i];
26  desloc2[i] = p2[i]-p3[i];
27  }
28  TPZNumeric::ProdVetorial(desloc1, desloc2, aux);
29  REAL norm = inner_product(&aux[0], &aux[3], &aux[0], REAL(0.0));
30  if(norm <= 1e-10){
31  cerr << "TPZPlane::SetPlane - Erro: Pontos alinhados nao eh possivel determinar um unico plano\n";
32  return 0;
33  }
34  else{
35  for(i=0; i<3;i++){
36  matrix[0][0]=p1[i%3];
37  matrix[0][1]=p1[(i+1)%3];
38  matrix[1][0]=p2[i%3];
39  matrix[1][1]=p2[(i+1)%3];
40  matrix[2][0]=p3[i%3];
41  matrix[2][1]=p3[(i+1)%3];
42  matrix[i][2]=1.0;
43  MatrixDet(matrix, aux[i]);
44  }
45 
46  int ordem[3];
47  REAL vect[3];
48  TPZNumeric::SortArray3(aux,ordem);
49  i=ordem[0];
50 
51  matrix[0][0]=p1[i%3];
52  matrix[0][1]=p1[(i+1)%3];
53  matrix[1][0]=p2[i%3];
54  matrix[1][1]=p2[(i+1)%3];
55  matrix[2][0]=p3[i%3];
56  matrix[2][1]=p3[(i+1)%3];
57  vect[0]=-p1[(i+2)%3];
58  vect[1]=-p2[(i+2)%3];
59  vect[2]=-p2[(i+2)%3];
60 
61  REAL matrix2[3][3];
62  REAL sol[3];
63 
64  for(i=0; i<3;i++){
65  matrix2[0][i%3]=vect[0];
66  matrix2[1][i%3]=vect[1];
67  matrix2[2][i%3]=vect[2];
68  matrix2[0][(i+1)%3]=matrix[0][(i+1)%3];
69  matrix2[1][(i+1)%3]=matrix[1][(i+1)%3];
70  matrix2[2][(i+1)%3]=matrix[2][(i+1)%3];
71  matrix2[0][(i+2)%3]=matrix[0][(i+2)%3];
72  matrix2[1][(i+2)%3]=matrix[1][(i+2)%3];
73  matrix2[2][(i+2)%3]=matrix[2][(i+2)%3];
74 
75  sol[i]=MatrixDet(matrix2)/MatrixDet(matrix);
76  }
77  fCoef[(ordem[0])%3]=sol[0];
78  fCoef[(ordem[0]+1)%3]=sol[1];
79  fCoef[(ordem[0]+2)%3]= 1.0;
80  fCoef[3]=sol[2];
81  }
82  cout <<endl;
83  return 1;
84 }
85 
87 bool TPZPlane::Belongs(const TPZVec<REAL> &ponto){
88  REAL aux=0.0;
89  int i;
90 
91  for(i=0;i<3;i++){
92  aux = aux + ponto[i]*fCoef[i];
93  }
94  aux = aux + fCoef[3];
95  if(fabs(aux)<0.000009) {
96  return true;
97  }
98  else return false;
99 }
100 
102 bool TPZPlane::Belongs(const TPZVec<REAL> &ponto1, const TPZVec<REAL> &ponto2, const TPZVec<REAL> &ponto3){
103  int aux=0;
104  int i;
105  aux = aux + Belongs(ponto1);
106  aux = aux + Belongs(ponto2);
107  aux = aux + Belongs(ponto3);
108  TPZVec<REAL> aux1(3), aux2(3);
109  if(aux==3) {
111  //criando vetores de deslocalmentos entre pontos
112  for(i=0;i<3;i++) {
113  aux1[i]=100.*(ponto1[i]-ponto2[i]);
114  aux2[i]=100.*(ponto2[i]-ponto3[i]);
115  }
116  //verificando se os vetores de deslocamentos tem a mesma direção
117  aux=0;
118  TPZNumeric::ProdVetorial(aux1, aux2, aux1);
119  for(i=0;i<3;i++) {
120  if(fabs(aux1[i])<0.0000009) aux++;
121  }
122  if(aux==3) {
123  cout << "TPZPlane::Belongs(p1, p2, p3) - Warning: Os 3 pontos de entrada estao alinhados\n";
124  }
125  return true;
126  }
127  else return false;
128 }
129 
131 void MatrixDet(REAL matrix[3][3], REAL &det) {
132  det = MatrixDet(matrix);
133 }
134 
136 REAL MatrixDet(REAL matrix[3][3]) {
137  int i;
138  REAL aux = 0.0;
139  for(i=0; i<3; i++) {
140  aux = aux +(matrix[i%3][0]*matrix[(i+1)%3][1]*matrix[(i+2)%3][2])-(matrix[(i+2)%3][0]*matrix[(i+1)%3][1]*matrix[i%3][2]);
141  }
142  return aux;
143 }
~TPZPlane()
Destructor.
Definition: pzplane.cpp:14
expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ expr_ fabs
Definition: tfadfunc.h:140
int SetPlane(const TPZVec< REAL > &p1, const TPZVec< REAL > &p2, const TPZVec< REAL > &p3)
Computes the equation of the plane from three given points.
Definition: pzplane.cpp:18
TPZSkylMatrix< REAL > matrix
Definition: numatst.cpp:255
static void ProdVetorial(TPZVec< Tvar > &u, TPZVec< Tvar > &v, TPZVec< Tvar > &result)
Computes the vectorial product u x v.
Definition: pznumeric.cpp:96
TPZPlane()
Simple constructor.
Definition: pzplane.cpp:12
static void SortArray3(const TPZVec< Tvar > &array, int ordem[3])
Sorts in descending order, in absolute value and stores the indexes in ordem.
Definition: pznumeric.cpp:47
bool Belongs(const TPZVec< REAL > &point)
Check whether the point belongs at the plane.
Definition: pzplane.cpp:87
Contains declaration of the TPZPlane class which implements a plane.
void MatrixDet(REAL matrix[3][3], REAL &det)
Definition: pzplane.cpp:131