Flow123d  release_2.2.0-914-gf1a3a4f
compute_intersection.hh
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 compute_intersection.hh
15  * @brief Fundamental simplicial intersections.
16  * @author Viktor Fris, Pavel Exner
17  *
18  * Contains classes that compute the fundamental intersection of simplical objects:
19  * 1D-2D, 2D-2D, 1D-3D, 2D-3D
20  *
21  *
22  * TODO: Idea: constructor creates empty object; for each abscissa and triangle only update data
23  * [abscissa, triangle] and (plucker coordinates, products) if not final dimension.
24  * Remove init() methods.
25  * Wouldn't a flag for final dimension object help code structure?
26  *
27  * TODO: 2D-2D and 2D-3D (creating final objects) seems to not need functions for sequence:
28  * ComputeIntersection() -remove default
29  * init() - make private, call in constructor
30  * set_data() - remove, use only proper constructor
31  * compute () - can be called in constructor, but keep it in the same fashion as in other classes
32  *
33  */
34 
35 #ifndef COMPUTE_INTERSECTION_H_
36 #define COMPUTE_INTERSECTION_H_
37 
38 #include "simplex.hh"
39 #include "system/system.hh"
40 #include "mesh/ref_element.hh"
42 
43 // forward declare
44 class Mesh;
45 template<class A, class B> class ComputeIntersection;
46 class Plucker;
47 template<unsigned int, unsigned int> class IntersectionAux;
48 template<unsigned int, unsigned int> class IntersectionPointAux;
49 
50 /// Auxiliary value for Plucker product. If equal this value, it is supposed not to be set yet.
51 static const double plucker_empty = std::numeric_limits<double>::infinity();
52 
53 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
54 // CLASS FOR 1D - 2D
55 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
56 
57 /**
58  *
59  * @brief Class for 1D-2D intersections.
60  *
61  * Computes the intersection of an abscissa and a triangle.
62  * Can be used both as sub-algorithm to higher dimnesional intersection
63  * and also for 1D-2D intersection as a result.
64  */
65 template<> class ComputeIntersection<Simplex<1>, Simplex<2>> {
66 public:
67 
68  /// Default constructor. Use when this is NOT final intersection object.
70  /** @brief Constructor, sets abscissa and triangle object.
71  * Use when this is final intersection object.
72  * It allocates memory, computes plucker coordinates and products.
73  */
74  ComputeIntersection(Simplex<1> &abscissa, Simplex<2> &triangle, Mesh *mesh);
76 
77  /** @brief Computes intersection points of line and triangle.
78  *
79  * If Plucker products are non-zero and with the same sign, then IP is inside the triangle.
80  * If some of the Plucker products are zero:
81  * 1 zero product -> IP is on the triangle side
82  * 2 zero products -> IP is at the vertex of triangle (there is no other IP)
83  * 3 zero products: -> line and triangle are coplanar
84  *
85  * IP is intersection of triangle and whole line (bisector).
86  * @param IP12s - input/output vector of IPs. If IP found, it is pushed back. Should be empty on start.
87  * @return Orientation flag (0,1 sign of product if get intersection, 2 - three zero products (degenerated),
88  * 3 - no intersection
89  *
90  * NOTE: Why this is not done in constructor?
91  * Because default constructor is called in 1d-3d, 2d-3d and compute() is called later.
92  */
94 
95  /** Computes final 1d-2d intersection. (Use when this is the resulting dimension object).
96  * @param IP12s input/output vector of IPs. If IP found, it is pushed back. Should be empty on start.
97  * @return number of intersection points found
98  */
99  unsigned int compute_final(std::vector<IntersectionPointAux<1,2>> &IP12s);
100 
101  /// @name Setters and Getters
102  //@{
103  /** @brief Sets the abscissa and triangle.
104  *
105  * Use mostly when this is not final intersection computation.
106  * @param abscissa intersecting line
107  * @param triangle intersecting triangle
108  */
109  void set_data(Simplex<1> &abscissa, Simplex<2> &triangle);
110 
111  /// Sets the pointer to Plucker coordinates of the abscissa.
113  plucker_coordinates_abscissa_ = p;
114  }
115 
116  /** @brief Sets the pointer to Plucker coordinates of the triangle side.
117  * @param p pointer to Plucker coordinates
118  * @param side_idx local index of a side of triangle
119  */
120  void set_pc_triangle(Plucker *p, unsigned int side_idx){
121  plucker_coordinates_triangle_[side_idx] = p;
122  }
123 
124  /// Gets the pointer to Plucker coordinates of the abscissa.
126  return plucker_coordinates_abscissa_;
127  }
128 
129  /** @brief Gets the pointer to Plucker coordinates of the triangle side.
130  * @param side_idx local index of a side of triangle
131  */
132  Plucker *get_pc_triangle(unsigned int side_idx){
133  return plucker_coordinates_triangle_[side_idx];
134  }
135 
136  /** @brief Sets the Plucker product of abscissa and triangle side (use if computed before).
137  * @param value value of the Plucker product
138  * @param side_idx local index of a side of triangle
139  */
140  void set_plucker_product(double* number, unsigned int side_idx)
141  { plucker_products_[side_idx] = number; };
142 
143  /** @brief Getter for Plucker product of abscissa and triangle side.
144  * @param side_idx local index of a side of triangle
145  * @return pointer to Plucker product
146  */
147  double* get_plucker_product(unsigned int side_idx)
148  { return plucker_products_[side_idx]; };
149 
150  /// Gets true if the intersection has been computed already (e.g. in case of IP in vertex).
151  bool is_computed() { return computed_; }
152  /// Sets the 'computed' flag true. Means that intersection has been computed already (e.g. in case of IP in vertex).
153  void set_computed() { computed_ = true; }
154 
155  //@}
156 
157  /// Prints out all the Plucker coordinates.
158  void print_plucker_coordinates(std::ostream &os);
159 
160  /// Resets Plucker products to 'nullptr'.
161  /// Use this CAREFULLY as it does not destroy the objects.
162  /// It is intended to be used only from higher dimensions when before destroying.
163  void clear_all();
164 
165 private:
166  /** Computes Plucker coordinates (abscissa, triangle lines) and Plucker products,
167  * if not computed already, or set from outside.
168  */
169  void compute_plucker_products();
170 
171  /** Auxiliary function providing correctly signed Plucker product
172  * according to the triangle side orientation.
173  * @param i local index of a side of triangle.
174  */
175  double signed_plucker_product(unsigned int i)
176  { return RefElement<2>::normal_orientation(i) ? -(*plucker_products_[i]) : (*plucker_products_[i]); }
177 
178  /** @brief Computes intersection when nonezero Plucker products are of the same sign.
179  * @param IP intersection point (if found)
180  * @param local local coordinates of IP (got from Plucker products)
181  * @return true, if intersection is found; false otherwise
182  */
183  bool compute_plucker(IntersectionPointAux<1,2> &IP, const arma::vec3 &local);
184 
185  /** Computes intersection of abscissa and triangle side in degenerate case (all products are zero).
186  * Inspects also topology.
187  * @param side_idx is the local index of the triangle side
188  * @param IP is the intersection point (if found)
189  * @return true, if intersection is found; false otherwise
190  */
191  bool compute_degenerate(unsigned int side_idx, IntersectionPointAux<1,2> &IP);
192 
193  /// Flag 'computed'; is true if intersection has been computed already.
194  bool computed_;
195  ///
196  double scale_line_, scale_triangle_;
197 
200 
201  /// Pointer to plucker coordinates of abscissa.
203  /// Vector of pointers to plucker coordinates of triangle sides.
205  /// Pointers to Plucker products of abscissa and triangle side.
207 
208 };
209 
210 
211 
212 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
213 // CLASS FOR 2D - 2D
214 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
215 
216 /**
217  * @brief Class for 2D-2D intersections.
218  *
219  * Computes the intersection of triangle A and triangle B.
220  * Uses 6 ComputeIntersection<Simplex<1>,Simplex<2>>:
221  * - 3x side of triangle A X triangle B
222  * - 3x side of triangle B X triangle A
223  *
224  * It creates a final intersection.
225  *
226  * TODO: do not remember, if the function correct_triangle_ip_topology used to have some meaning here..
227  */
228 template<> class ComputeIntersection<Simplex<2>, Simplex<2>> {
229 public:
230 
231  /** @brief Default constructor, creates empty object.
232  * Resizes vectors for Plucker coordinates and products.
233  */
235  /** @brief Constructor, sets both triangle objects.
236  * It allocates memory, computes plucker coordinates and products.
237  */
238  ComputeIntersection(Simplex<2> &triaA,Simplex<2> &triaB, Mesh *mesh);
240 
241  /** @brief Initializes lower dimensional objects.
242  * Sets correctly the pointers to Plucker coordinates and products.
243  */
244  void init();
245 
246  /** @brief Computes final 2D-2D intersection.
247  * Computes CIs (side vs triangle) in following order: [A0_B, A1_B, A2_B, B0_A, B1_A, B2_A].
248  * During cycle determine topology information and set computed flags accordingly.
249  * @param intersection final 2D-2D intersection object (output)
250  * @return number of intersection points found
251  */
252  unsigned int compute(IntersectionAux<2,2> &intersection);
253 
254  /// @name Setters and Getters
255  //@{
256  /**
257  * @brief Sets the abscissa and tetrahedron.
258  * @param triaA intersecting triangle A
259  * @param triaB intersecting triangle B
260  */
261  void set_data(Simplex<2> &triaA, Simplex<2> &triaB);
262 
263  /** Sets the pointer to Plucker coordinates of the triangle A side.
264  * @param p pointer to Plucker coordinates
265  * @param side_idx local index of a side of triangle A
266  */
267  void set_pc_triaA(Plucker *p, unsigned int side_idx){
268  plucker_coordinates_[side_idx] = p;
269  }
270 
271  /** Sets the pointer to Plucker coordinates of the triangle B side.
272  * @param p pointer to Plucker coordinates
273  * @param side_idx local index of a side of triangle B
274  */
275  void set_pc_triaB(Plucker *p, unsigned int side_idx){
276  plucker_coordinates_[3 + side_idx] = p;
277  }
278 
279  /// Gets the pointer to Plucker coordinates of the triangle A side of given @p side_idx.
280  Plucker *get_pc_triaA(unsigned int side_idx){
281  return plucker_coordinates_[side_idx];
282  }
283 
284  /// Gets the pointer to Plucker coordinates of the triangle B side of given @p side_idx.
285  Plucker *get_pc_triaB(unsigned int side_idx){
286  return plucker_coordinates_[3 + side_idx];
287  }
288 
289  /** Sets the pointer to Plucker product of triangle A side and triangle B side.
290  * @param number pointer to value of Plucker product
291  * @param sideA_idx local index of a side of triangle A
292  * @param sideB_idx local index of a side of triangle B
293  */
294  void set_plucker_product(double * number, unsigned sideA_idx, unsigned int sideB_idx){
295  plucker_products_[sideA_idx*3 + sideB_idx] = number;
296  }
297  /// Gets the pointer to Plucker product of triangle A side @p sideA_idx and triangle B side @p sideB_idx.
298  double* get_plucker_product(unsigned sideA_idx, unsigned int sideB_idx){
299  return plucker_products_[sideA_idx*3 + sideB_idx];
300  }
301  //@}
302 
303  /// Prints out the Plucker coordinates of abscissa and tetrahedron edges.
304  void print_plucker_coordinates(std::ostream &os);
305  /// Prints out the Plucker coordinates of tetrahedron edges in a tree of tetrahedron sides (triangles).
306  void print_plucker_coordinates_tree(std::ostream &os);
307 
308  /// Resets Plucker products to 'nullptr'.
309  /// Use this CAREFULLY as it does not destroy the objects.
310  /// It is intended to be used only from higher dimensions when before destroying.
311  void clear_all();
312 
313 private:
314  /// Pointers to plucker coordinates of sides of both triangles [triaA[3], triaB[3]], size 6.
316  /// Pointers to Plucker products of triangles sides [3x[sideA x triaB]]], size 9.
318  /// Compute intersection for side x triangle [3x[sideA x tria B],3x[sideB x triaA]].
320 
321  // After interpolation, the topology information in triangle must be updated.
322 // void correct_triangle_ip_topology(IntersectionPointAux<2,2> &ip);
323 };
324 
325 
326 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
327 // CLASS FOR 1D - 3D
328 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
329 
330 /**
331  * @brief * @brief Class for 1D-3D intersections.
332  *
333  * Computes the intersection of an abscissa and a tetrahedron.
334  * Uses 4 ComputeIntersection<Simplex<1>,Simplex<2>> for abscissa and tetrahedron sides intersections.
335  */
336 template<> class ComputeIntersection<Simplex<1>, Simplex<3>> {
337 
338 public:
340 
341  /// Default constructor. Use when this is NOT final intersection object.
343  /** @brief Constructor, sets abscissa and tetrahedron object.
344  * Use when this is final intersection object.
345  * It allocates memory, computes plucker coordinates and products.
346  */
347  ComputeIntersection(Simplex<1> &abscissa,Simplex<3> &tetrahedron, Mesh *mesh);
349 
350  /** @brief Initializes lower dimensional objects.
351  * Sets correctly the pointers to Plucker coordinates and products.
352  */
353  void init();
354 
355  /** @brief Computes intersection points for 1D-3D intersection.
356  * Computes lower dimensional CIs abscissa vs tetrahedron face.
357  * During cycle determine topology information and set computed flags accordingly.
358  * We can have 2 IPs at maximum.
359  * If there are 2 IPs:
360  * - sort them in direction of abscissa
361  * - possibly cut (move IPs so they are inside abscissa)
362  * - after cutting interpolate 3D coordinates
363  * - check that IPs are not the same, if true, throw one away
364  * @param IP13d vector of intersection points (output)
365  * @return number of intersection points found
366  */
367  unsigned int compute(std::vector<IPAux> &IP13s);
368 
369  /** @brief Computes final 1D-3D intersection.
370  * Computes IPs and check if any of them are pathologic to set the resulting object also pathologic.
371  * Calls @p compute function inside.
372  * @param intersection final 1D-3D intersection object (output)
373  * @return number of intersection points found
374  */
375  unsigned int compute(IntersectionAux<1,3> &intersection);
376 
377  /// @name Setters and Getters
378  //@{
379  /**
380  * @brief Sets the abscissa and tetrahedron.
381  * Use mainly when this is not final intersection computation.
382  * @param abscissa intersecting line
383  * @param tetrahedron intersecting tetrahedron
384  */
385  void set_data(Simplex<1> &abscissa, Simplex<3> &tetrahedron);
386 
387  /// Sets the pointer to Plucker coordinates of the abscissa.
389  plucker_coordinates_abscissa_ = p;
390  }
391 
392  /** @brief Sets the pointer to Plucker coordinates of the tetrahedron edge.
393  * @param p pointer to Plucker coordinates
394  * @param edge_idx local index of an edge of tetrahedron
395  */
396  void set_pc_tetrahedron(Plucker *p, unsigned int edge_idx){
397  plucker_coordinates_tetrahedron[edge_idx] = p;
398  }
399 
400  /// Gets the pointer to Plucker coordinates of the abscissa.
402  return plucker_coordinates_abscissa_;
403  }
404 
405  /// Gets the pointer to Plucker coordinates of the tetrahedron edge of given @p edge_idx.
406  Plucker *get_pc_tetrahedron(unsigned int edge_idx){
407  return plucker_coordinates_tetrahedron[edge_idx];
408  }
409 
410  /** @brief Sets the pointer to Plucker product of abscissa and tetrahedron edge.
411  * @param number pointer to value of Plucker product
412  * @param edge_idx local index of an edge of tetrahedron
413  */
414  void set_plucker_product(double * number, unsigned edge_idx){
415  plucker_products_[edge_idx] = number;
416  }
417  /// Gets the pointer to Plucker product of abscissa and tetrahedron edge of given @p edge_idx.
418  double* get_plucker_product(unsigned edge_idx){
419  return plucker_products_[edge_idx];
420  }
421  //@}
422 
423  /// Prints out the Plucker coordinates of abscissa and tetrahedron edges.
424  void print_plucker_coordinates(std::ostream &os);
425  /// Prints out the Plucker coordinates of tetrahedron edges in a tree of tetrahedron sides (triangles).
426  void print_plucker_coordinates_tree(std::ostream &os);
427 
428  /// Resets Plucker products to 'nullptr'.
429  /// Use this CAREFULLY as it does not destroy the objects.
430  /// It is intended to be used only from higher dimensions when before destroying.
431  void clear_all();
432 
433 private:
434  /** @brief After interpolation, the topology information in tetrahedron must be updated.
435  * @param ip intersection point to be corrected
436  */
437  void correct_tetrahedron_ip_topology(double t, unsigned int i, std::vector<IPAux> &ip);
438 
439  /// Pointer to plucker coordinates of abscissa.
441  /// Vector of pointers to plucker coordinates of tetrahedron edges.
443  /// Pointers to Plucker products of abscissa and tetrahedron edges.
445  /// Compute 1D-2D intersection objects [4x line X tetrahedron face]
447 };
448 
449 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
450 // CLASS FOR 2D - 3D
451 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
452 
453 /**
454  * @brief Class for 2D-2D intersections.
455  *
456  * Computes the intersection of a triangle and a tetrahedron.
457  * Uses 3 ComputeIntersection<Simplex<1>,Simplex<3>> for triangle sides vs tetrahedron intersections.
458  * Uses 6 ComputeIntersection<Simplex<1>,Simplex<2>> for tetrahedron sides vs triangle intersections.
459  */
460 template<> class ComputeIntersection<Simplex<2>, Simplex<3> > {
461 public:
465 
466 
467  /** @brief Default constructor, creates empty object.
468  * Resizes vectors for Plucker coordinates and products.
469  */
471 
472  /** @brief Constructor, sets both triangle objects.
473  * It allocates memory, computes plucker coordinates and products.
474  * @param triangle intersecting triangle object
475  * @param tetrahedron intersecting tetrahedron object
476  */
477  ComputeIntersection(Simplex<2> &triangle, Simplex<3> &tetrahedron, Mesh *mesh);
479 
480  /** @brief Initializes lower dimensional objects.
481  * Sets correctly the pointers to Plucker coordinates and products.
482  */
483  void init();
484 
485  /** @brief Computes intersection points for 2D-3D intersection.
486  * Computes lower dimensional CIs:
487  * 1) 3x triangle side vs tetrahedron
488  * 2) 6x tetrahedron edge vs triangle
489  * During cycle determine topology information and set computed flags accordingly.
490  * Finally, tracing algorithm is called to sort the intersection points to
491  * create convex polygon.
492  * @param intersection final 2D-3D intersection object (output)
493  * It is then used further in prolongation decision routines.
494  * @return number of intersection points found
495  */
496  void compute(IntersectionAux<2,3> &intersection);
497 
498 
499 
500  /// Prints out the Plucker coordinates of triangle sides and tetrahedron edges.
501  void print_plucker_coordinates(std::ostream &os);
502  /// Prints out the Plucker coordinates in a tree simplices.
503  void print_plucker_coordinates_tree(std::ostream &os);
504 
505 private:
506  // S3 n-face pair (for edge-triangle phase)
507  typedef std::array<uint, 2> FacePair;
508 
509 
510  const unsigned int no_idx;
511  // TODO rename s4 to s3, s3 to s2
512  std::vector<unsigned int> s3_dim_starts; // get global index of n-face i of dimension d: s4_dim_starts[d]+i
513  std::vector<unsigned int> s2_dim_starts; // same for n-faces of S2
514 
516  std::vector<IPAux23> IP23_list; //, degenerate_ips;
517 
518  /// Vector of Plucker coordinates for triangle side.
520  /// Vector of Plucker coordinates for tetrahedron edges.
522 
523  /// Vector of pointers to Plucker products of triangle sides and tetrahedron edges.
525 
526  /// Compute 1D-3D intersection objects [3]
528  /// Compute 1D-2D intersection objects [6]
530 
531 
532  // successors of IPs
534  // successors of n-face objects
535  // 4 vertices, 6 edges, 4 faces, 1 volume, 3 corners, 3 sides, 1 surface; total 22
537 
538 
539  bool ips_topology_equal(const IPAux23 &first, const IPAux23 &second);
540  bool obj_have_back_link(unsigned int i_obj);
541  auto edge_faces(uint i_edge) -> FacePair;
542  auto vertex_faces(uint i_vtx) -> FacePair;
543 
544 
545  inline bool have_backlink(uint i_obj);
546  /**
547  * Set links: obj_before -> IP -> obj_after
548  * if obj_after have null successor, set obj_after -> IP (backlink)
549  */
550  inline void set_links(uint obj_before_ip, uint ip_idx, uint obj_after_ip);
551 
552 
555 };
556 
557 
558 
559 #endif // COMPUTE_INTERSECTION_H_
std::vector< Plucker * > plucker_coordinates_tetrahedron
Vector of pointers to plucker coordinates of tetrahedron edges.
double * get_plucker_product(unsigned sideA_idx, unsigned int sideB_idx)
Gets the pointer to Plucker product of triangle A side sideA_idx and triangle B side sideB_idx...
Plucker * get_pc_triaA(unsigned int side_idx)
Gets the pointer to Plucker coordinates of the triangle A side of given side_idx. ...
bool is_computed()
Gets true if the intersection has been computed already (e.g. in case of IP in vertex).
unsigned int uint
std::vector< Plucker * > plucker_coordinates_triangle_
Vector of pointers to plucker coordinates of triangle sides.
std::vector< double * > plucker_products_
Pointers to Plucker products of abscissa and tetrahedron edges.
void set_pc_tetrahedron(Plucker *p, unsigned int edge_idx)
Sets the pointer to Plucker coordinates of the tetrahedron edge.
void set_computed()
Sets the &#39;computed&#39; flag true. Means that intersection has been computed already (e.g. in case of IP in vertex).
void set_pc_triaB(Plucker *p, unsigned int side_idx)
std::vector< Plucker * > plucker_coordinates_triangle_
Vector of Plucker coordinates for triangle side.
bool computed_
Flag &#39;computed&#39;; is true if intersection has been computed already.
Definition: mesh.h:99
void set_plucker_product(double *number, unsigned edge_idx)
Sets the pointer to Plucker product of abscissa and tetrahedron edge.
static unsigned int normal_orientation(unsigned int sid)
Definition: ref_element.cc:315
std::vector< double * > plucker_products_
Pointers to Plucker products of triangles sides [3x[sideA x triaB]]], size 9.
void set_plucker_product(double *number, unsigned int side_idx)
Sets the Plucker product of abscissa and triangle side (use if computed before).
Plucker * get_pc_triaB(unsigned int side_idx)
Gets the pointer to Plucker coordinates of the triangle B side of given side_idx. ...
void set_pc_abscissa(Plucker *p)
Sets the pointer to Plucker coordinates of the abscissa.
std::vector< double * > plucker_products_
Vector of pointers to Plucker products of triangle sides and tetrahedron edges.
void set_pc_triaA(Plucker *p, unsigned int side_idx)
void set_pc_abscissa(Plucker *p)
Sets the pointer to Plucker coordinates of the abscissa.
std::vector< double * > plucker_products_
Pointers to Plucker products of abscissa and triangle side.
void set_plucker_product(double *number, unsigned sideA_idx, unsigned int sideB_idx)
Plucker * get_pc_triangle(unsigned int side_idx)
Gets the pointer to Plucker coordinates of the triangle side.
double * get_plucker_product(unsigned edge_idx)
Gets the pointer to Plucker product of abscissa and tetrahedron edge of given edge_idx.
Plucker * get_pc_abscissa()
Gets the pointer to Plucker coordinates of the abscissa.
std::vector< Plucker * > plucker_coordinates_
Pointers to plucker coordinates of sides of both triangles [triaA[3], triaB[3]], size 6...
static const double plucker_empty
Auxiliary value for Plucker product. If equal this value, it is supposed not to be set yet...
Internal auxiliary class represents an intersection point of simplex<N> and simplex<M>.
std::vector< Plucker * > plucker_coordinates_tetrahedron
Vector of Plucker coordinates for tetrahedron edges.
Class RefElement defines numbering of vertices, sides, calculation of normal vectors etc...
Plucker * plucker_coordinates_abscissa_
Pointer to plucker coordinates of abscissa.
Plucker * get_pc_abscissa()
Gets the pointer to Plucker coordinates of the abscissa.
Internal auxiliary class representing intersection object of simplex<dimA> and simplex<dimB>.
Internal class representing intersection point.
double * get_plucker_product(unsigned int side_idx)
Getter for Plucker product of abscissa and triangle side.
Plucker * plucker_coordinates_abscissa_
Pointer to plucker coordinates of abscissa.
Plucker coordinates representing line given by points A,B.
Definition: plucker.hh:47
void set_pc_triangle(Plucker *p, unsigned int side_idx)
Sets the pointer to Plucker coordinates of the triangle side.
Plucker * get_pc_tetrahedron(unsigned int edge_idx)
Gets the pointer to Plucker coordinates of the tetrahedron edge of given edge_idx.