Points&Forces (survey)
Software tools facilitating the task of surveying architecture
a_block_2d5.cxx
Go to the documentation of this file.
1 /*
2 Copyright 2016 Pierre SMARS (smars@yuntech.edu.tw)
3 This program is free software: you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation, either version 2 of the License, or
6 (at your option) any later version.
7 
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12 
13 You should have received a copy of the GNU General Public License
14 along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16 #include "a_block_2d5.h"
17 #include "a_face_2d4.h"
18 #include "a_triangle.h"
19 #define DE(x) std::cerr << #x << ": " << x << std::endl;
20 //---------------------------------------------------------------------------
21 a_block_2d5 * cb_2d5(a_block * b) {return dynamic_cast<a_block_2d5*>(b); }
22 
23 //---------------------------------------------------------------------------
24 void a_block_2d5::create_faces()
25 {
26  //create the 5 faces
27  int r0 = 0;
28  for (int i=0; i<5; i++)
29  {
30  a_face_2d4 * f = new a_face_2d4(this,i);
31  this->ai(f);
32  f->av(r0++);
33  f->av(r0%5);
34  }
35 }
36 //---------------------------------------------------------------------------
38 {
39  thickness_ = new double;
40  *thickness_ = 1.;
41  this->create_faces();
42 }
43 //---------------------------------------------------------------------------
45 {
46  //faces and vertices are erased in parent
47  delete thickness_;
48 }
49 //---------------------------------------------------------------------------
51 a_block_2d5::a_block_2d5(a_point* p1, a_point* p2, a_point* p3, a_point* p4, a_point* p5, double thickness) : a_block()
52 {
53  thickness_ = new double;
55  //assign the vertices
56  this->av(p1);
57  this->av(p2);
58  this->av(p3);
59  this->av(p4);
60  this->av(p5);
61  this->create_faces();
62 }
63 //---------------------------------------------------------------------------
64 const std::string a_block_2d5::help()
65 {
66  std::ostringstream o;
67  o << "*************" << std::endl;
68  o << "a_block_2d5:" << std::endl;
69  o << "*************" << std::endl;
70  o << "a_block_2d5 is a special type of a_block, a class used to model the blocks of a 'a_structure' (see a_structure_help for more information)" << std::endl;
71  o << "It is a pentagonal prism (a polyhedron with 7 faces: 2 parallel pentagonal faces and 5 rectangular faces joining them)." << std::endl;
72  o << "The geometry of a block is defined by the 5 points defining the pentagonal middle surface and the thickness of the block." << std::endl;
73  o << "The points used to define the geometry of the block could be directly the coordinates of the corners of the block in a world (or global) coordinate system." << std::endl;
74  o << "In practice, it is more convenient to define the geometry of the block in a local coordinate system, possibly rotate it, and then to move it in its final position." << std::endl;
75  o << "Commands:" << std::endl;
76  o << "--------" << std::endl;
77  o << "a_block_2d5 B 'p1' 'p2' 'p3' 'p4' 'p5' 't': create a block named B" << std::endl;
78  o << " 'pi' are points (a_point) defining the shape of the block" << std::endl;
79  o << " 't' is the thickness of the block (default: 1.0)" << std::endl;
80  o << "thickness 'val': set the constant thickness of the block" << std::endl;
81  o << "thickness: gets the thickness of the block" << std::endl;
82  o << "normal: normal to the definition plan of the block (world coordinates)" << std::endl;
83  o << "normall: gets normal to the definition plan of the block (local coordinates)" << std::endl;
84  o << a_block::help();
85  return o.str();
86 }
87 //---------------------------------------------------------------------------
89 {
90  a_block::copy(b);
91  //in a copy, the thickness pointers should be different
92  //but their values should be the same
93  *thickness_ = b.thickness();
94 }
95 //---------------------------------------------------------------------------
97 {
99  //in a deep copy, the thickness pointers should be the same
100  //and consquently, their values will be the same
101  //as the block has already a pointer
102  //this original pointer should first be deallocated
103  delete thickness_;
104  thickness_ = b.thickness_p();
105 }
106 //---------------------------------------------------------------------------
107 a_point a_block_2d5::v3d(const int i) const
108 {
109  a_point n = this->normal();
110  n *= this->thickness()/2.;
111  int r = i%10;
112  if (r<5)
113  return *pos_*(*v(r))-n;
114  return *pos_*(*v(r-5))+n;
115 }
116 //---------------------------------------------------------------------------
117 a_point a_block_2d5::cl() const
118 {
119  a_triangle t1(*v(0),*v(1),*v(2));
120  a_triangle t2(*v(0),*v(2),*v(3));
121  a_triangle t3(*v(0),*v(3),*v(4));
122  double s1 = t1.S();
123  double s2 = t2.S();
124  double s3 = t3.S();
125  a_point c1 = t1.c();
126  a_point c2 = t2.c();
127  a_point c3 = t3.c();
128  return (c1*s1+c2*s2+c3*s3)/(s1+s2+s3);
129 }
130 //---------------------------------------------------------------------------
131 double a_block_2d5::V() const
132 {
133  a_triangle t1(*v(0),*v(1),*v(2));
134  a_triangle t2(*v(0),*v(2),*v(3));
135  a_triangle t3(*v(0),*v(3),*v(4));
136  double s1 = t1.S();
137  double s2 = t2.S();
138  double s3 = t3.S();
139  return (s1+s2+s3)*this->thickness();
140 }
141 //---------------------------------------------------------------------------
142 a_point a_block_2d5::normall() const
143 {
144  a_point d1 = *v(1)-*v(0);
145  a_point d2 = *v(4)-*v(0);
146  return cross(d1,d2).normalise();
147 }
148 //---------------------------------------------------------------------------
149 a_point a_block_2d5::normal() const
150 {
151  //attention passage to world coordinate also translate...
152  return (*pos_)*(this->normall())-pos_->p2();
153 }
154 /*
155 //---------------------------------------------------------------------------
156 void a_block_2d5::compute()
157 {}
158 */
159 //---------------------------------------------------------------------------
160 void a_block_2d5::read(std::istream &in)
161 {
162  a_block::read(in);
163  double thickness;
164  in >> thickness;
165  this->thickness(thickness);
166 }
167 //---------------------------------------------------------------------------
168 void a_block_2d5::write(std::ostream &o) const
169 {
170  a_block::write(o);
171  o << this->thickness() << std::endl;
172 }
173 //---------------------------------------------------------------------------
174 void a_block_2d5::writetri(std::ostream &o) const
175 {
176  a_trianglecloud tri;
177  this->trianglecloud(tri);
178  tri.write(o);
179  tri.clear();
180 }
181 //---------------------------------------------------------------------------
182 void a_block_2d5::writeb(std::ostream &o) const
183 {
184  a_point n = this->normal()*(this->thickness()/2.);
185  o << "a_block_2d5(";
186  for (int i=0; i<this->nv(); i++)
187  {
188  a_point p0 = (*pos_)*(*this->v(i));
189  for (int j=0; j<4; j++)
190  o << (p0+n)[j] << ",";
191  }
192  for (int i=0; i<this->nv(); i++)
193  {
194  a_point p0 = (*pos_)*(*this->v(i));
195  if (i!=this->nv()-1)
196  {
197  for (int j=0; j<4; j++)
198  o << (p0-n)[j] << ",";
199  }
200  else
201  o << (p0-n)[0] << "," << (p0-n)[1] << "," << (p0-n)[2] << ")";
202  }
203 }
204 //---------------------------------------------------------------------------
205 void a_block_2d5::writeg(std::ostream &o) const
206 {
207  a_point n = this->normal()*(this->thickness()/2.);
208  o << "arb8 ";
209  for (int i=0; i<this->nv(); i++)
210  {
211  a_point p0 = (*pos_)*(*this->v(i));
212  o << p0+n << " ";
213  }
214  for (int i=0; i<this->nv(); i++)
215  {
216  a_point p0 = (*pos_)*(*this->v(i));
217  o << p0-n << " ";
218  }
219 }
220 //---------------------------------------------------------------------------
221 void a_block_2d5::writefaces(std::ostream &o, const int base = 0) const
222 {
223  o << base+0 << " " << base+2 << " " << base+1 << std::endl;
224  o << base+0 << " " << base+3 << " " << base+2 << std::endl;
225  o << base+0 << " " << base+4 << " " << base+3 << std::endl;
226  o << base+0 << " " << base+1 << " " << base+5 << std::endl;
227  o << base+1 << " " << base+6 << " " << base+5 << std::endl;
228  o << base+1 << " " << base+2 << " " << base+6 << std::endl;
229  o << base+2 << " " << base+7 << " " << base+6 << std::endl;
230  o << base+2 << " " << base+3 << " " << base+7 << std::endl;
231  o << base+3 << " " << base+8 << " " << base+7 << std::endl;
232  o << base+3 << " " << base+4 << " " << base+8 << std::endl;
233  o << base+4 << " " << base+9 << " " << base+8 << std::endl;
234  o << base+4 << " " << base+0 << " " << base+9 << std::endl;
235  o << base+0 << " " << base+5 << " " << base+9 << std::endl;
236  o << base+5 << " " << base+6 << " " << base+7 << std::endl;
237  o << base+5 << " " << base+7 << " " << base+8 << std::endl;
238  o << base+5 << " " << base+8 << " " << base+9 << std::endl;
239 }
240 //---------------------------------------------------------------------------
241 void a_block_2d5::trianglecloud(a_trianglecloud& tri) const
242 {
243  tri.addtriangle(this->v3d(0),this->v3d(2),this->v3d(1));
244  tri.addtriangle(this->v3d(0),this->v3d(3),this->v3d(2));
245  tri.addtriangle(this->v3d(0),this->v3d(4),this->v3d(3));
246  tri.addtriangle(this->v3d(0),this->v3d(1),this->v3d(5));
247  tri.addtriangle(this->v3d(1),this->v3d(6),this->v3d(5));
248  tri.addtriangle(this->v3d(1),this->v3d(2),this->v3d(6));
249  tri.addtriangle(this->v3d(2),this->v3d(7),this->v3d(6));
250  tri.addtriangle(this->v3d(2),this->v3d(3),this->v3d(7));
251  tri.addtriangle(this->v3d(3),this->v3d(8),this->v3d(7));
252  tri.addtriangle(this->v3d(3),this->v3d(4),this->v3d(8));
253  tri.addtriangle(this->v3d(4),this->v3d(9),this->v3d(8));
254  tri.addtriangle(this->v3d(4),this->v3d(0),this->v3d(9));
255  tri.addtriangle(this->v3d(0),this->v3d(5),this->v3d(9));
256  tri.addtriangle(this->v3d(5),this->v3d(6),this->v3d(7));
257  tri.addtriangle(this->v3d(5),this->v3d(7),this->v3d(8));
258  tri.addtriangle(this->v3d(5),this->v3d(8),this->v3d(9));
259 }
a_block_2d5 * cb_2d5(a_block *b)
Definition: a_block_2d5.cxx:21
void writefaces(std::ostream &o, const int base) const
write a triangle file description of the block
double thickness() const
get block thickness
Definition: a_block_2d5.h:39
virtual a_point cl() const
centre of gravity of the face (local coordinate system)
virtual void writeb(std::ostream &o) const
write a blender description of the block
virtual void write(std::ostream &o) const
void thickness(const double thickness)
set block thickness
Definition: a_block_2d5.h:37
a_point v3d(const int i) const
get vertex (world coordinate, 3D: 10 points: order v0-n, v0+n, v1+n, v1-n
a_point normall() const
normal to the definition plan of the block (local coordinates)
a_point normal() const
normal to the definition plan of the block (world coordinates)
virtual void copy(const a_block_2d5 &)
copy the block. do not create new edges
Definition: a_block_2d5.cxx:88
double * thickness_p() const
get block thickness pointer
Definition: a_block_2d5.h:41
virtual void deepcopy(const a_block_2d5 &)
copy the block. create new edges
Definition: a_block_2d5.cxx:96
double * thickness_
Definition: a_block_2d5.h:67
virtual void read(std::istream &i)
input/output
static const std::string help()
get information about the class
Definition: a_block_2d5.cxx:64
virtual void writetri(std::ostream &o) const
write a triangle face representation of the block
virtual void writeg(std::ostream &o) const
write a brlcad description of the block
double V() const
volume of the block
void trianglecloud(a_trianglecloud &) const
static const std::string help()
get information about the class
Definition: a_block.cxx:46
virtual void copy(const a_block &)
Definition: a_block.cxx:99
virtual void write(std::ostream &o) const
Definition: a_block.cxx:473
void av(a_point *vertex)
add a vertex
Definition: a_block.h:87
std::vector< int > in() const
return inside faces
Definition: a_block.cxx:373
a_twist * pos_
Definition: a_block.h:146
a_face * i(const int i)
get pointer to face
Definition: a_block.cxx:148
void ai(a_face *face)
add a face
Definition: a_block.h:89
a_point * v(const int i)
get pointer to vertex
Definition: a_block.cxx:134
virtual void deepcopy(const a_block &)
Definition: a_block.cxx:110
virtual void read(std::istream &i)
input/output
Definition: a_block.cxx:449
int nv() const
get number of vertices
Definition: a_block.h:79
void av(int ref)
add a vertex reference
Definition: a_face.h:43
a_point p2() const
Definition: a_plucker.h:42