MIDAS  0.75
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Friends Macros
compgeom.cpp
Go to the documentation of this file.
1 #include "compgeom.h"
2 
3 #include "point.h"
4 
5 #include "geometrylib.h"
6 
7 #include <math.h>
8 
9 
10 namespace midaspace {
11 
14 {
15  initialized = true;
16 
17  const GPA<const Point> *points = owner->give_points();
18 
19  int i;
20 
21  // centrcoord
22  centrcoord.copy(points[0][0]->give_coords());
23  for (i=1; i<points[0](); i++) centrcoord.add(points[0][i]->give_coords());
24  centrcoord.dvd(points[0]());
25 
26  double d;
27  // circum
28  circum = 0.0;
29  for (i=0; i<points[0](); i++) {
30  d = centrcoord.dist2_to(points[0][i]->give_coords());
31  if (circum < d)
32  circum = d;
33  }
34  circum = (1.0 + ZERO) * sqrt(circum);
35 }
36 
37 
42 {
44 
45  const GPA<const Point> *points = owner->give_points();
46 
47  if (points[0]() == 2) lav = points[0][0]->give_coords()->dist_to(points[0][1]->give_coords());
48  else _errorr ("Unsupported number of nodes on 1d element.");
49 }
50 
52 {
54 
55  const GPA<const Point> *points = owner->give_points();
56 
57  lav = 0.0;
58 
59  for (int i=1; i<nv; i++)
60  lav += points[0][i-1]->give_coords()->dist_to(points[0][i]->give_coords());
61 }
62 
65 { nv = owner->give_nno(); }
66 
69 {
71  if (owner->give_nno() != nv) errol;
72 }
73 
75 
76 
82 { nv = owner->give_nno(); }
83 
86 {
88  if (owner->give_nno() != nv) errol;
89 }
90 
93 {
95 
96  const GPA<const Point> *points = owner->give_points();
97 
98  // normal vector
99  if (nv == 4) normal.beVectProduct (points[0][0]->give_coords(), points[0][2]->give_coords(), points[0][1]->give_coords(), points[0][3]->give_coords());
100  else normal.beVectProduct (points[0][0]->give_coords(), points[0][1]->give_coords(), points[0][2]->give_coords());
101 
102  // check collapse
103  double l = normal.give_length();
104  if (!owner->give_Pd()->give_PDBO(PDBO_MultipElem) && l < circum * circum * zero)
105  _warningg2("collapsed 2d element %ld", owner->give_ID()+1);
106 
110  double d = -1 * normal.giveScalProduct (points[0][0]->give_coords());
111  double dist;
112 
113  //double zero_prec = zero; //
114  //double zero_prec = 1e-8; // docasne, kvuli presnosti t3d
115  for (int i=3; i<nv; i++) {
116  dist = (normal.giveScalProduct(points[0][i]->give_coords()) + d) / l;
117  if (dist < -1 * circum * zero || circum * zero < dist)
118  _errorr3("point %ld is not in plane of element %ld", i+1, owner->give_ID()+1);
119  }
120 
121  if (nv <= 4) lav = 0.5 * l;
122  else {
123  const PoinT **pointss = new const PoinT*[nv+2];
124 
125  for (int i=0; i<nv; i++) pointss[i] = points[0][i]->give_coords();
126  pointss[nv ] = points[0][0]->give_coords();
127  pointss[nv+1] = points[0][1]->give_coords();
128 
129  VectoR norm;
130  norm.copy(&normal)->normalize();
131 
132  lav = area3D_Polygon (nv, pointss, &norm);
133 
134  // oprava smeru normaly u konkavniho polygonu
135  const Element *elem = dynamic_cast<Element*>(owner);
136  if (!elem) {
137  Face *face = dynamic_cast<Face*>(owner);
138  if (!face) errol;
139  elem = face->give_main_masterel_uniq();
140  }
141  if (elem) {
142  const LCS_beam *llccss = elem->give_elemAttribs()->give_lcs_global();
143  if (llccss) {
144  const Elem3D* vect = llccss->give_vector();
145  if (!norm.is_identical_to (vect, 0.000001)) { norm.tms(-1.0); normal.tms(-1.0); }
146  if (!norm.is_identical_to (vect, 0.000001))
147  errol;
148  }
149  }
150  else errol;
151 
152  delete [] pointss;
153  }
154 }
155 
158 {
159  if (lcs) return lcs;
160 
161  //
162  const GPA<const Point> *points = owner->give_points();
163 
164  // normal vector
165  //lcs->v1.beVectProduct (points[0][0]->give_coords(), points[0][1]->give_coords(), points[0][2]->give_coords());
166  VectoR v1, v2, v3;
167 
168  v1.beP2P( points[0][0]->give_coords(), points[0][1]->give_coords() );
169  v2.beP2P( points[0][1]->give_coords(), points[0][2]->give_coords() );
170 
171  v3.beVectProduct( &v1, &v2 );
172  v2.beVectProduct( &v3, &v1 );
173 
174  v1.normalize();
175  v2.normalize();
176  v3.normalize();
177 
178  lcs = new LCS_pure;
179  lcs->set_n1(&v1);
180  lcs->set_n2(&v2);
181  lcs->set_n3(&v3);
182 
183  return lcs;
184 }
185 
186 
187 
192 {
194 
196  const GPA<const Point> *points = owner->give_points();
197 
198  const PoinT *c1 = points[0][0]->give_coords();
199  const PoinT *c2 = points[0][1]->give_coords();
200  const PoinT *c3 = points[0][2]->give_coords();
201  const PoinT *c4 = points[0][3]->give_coords();
202 
203  Dmtrx m(3,3);
204 
205  m(0,0) = c1->x - c4->x; m(0,1) = c2->x - c4->x; m(0,2) = c3->x - c4->x;
206  m(1,0) = c1->y - c4->y; m(1,1) = c2->y - c4->y; m(1,2) = c3->y - c4->y;
207  m(2,0) = c1->z - c4->z; m(2,1) = c2->z - c4->z; m(2,2) = c3->z - c4->z;
208 
209  lav = m.give_determinant() / 6.0;
210  if (lav < 0.0) errol;
211 }
214 {
216 
217  const GPA<const Point> *points = owner->give_points();
218 
219  int i;
220  Dvctr x(8),y(8),z(8);
221 
222  //
223  for (i=0; i<8; i++) {
224  x[i] = points[0][i]->give_coord(0);
225  y[i] = points[0][i]->give_coord(1);
226  z[i] = points[0][i]->give_coord(2);
227  }
228 
229  // jac je zatim na sifel cislovani uzlu !!!!!!!!!
230  jac_3d (lav, x, y, z, 0,0,0);
231 
232  lav *= -8.0;
233 }
234 
235 } // namespace midaspace
const Elem3D * give_vector(void) const
Definition: taux.h:264
virtual void initialize(void)
initiate/sets data
Definition: compgeom.cpp:13
bool give_PDBO(ProbDescBoolOpt pdbo) const
Definition: problem.h:187
VectoR * normalize(void)
Definition: arrays.h:185
double dist2_to(const PoinT *p) const
Definition: arrays.h:102
ComponentGeometry1Dpoly(Cell *o, double Z)
CONSTRUCTOR.
Definition: compgeom.cpp:64
bool is_identical_to(const Elem3D *p, double zero) const
Definition: arrays.h:55
#define ZERO
Definition: alias.h:51
virtual void initialize(void)
initiate/sets data
Definition: compgeom.cpp:41
virtual void initialize(void)
initiate/sets data
Definition: compgeom.cpp:92
const LCS_beam * give_lcs_global(void) const
Definition: attribute.h:850
Geometry components.
Point.
virtual void checkConsistency(void) const
Checks data consistency.
Definition: compgeom.h:50
Geometry functions.
long give_ID() const
Definition: subject.h:45
#define errol
Definition: gelib.h:142
double give_length(void) const
Definition: arrays.h:188
double give_determinant(void) const
Definition: arrays.cpp:797
virtual void checkConsistency(void) const
Checks data consistency.
Definition: compgeom.cpp:85
virtual void checkConsistency(void) const
Checks data consistency.
Definition: compgeom.cpp:68
Local coordinate system at beam element.
Definition: taux.h:235
const Element * give_main_masterel_uniq(void) const
main masterel is Element (not Facedge) with same dimension as face/edge
Definition: cell.cpp:367
const Problem * give_Pd(void) const
Definition: subject.h:48
*** *** *** *** CLASS ComponentGeometry 1D *** *** *** ***
Definition: compgeom.h:76
void set_n2(const VectoR *src)
Definition: taux.h:196
virtual void initialize(void)
initiate/sets data
Definition: compgeom.cpp:213
Elem3D * tms(double val)
Definition: arrays.h:59
#define _warningg2(_1, _2)
Definition: gelib.h:157
VectoR * beVectProduct(const VectoR *v1, const VectoR *v2)
vector product v1 x v2 (cross product)
Definition: arrays.h:160
ElemAttribs * give_elemAttribs(void)
Definition: cell.h:402
const GPA< const Point > * give_points(void) const
Definition: cell.h:97
GPA - Generic Pointer Array, template class manages 1d array of pointers to objects of type T...
Definition: gpa.h:23
#define _errorr(_1)
Definition: gelib.h:151
#define _errorr3(_1, _2, _3)
Definition: gelib.h:146
virtual void initialize(void)
initiate/sets data
Definition: compgeom.cpp:51
Elem3D * add(const Elem3D *p)
Definition: arrays.h:61
void set_n1(const VectoR *src)
Definition: taux.h:195
virtual const LCS_pure * give_lcs(void)
Definition: compgeom.cpp:157
virtual void initialize(void)
initiate/sets data
Definition: compgeom.cpp:191
VectoR * beP2P(const PoinT *p1, const PoinT *p2)
Receiver is set to vector from p1 to p2, i.e. 'this = p2 - p1'.
Definition: arrays.h:153
Local coordinate system defined by 2 vectors.
Definition: taux.h:179
long give_nno(void) const
Definition: cell.h:89
void reset_nv(void)
DYNAMIC.
Definition: compgeom.cpp:74
*** *** *** *** CLASS ComponentGeometry *** *** *** ***
Definition: compgeom.h:22
ComponentGeometry2D(Cell *o, double Z)
CONSTRUCTOR.
Definition: compgeom.cpp:81
double giveScalProduct(const Elem3D *v) const
scalar product this * e
Definition: arrays.h:80
Elem3D * dvd(double val)
Definition: arrays.h:60
PoinT * copy(const PoinT *p)
Definition: arrays.h:99
VectoR * copy(const VectoR *p)
Definition: arrays.h:150
double area3D_Polygon(int n, const PoinT **V, const VectoR *N)
************************** WWW.SOFTSURFER.COM ALGORITHMS ************************** Copyright 2000...
void set_n3(const VectoR *src)
Definition: taux.h:197
void jac_3d(double &jac, Dvctr &x, Dvctr &y, Dvctr &z, double xi, double eta, double zeta)