Flow123d  release_1.8.2-1603-g0109a2b
triangle.cpp
Go to the documentation of this file.
1 /*!
2  *
3  * Copyright (C) 2015 Technical University of Liberec. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU General Public License version 3 as published by the
7  * Free Software Foundation. (http://www.gnu.org/licenses/gpl-3.0.en.html)
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12  *
13  *
14  * @file triangle.cpp
15  * @brief
16  */
17 
18 #include "system/exc_common.hh"
20 
21 
22 
24 
27 }
28 
30  id = generateId();
31 
32  A1 = new TAbscissa();
33  A2 = new TAbscissa();
34  A3 = new TAbscissa();
35 
36  pl = new TPlain();
37 
38  area = 0;
39 }
40 
42  id = generateId();
43 
44  X1 = T.X1;
45  X2 = T.X2;
46  X3 = T.X3;
47 
48  update();
49 }
50 
51 TTriangle::TTriangle(const TPoint& P1, const TPoint& P2, const TPoint& P3) {
52  id = generateId();
53 
54  X1 = P1;
55  X2 = P2;
56  X3 = P3;
57 
58  update();
59 }
60 
61 
63  id = generateId();
64 
65  X1=TPoint(ele.node[0]->point()(0), ele.node[0]->point()(1), ele.node[0]->point()(2));
66  X2=TPoint(ele.node[1]->point()(0), ele.node[1]->point()(1), ele.node[1]->point()(2));
67  X3=TPoint(ele.node[2]->point()(0), ele.node[2]->point()(1), ele.node[2]->point()(2));
68 
69  update();
70 }
71 
73  A1 = new TAbscissa(X1, X2);
74  A2 = new TAbscissa(X2, X3);
75  A3 = new TAbscissa(X3, X1);
76 
77  pl = new TPlain(X1, X2, X3);
78 
79  ComputeArea();
80 }
81 
83  if (A1 != NULL) {
84  delete A1;
85  }
86  if (A2 != NULL) {
87  delete A2;
88  }
89  if (A3 != NULL) {
90  delete A3;
91  }
92 
93  if (pl != NULL) {
94  delete pl;
95  }
96 }
97 
98 const TPlain &TTriangle::GetPlain() const {
99  return *pl;
100 }
101 
102 const TAbscissa &TTriangle::GetAbscissa(const int i) const {
103  switch (i) {
104  case 1: return *A1;
105  break;
106  case 2: return *A2;
107  break;
108  case 3: return *A3;
109  break;
110  default:
111  THROW( ExcAssertMsg() << EI_Message( "Unknown number of the abscissa of the triangle.") );
112 
113  }
114 }
115 
116 const TPoint &TTriangle::GetPoint(int i) const {
117  switch (i) {
118  case 1: return X1;
119  break;
120  case 2: return X2;
121  break;
122  case 3: return X3;
123  break;
124  default: THROW( ExcAssertMsg() << EI_Message( "Unknown number of the point of the triangle.") );
125  }
126 }
127 
128 void TTriangle::SetPoints(const TPoint& P1, const TPoint& P2, const TPoint& P3) {
129  X1 = P1;
130  X2 = P2;
131  X3 = P3;
132 
133  A1->SetPoints(P1, P2);
134  A2->SetPoints(P2, P3);
135  A3->SetPoints(P3, P1);
136 
137  pl->SetPoints(P1, P2, P3);
138 
139  ComputeArea();
140 }
141 
143  TVector N = Cross(A1->GetVector(), A2->GetVector());
144  area = 0.5 * N.Length();
145 }
146 
148  return area;
149 }
150 
152  arma::vec3 minCoor;
153  arma::vec3 maxCoor;
154 
155  for (int i=0; i<3; ++i) {
156  minCoor(i) = GetMin(i+1);
157  maxCoor(i) = GetMax(i+1);
158  }
159 
160  boundingBox=BoundingBox(minCoor, maxCoor);
161  return boundingBox;
162 }
163 
164 double TTriangle::GetMin(int i) const {
165  double min = X1.Get(i);
166 
167  if (X2.Get(i) < min) {
168  min = X2.Get(i);
169  }
170  if (X3.Get(i) < min) {
171  min = X3.Get(i);
172  }
173 
174  return min;
175 }
176 
177 double TTriangle::GetMax(int i) const {
178  double max = X1.Get(i);
179 
180  if (X2.Get(i) > max) {
181  max = X2.Get(i);
182  }
183  if (X3.Get(i) > max) {
184  max = X3.Get(i);
185  }
186 
187  return max;
188 }
189 
191  area = t.area;
192 
193  *(*this).A1 = *t.A1;
194  *(*this).A2 = *t.A2;
195  *(*this).A3 = *t.A3;
196  *(*this).pl = *t.pl;
197  X1 = t.X1;
198  X2 = t.X2;
199  X3 = t.X3;
200 
201  return *this;
202 }
203 
204 bool TTriangle::IsInner(const TPoint& P) const {
205  TVector N1, N2, U1(X1, X2), U2(X2, X3), U3(X3, X1);
206  TVector Up1(X1, P), Up2(X2, P), Up3(X3, P);
207 
208  N1 = Cross(Up1, U1);
209  N2 = Cross(U1, U3);
210  if (Dot(N1, N2) < 0) {
211  return false;
212  }
213 
214  N1 = Cross(Up2, U2);
215  N2 = Cross(U2, U1);
216  if (Dot(N1, N2) < 0) {
217  return false;
218  }
219 
220  N1 = Cross(Up3, U3);
221  N2 = Cross(U3, U2);
222  if (Dot(N1, N2) < 0) {
223  return false;
224  }
225 
226  return true;
227 }
TAbscissa * A1
Definition: triangle.h:36
const TVector & GetVector() const
Definition: bisector.cpp:104
Bounding box in 3d ambient space.
Definition: bounding_box.hh:45
double GetMin(int) const
Definition: triangle.cpp:164
static int numberInstance
Definition: triangle.h:29
void SetPoints(const TPoint &, const TPoint &)
Definition: abscissa.cpp:65
void ComputeArea()
Definition: triangle.cpp:142
TPoint X2
Definition: triangle.h:33
void SetPoints(const TPoint &, const TPoint &, const TPoint &)
Definition: plain.cpp:154
TPoint X3
Definition: triangle.h:34
Node ** node
Definition: elements.h:78
Definition: plain.h:24
int generateId()
Definition: triangle.cpp:25
double GetArea()
Definition: triangle.cpp:147
TTriangle & operator=(const TTriangle &t)
Definition: triangle.cpp:190
TPoint X1
Definition: triangle.h:32
bool IsInner(const TPoint &) const
Definition: triangle.cpp:204
const TPoint & GetPoint(int) const
Definition: triangle.cpp:116
Definition: point.h:27
void SetPoints(const TPoint &, const TPoint &, const TPoint &)
Definition: triangle.cpp:128
~TTriangle()
Definition: triangle.cpp:82
TVector Cross(const TVector &, const TVector &)
Definition: vector.cpp:180
BoundingBox & get_bounding_box()
Definition: triangle.cpp:151
double Get(int) const
Definition: point.cpp:120
double GetMax(int) const
Definition: triangle.cpp:177
const TPlain & GetPlain() const
Definition: triangle.cpp:98
double Length() const
Definition: vector.cpp:157
double area
Definition: triangle.h:44
TAbscissa * A3
Definition: triangle.h:38
TAbscissa * A2
Definition: triangle.h:37
BoundingBox boundingBox
Definition: triangle.h:42
const TAbscissa & GetAbscissa(int) const
Definition: triangle.cpp:102
void update()
Definition: triangle.cpp:72
arma::vec3 & point()
Definition: nodes.hh:68
TPlain * pl
Definition: triangle.h:40
#define THROW(whole_exception_expr)
Wrapper for throw. Saves the throwing point.
Definition: exceptions.hh:44
double Dot(const TVector &, const TVector &)
Definition: vector.cpp:197