18 #include "a_triangle.h"
19 #define DE(x) std::cerr << #x << ": " << x << std::endl;
24 void a_block_2d5::create_faces()
28 for (
int i=0;
i<5;
i++)
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;
109 a_point n = this->
normal();
113 return *
pos_*(*
v(r))-n;
114 return *
pos_*(*
v(r-5))+n;
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));
128 return (c1*s1+c2*s2+c3*s3)/(s1+s2+s3);
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));
144 a_point d1 = *
v(1)-*
v(0);
145 a_point d2 = *
v(4)-*
v(0);
146 return cross(d1,d2).normalise();
186 for (
int i=0;
i<this->
nv();
i++)
188 a_point p0 = (*pos_)*(*this->
v(
i));
189 for (
int j=0; j<4; j++)
190 o << (p0+n)[j] <<
",";
192 for (
int i=0;
i<this->
nv();
i++)
194 a_point p0 = (*pos_)*(*this->
v(
i));
197 for (
int j=0; j<4; j++)
198 o << (p0-n)[j] <<
",";
201 o << (p0-n)[0] <<
"," << (p0-n)[1] <<
"," << (p0-n)[2] <<
")";
209 for (
int i=0;
i<this->
nv();
i++)
211 a_point p0 = (*pos_)*(*this->
v(
i));
214 for (
int i=0;
i<this->
nv();
i++)
216 a_point p0 = (*pos_)*(*this->
v(
i));
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;
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));
a_block_2d5 * cb_2d5(a_block *b)
void writefaces(std::ostream &o, const int base) const
write a triangle file description of the block
double thickness() const
get block thickness
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
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
double * thickness_p() const
get block thickness pointer
virtual void deepcopy(const a_block_2d5 &)
copy the block. create new edges
virtual void read(std::istream &i)
input/output
static const std::string help()
get information about the class
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
virtual void copy(const a_block &)
virtual void write(std::ostream &o) const
void av(a_point *vertex)
add a vertex
std::vector< int > in() const
return inside faces
a_face * i(const int i)
get pointer to face
void ai(a_face *face)
add a face
a_point * v(const int i)
get pointer to vertex
virtual void deepcopy(const a_block &)
virtual void read(std::istream &i)
input/output
int nv() const
get number of vertices
void av(int ref)
add a vertex reference