3#ifndef DUNE_GRIDGLUE_MERGING_COMPUTEINTERSECTION_HH
4#define DUNE_GRIDGLUE_MERGING_COMPUTEINTERSECTION_HH
6#include <dune/common/fvector.hh>
7#include <dune/common/fmatrix.hh>
12template<
int dimWorld,
int dim1,
int dim2,
typename T =
double>
13class ComputationMethod {
15 typedef FieldVector<T, dimWorld> Vector;
16 static const int grid1Dimension = dim1;
17 static const int grid2Dimension = dim2;
18 static const int intersectionDimension = (dim1 < dim2)?(dim1):(dim2);
20 static bool computeIntersectionPoints(
const std::vector<Vector> X,
21 const std::vector<Vector> Y,
22 std::vector<std::vector<int> >& SX,
23 std::vector<std::vector<int> >& SY,
24 std::vector<Vector>& P);
25 static void grid1_subdivisions(
const std::vector<Vector> elementCorners,
26 std::vector<std::vector<unsigned int> >& subElements,
27 std::vector<std::vector<int> >& faceIds);
28 static void grid2_subdivisions(
const std::vector<Vector> elementCorners,
29 std::vector<std::vector<unsigned int> >& subElements,
30 std::vector<std::vector<int> >& faceIds);
41 typedef typename CM::Vector V;
42 const int dimWorld = V::dimension;
43 const int dim1 = CM::grid1Dimension;
44 const int dim2 = CM::grid2Dimension;
60 const std::vector<V>& Y,
61 std::vector<std::vector<int> >& SX,
62 std::vector<std::vector<int> >& SY,
74 template<
int isDim,
int dW>
76 const std::vector<std::vector<int> >& SX,
77 const std::vector<std::vector<int> >& SY,
78 const std::vector<V>& P,
79 std::vector<std::vector<int> >& H)
82 orderPoints_(std::integral_constant<int,isDim>(),std::integral_constant<int,dW>(),
83 centroid, SX, SY, P,H);
87 static void orderPoints_(std::integral_constant<int,1>,
88 std::integral_constant<int,1>,
90 const std::vector<std::vector<int> >& SX,
91 const std::vector<std::vector<int> >& SY,
92 const std::vector<V>& P,
93 std::vector<std::vector<int> >& H) {}
94 static void orderPoints_(std::integral_constant<int,1>,
95 std::integral_constant<int,2>,
97 const std::vector<std::vector<int> >& SX,
98 const std::vector<std::vector<int> >& SY,
99 const std::vector<V>& P,
100 std::vector<std::vector<int> >& H) {}
101 static void orderPoints_(std::integral_constant<int,1>,
102 std::integral_constant<int,3>,
104 const std::vector<std::vector<int> >& SX,
105 const std::vector<std::vector<int> >& SY,
106 const std::vector<V>& P,
107 std::vector<std::vector<int> >& H) {}
108 static void orderPoints_(std::integral_constant<int,2>,
109 std::integral_constant<int,2>,
111 const std::vector<std::vector<int> >& SX,
112 const std::vector<std::vector<int> >& SY,
113 const std::vector<V>& P,
114 std::vector<std::vector<int> >& H);
115 static void orderPoints_(std::integral_constant<int,2>,
116 std::integral_constant<int,3>,
118 const std::vector<std::vector<int> >& SX,
119 const std::vector<std::vector<int> >& SY,
120 const std::vector<V>& P,
121 std::vector<std::vector<int> >& H);
122 static void orderPoints_(std::integral_constant<int,3>,
123 std::integral_constant<int,3>,
125 const std::vector<std::vector<int> >& SX,
126 const std::vector<std::vector<int> >& SY,
127 const std::vector<V>& P,
128 std::vector<std::vector<int> > & H);
137 static void orderPointsCC(std::integral_constant<int,2>,
139 std::vector<int> &
id,
140 const std::vector<V>& P);
141 static void orderPointsCC(std::integral_constant<int,3>,
143 std::vector<int> &
id,
144 const std::vector<V>& P);
150 static void removeDuplicates( std::vector<int> & p);
159 static bool newFace3D(
const std::vector<int>&
id,
160 const std::vector<std::vector<int> >& H);
164inline int insertPoint(
const V p, std::vector<V>& P)
171 while ((k<P.size())&&
172 ((p - P[k]).infinity_norm()>eps*(P[k].infinity_norm()) &&
173 (p - P[k]).infinity_norm()>eps*(p.infinity_norm())) &&
174 !(p.infinity_norm() < eps && P[k].infinity_norm() <eps &&
175 (p - P[k]).infinity_norm() < eps))
192#include "simplexintersection.cc"
193#include "computeintersection.cc"
Intersection computation method for two elements of arbitrary dimension.
Definition: computeintersection.hh:39
static void orderPoints(const V ¢roid, const std::vector< std::vector< int > > &SX, const std::vector< std::vector< int > > &SY, const std::vector< V > &P, std::vector< std::vector< int > > &H)
Order Points in the point list P face-wise such that a subsimplex subdivision can be constructed.
Definition: computeintersection.hh:75
static bool computeIntersection(const std::vector< V > &X, const std::vector< V > &Y, std::vector< std::vector< int > > &SX, std::vector< std::vector< int > > &SY, std::vector< V > &P)
Compute the intersection of two elements X and Y Compute the intersection of two elements X and Y,...
Definition: computeintersection.cc:14