KASKADE 7 development version
geometric_objects.hh
Go to the documentation of this file.
1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2/* */
3/* This file is part of the library KASKADE 7 */
4/* https://www.zib.de/research/projects/kaskade7-finite-element-toolbox */
5/* */
6/* Copyright (C) 2002-2011 Zuse Institute Berlin */
7/* */
8/* KASKADE 7 is distributed under the terms of the ZIB Academic License. */
9/* see $KASKADE/academic.txt */
10/* */
11/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
12/*
13 * geometric_objects.h
14 *
15 * Created on: 17.12.2011
16 * Author: Lars Lubkoll
17 */
18
19#ifndef GEOMETRIC_OBJECTS_HH_
20#define GEOMETRIC_OBJECTS_HH_
21
22#include <algorithm>
23#include <cmath>
24#include <iostream>
25#include <utility>
26#include <vector>
27#include <boost/array.hpp>
28#include <boost/utility/enable_if.hpp>
29#include <dune/common/fvector.hh>
30#include <dune/grid/common/genericreferenceelements.hh>
32#include "tools/linalg/scalarproducts.hh"
33
35{
36 enum Direction{ X, Y, Z };
37
38 /*******************************************************************************************************************************/
39
40 template <class Scalar, int dim>
41 class Point : public Dune::FieldVector<Scalar,dim>{
42 public:
44 Point() : Base(){}
45 explicit Point(Dune::FieldVector<Scalar,dim> const& p) : Base(p) {}
46 };
47
48 /*******************************************************************************************************************************/
49
50 template <class Scalar, int dim>
51 struct Line{
52 Line() : start(), end()
53 {}
54
55 Line(Point<Scalar,dim> const& s, Point<Scalar,dim> const& e) : start(s), end(e)
56 {}
57
59 };
60
61 /*******************************************************************************************************************************/
62
63 // TODO implement 2D-Polygon
64 template <class Scalar, int dim>
65 struct Triangle{
68 {
69 init(Vertex(), Vertex(), Vertex());
70 }
71
72 Triangle(Vertex const& v1, Vertex const& v2, Vertex const& v3)
73 {
74 init(v1,v2,v3);
75 }
76
77 boost::array<Vertex,3> corners;
78
79 private:
80 void init(Vertex const& v1, Vertex const& v2, Vertex const& v3)
81 {
82 corners[0] = v1; corners[1] = v2; corners[2] = v3;
83 }
84 };
85
86 /*******************************************************************************************************************************/
87
88 template <class Scalar, int dim>
89 struct Rectangle{
91 {
93 }
94
95 explicit Rectangle(boost::array<Point<Scalar,dim>, 4> const& e)
96 {
97 init(e[0], e[1], e[2], e[3]);
98 }
99
101 {
102 init(p0, p1, p2, p3);
103 }
104
105 boost::array<Point<Scalar,dim>,4> corners;
106
107 private:
108 void init(Point<Scalar,dim> const& p0, Point<Scalar,dim> const& p1, Point<Scalar,dim> const& p2, Point<Scalar,dim> const& p3)
109 {
110 corners[0] = p0; corners[1] = p1; corners[2] = p2; corners[3] = p3;
111 }
112 };
113
114 /*******************************************************************************************************************************/
115
116 namespace {
117 template <int dim>
118 struct BoundingBoxContainsImpl{
119 template <class Array, class Coordinate>
120 static bool apply(Array const& array, Coordinate const& x)
121 {
122 return (BoundingBoxContainsImpl<dim-1>::apply(array, x) && array[dim-1].first<=x[dim-1] && array[dim-1].second>=x[dim-1]);
123 }
124 };
125
126 template <>
127 struct BoundingBoxContainsImpl<1>{
128 template <class Array, class Coordinate>
129 static bool apply(Array const& array, Coordinate const& x)
130 {
131 return (array[0].first <= x[0] && array[0].second >= x[0]);
132 }
133 };
134
135 template <class Scalar, int dim, int id>
136 struct BoundingBoxGetCornersImpl
137 {
138 template <class Array>
139 static void apply(std::vector<Point<Scalar,dim> > &corners, Array const& array)
140 {
141 size_t offset = (size_t)(corners.size()/pow(2,id+1));
142 bool first = true;
143 size_t changes = 0;
144 for(size_t i=0; i<corners.size(); ++i)
145 {
146 if( (i-changes*offset)==offset )
147 {
148 ++changes;
149 first = !first;
150 }
151
152 if(first) corners[i][id] = array[id].first;
153 else corners[i][id] = array[id].second;
154 }
155 BoundingBoxGetCornersImpl<Scalar,dim,id+1>::apply(corners, array);
156 }
157 };
158
159 template <class Scalar, int dim>
160 struct BoundingBoxGetCornersImpl<Scalar,dim,dim>
161 {
162 template <class Array>
163 static void apply(std::vector<Point<Scalar,dim> > &corners, Array const& array){}
164 };
165
166
167 template <class Scalar, int dim, int id>
168 struct BoundingBoxGetEdgesImpl
169 {
170 template <class Array>
171 static void apply(std::vector<Line<Scalar,dim> > &edges, Array const& array, int indexOffset)
172 {
173 int localNumberOfEdges = pow(2,dim-1);
174 for(int edge=0; edge<localNumberOfEdges; ++edge)
175 {
176 Point<Scalar,dim> start, end;
177 start[id] = array[id].first;
178 end[id] = array[id].second;
179
180 for(int i=0; i<dim; ++i)
181 {
182 if(i==id) continue;
183 if(edge==0){
184 insert(start, end, array[i].first, i);
185 continue;
186 }
187 if(edge==1)
188 {
189 if(i==1) insert(start, end, array[i].second, i);
190 if(i==2) insert(start, end, array[i].first, i);
191 continue;
192 }
193 if(edge==2)
194 {
195 if(i==1) insert(start, end, array[i].first, i);
196 if(i==2) insert(start, end, array[i].second, i);
197 continue;
198 }
199 if(edge==3)
200 {
201 if(i==1) insert(start, end, array[i].second, i);
202 if(i==2) insert(start, end, array[i].second, i);
203 continue;
204 }
205 }
206 edges[edge] = Line<Scalar,dim>(start,end);
207 }
208 BoundingBoxGetEdgesImpl<Scalar,dim,id+1>::apply(edges, array, localNumberOfEdges);
209 } // end apply
210
211 private:
212 static void insert(Point<Scalar,dim>& start, Point<Scalar,dim>& end, Scalar value, int index)
213 {
214 start[index] = value, end[index] = value;
215 }
216 };
217
218 template <class Scalar, int dim>
219 struct BoundingBoxGetEdgesImpl<Scalar,dim,dim>
220 {
221 template <class Array>
222 static void apply(std::vector<Line<Scalar,dim> >&, Array const&, int){};
223 };
224
225 template <int v1, int v2>
226 struct MyLess{
227 static bool const value=v1<v2;
228 };
229
230 template <int v1, int v2>
231 struct Minus{
232 static int const value = v1-v2;
233 };
234
235 template <int val>
236 struct Decrement{
237 static int const value = val-1;
238 };
239
240 template <class Scalar, int dim, int dimMinusCodim>
241 struct GetCodimTypeImpl;
242
243 template <class Scalar, int dim>
244 struct GetCodimTypeImpl<Scalar,dim,0>{
245 typedef typename boost::enable_if<MyLess<0,dim>, Point<Scalar,dim> >::type type;
246 };
247
248 template <class Scalar, int dim>
249 struct GetCodimTypeImpl<Scalar,dim,1>{
250 typedef typename boost::enable_if<MyLess<1,dim>, Line<Scalar,dim> >::type type;
251 };
252
253 template <class Scalar, int dim>
254 struct GetCodimTypeImpl<Scalar,dim,2>{
255 typedef typename boost::enable_if<MyLess<2,dim>, Rectangle<Scalar,dim> >::type type;
256 };
257
258 template <class Scalar, int dim, int codim>
259 struct GetCodimType{
260 typedef typename GetCodimTypeImpl<Scalar,dim,dim-codim>::type type;
261 };
262
263 template <class Scalar, int dim, int dimMinusCodim>
264 struct CodimBaseImpl{};
265
266 template <class Scalar, int dim>
267 struct CodimBaseImpl<Scalar,dim,2>
268 {
269 template <class Array>
270 std::vector<typename GetCodimType<Scalar,dim,dim-2>::type > getFaces(Array const& array) const
271 {
272 std::vector<Rectangle<Scalar,3> > faces(6);
273 std::vector<Point<Scalar,3> > corners=CodimBaseImpl<Scalar,dim,0>::getCorners(array);
274 faces[0] = Rectangle<Scalar,3>(corners[0], corners[2], corners[3], corners[1]);
275 faces[1] = Rectangle<Scalar,3>(corners[4], corners[6], corners[7], corners[5]);
276 faces[2] = Rectangle<Scalar,3>(corners[0], corners[4], corners[6], corners[2]);
277 faces[3] = Rectangle<Scalar,3>(corners[1], corners[5], corners[7], corners[3]);
278 faces[4] = Rectangle<Scalar,3>(corners[0], corners[4], corners[5], corners[1]);
279 faces[5] = Rectangle<Scalar,3>(corners[2], corners[6], corners[7], corners[3]);
280 return faces;
281 }
282 };
283
284 template <class Scalar, int dim>
285 struct CodimBaseImpl<Scalar,dim,1>
286 {
287 template <class Array>
288 std::vector<Line<Scalar,dim> > getEdges(Array const& array) const
289 {
290 if(dim==0) return std::vector<Line<Scalar,dim> >();
291
292 size_t numEdges = 1;
293 for(int i=1; i<dim; ++i) numEdges = 2*numEdges + pow(2,i);
294
295 std::vector<Line<Scalar,dim> > edges(numEdges);
296 BoundingBoxGetEdgesImpl<Scalar,dim, 0>::apply(edges, array, 0);
297 return edges;
298 }
299 };
300
301 template <class Scalar, int dim>
302 struct CodimBaseImpl<Scalar, dim, 0>
303 {
304 template <class Array>
305 static std::vector<Point<Scalar,dim> > getCorners(Array const& array)
306 {
307 std::vector<Point<Scalar,dim> > corners(pow(2,dim));
308 BoundingBoxGetCornersImpl<Scalar,dim,0>::apply(corners, array);
309 return corners;
310 }
311 };
312
313 template <class Scalar, int dim, int codim>
314 struct CodimBase : public CodimBaseImpl<Scalar,dim,dim-codim>, public CodimBase<Scalar,dim,codim-1>{};
315
316 template <class Scalar, int dim>
317 struct CodimBase<Scalar,dim,0>{};
318 }
319
321 template <class Scalar, int dimension>
322 struct BoundingBox : public CodimBase<Scalar,dimension,dimension>{
323 static int const dim=dimension;
325 {
326 for(int i=0; i<dim; ++i) coord[i].first = coord[i].second = 0;
327 }
328
330 {
331 coord = boundingBox.coord;
332 }
333
334 explicit BoundingBox(typename Point<Scalar,dim>::Base const& x)
335 {
336 for(int i=0; i<dim; ++i) coord[i].first = coord[i].second = x[i];
337 }
338
339 template <class Coordinate>
340 void update(Coordinate const& x)
341 {
342 for(int i=0; i<dim; ++i)
343 {
344 if(coord[i].first > x[i]) coord[i].first = x[i];
345 if(coord[i].second < x[i]) coord[i].second = x[i];
346 }
347 }
348
349 std::ostream& print(std::ostream &stream) const
350 {
351 stream << "BoundingBox: ";
352 for(int i=0; i<dim-1; ++i)
353 stream << coord[i].first << " - " << coord[i].second << " | ";
354 stream << coord[dim-1].first << " - " << coord[dim-1].second << std::endl;
355 return stream;
356 }
357
358 template <class Coordinate>
359 bool contains(Coordinate const& x) const
360 {
361 return BoundingBoxContainsImpl<dim>::apply(coord, x);
362 }
363
364 friend std::ostream& operator<<(std::ostream& stream, BoundingBox<Scalar,dim> const& boundingBox)
365 {
366 return boundingBox.print(stream);
367 }
368
370 };
371
372 template <class Scalar, int dim>
373 struct FastBoundingBox : public BoundingBox<Scalar,dim>
374 {
376
378
381 {}
382
383 template <class Coordinate>
384 explicit FastBoundingBox(Coordinate const& x) : Base(x){}
385
387 {
388 corners = getCorners(this->coord);
389 }
390
392 {
393 edges = getEdges(this->coord);
394 }
395
397 {
398 faces = getFaces(this->coord);
399 }
400
401 void initAll()
402 {
404 }
405
406 std::vector<Point<Scalar,dim> > const& getStoredCorners() const
407 {
408 return corners;
409 }
410
411 std::vector<Line<Scalar,dim> > const& getStoredEdges() const
412 {
413 return edges;
414 }
415
416 std::vector<Rectangle<Scalar,dim> > const& getStoredFaces() const
417 {
418 return faces;
419 }
420
421 std::vector<Point<Scalar,dim> > corners;
422 std::vector<Line<Scalar,dim> > edges;
423 std::vector<Rectangle<Scalar,dim> > faces;
424 };
425
426
427 template <class BB>
429
430 template <class Scalar, int dim>
431 struct BoundingBoxWrapper<BoundingBox<Scalar,dim> >
432 {
434
435 static void init(BB& boundingBox){}
436 static void initCorners(BB& boundingBox){}
437 static void initEdges(BB& boundingBox){}
438 static void initFaces(BB& boundingBox){}
439 };
440
441 template <class Scalar, int dim>
443 {
445
446 static void init(BB& boundingBox){ boundingBox.initAll(); }
447 static void initCorners(BB& boundingBox){ boundingBox.initCorners(); }
448 static void initEdges(BB& boundingBox){ boundingBox.initEdges(); }
449 static void initFaces(BB& boundingBox){ boundingBox.initFaces(); }
450 };
451
452 /*******************************************************************************************************************************/
453
455 template <class Scalar, int dim>
456 struct Ball{
458 {}
459
460 template <class Position>
461 bool contains(Position const& x) const
462 {
463 return (x-center).two_norm() <= radius;
464 }
465
466 template <class Position>
467 Scalar distanceFromCenter(Position const& x) const
468 {
469 return (x-center).two_norm();
470 }
471
473 Scalar radius;
474 };
475 /*******************************************************************************************************************************/
476 // function declarations, definitions follow after namespace ImplementationDetail
477 template <class Scalar, int dim, class Metric>
478 Scalar distance(Point<Scalar,dim> const& first, Point<Scalar,dim> const& second);
479
480 template <class Scalar, int dim, class Metric>
481 Scalar distance(Point<Scalar,dim> const& point, Line<Scalar,dim> const& line);
482
483 template <class Scalar, int dim, class Metric>
484 Scalar distance(Line<Scalar,dim> const& line, Point<Scalar,dim> const& point);
485
486 template <class Scalar, int dim, class Metric>
487 Scalar distance(Ball<Scalar,dim> const& ball, Point<Scalar,dim> const& point);
488
489 template <class Scalar, int dim, class Metric>
490 Scalar distance(Point<Scalar,dim> const& point, Ball<Scalar,dim> const& ball);
491
492 template <class Scalar, int dim, class Metric>
493 Scalar distance(Ball<Scalar,dim> const& ball, Line<Scalar,dim> const& line);
494
495 template <class Scalar, int dim, class Metric>
496 Scalar distance(Line<Scalar,dim> const& line, Ball<Scalar,dim> const& ball);
497
498 template <class Scalar, int dim, class Metric>
499 Scalar distance(Ball<Scalar,dim> const& ball, Rectangle<Scalar,dim> const& rectangle);
500
501 template <class Scalar, int dim, class Metric>
502 Scalar distance(Rectangle<Scalar,dim> const& rectangle, Ball<Scalar,dim> const& ball);
503
504 template <class Scalar, int dim, class Metric>
506
507 namespace ImplementationDetail{
508
509 template <class FirstObject, class SecondObject, class Scalar, int dim, class ScalarProduct>
511
512 template <class Scalar, int dim, class ScalarProduct>
513 struct ProjectionImpl<Point<Scalar,dim>, Line<Scalar,dim>, Scalar, dim, ScalarProduct>
514 {
515 static Point<Scalar,dim> apply(Point<Scalar,dim> const& point, Line<Scalar,dim> const& line, Scalar& a, ScalarProduct const scalarProduct)
516 {
517 Point<Scalar,dim> const direction = GeomTools::normalize(line.end-line.start);
518 return line.start + scalarProduct(point-line.start, direction)*direction;
519 }
520 };
521
522 template <class Scalar, int dim, class ScalarProduct>
523 struct ProjectionImpl<Point<Scalar,dim>, Rectangle<Scalar,dim>, Scalar, dim, ScalarProduct>
524 {
525 static Point<Scalar,dim> apply(Point<Scalar,dim> const& point, Rectangle<Scalar,dim> const& rectangle, Scalar& a, Scalar& b, ScalarProduct const scalarProduct)
526 {
527 Point<Scalar,dim> const dir1 = GeomTools::normalize(rectangle.corners[1]-rectangle.corners[0]),
528 dir2 = GeomTools::normalize(rectangle.corners[3]-rectangle.corners[0]);
529 Point<Scalar,dim> const vec = point-rectangle.corners[0];
530 return rectangle.corners[0] + scalarProduct(vec, dir1)*dir1 + scalarProduct(vec, dir2)*dir2;
531 }
532 };
533
534 template <class Metric, class Scalar, int dim, class FirstObject, class SecondObject>
536
537 template <class Metric, class Scalar, int dim>
538 struct DistanceImpl<Metric, Scalar, dim, Point<Scalar,dim>, Point<Scalar,dim> >
539 {
540 static Scalar apply(Point<Scalar,dim> const& firstPoint, Point<Scalar,dim> const& secondPoint, Metric metric)
541 {
542 return metric(firstPoint-secondPoint);
543 }
544 };
545
546 template <class Metric, class Scalar, int dim>
547 struct DistanceImpl<Metric, Scalar, dim, Point<Scalar,dim>, Line<Scalar,dim> >
548 {
549 static Scalar apply(Point<Scalar,dim> const& point, Line<Scalar,dim> const& line, Metric metric)
550 {
551 Scalar a;
552 Point<Scalar,dim> projectedPoint = ProjectionImpl<Point<Scalar,dim>, Line<Scalar,dim>, Scalar,dim,typename Metric::ScalarProduct>::apply(point,line,a);
553 Scalar length = distance<Metric>(line.start, line.end);
554 if(0 < a && a < length) return distance<Metric>(point,projectedPoint,metric);
555 if(a <= 0) return distance<Metric>(point, line.start,metric);
556 return distance<Metric>(point, line.end,metric);
557 }
558 };
559
560 // template <class Metric
561
562 template <class Metric, class Scalar, int dim>
563 struct DistanceImpl<Metric, Scalar, dim, Point<Scalar,dim>, Rectangle<Scalar,dim> >
564 {
566 static Scalar apply(Point<Scalar,dim> const& point, Rectangle<Scalar,dim> const& rectangle, Metric metric)
567 {
568 Scalar a,b;
569 Point<Scalar,dim> projectedPoint = ProjectionImpl<Point<Scalar,dim>, Rectangle<Scalar,dim>, Scalar,dim,typename Metric::ScalarProduct>::apply(point, rectangle, a, b);
570 Scalar l0 = distance<Metric>(rectangle.corners[0], rectangle.corners[1], metric),
571 l1 = distance<Metric>(rectangle.corners[0], rectangle.corners[3], metric);
572 if(0 < a && a < l0 && 0 < b && b < l1) return distance<Metric>(point, projectedPoint, metric);
573
574 if(a <= 0)
575 {
576 if(b <= 0) return distance<Metric>(point, rectangle.corners[0], metric);
577 if(b >= l1) return distance<Metric>(point, rectangle.corners[3], metric);
578 return distance<Metric>(point, Edge(rectangle.corners[0], rectangle.corners[3]), metric);
579 }
580 if(a >= l0)
581 {
582 if(b <= 0) return distance<Metric>(point, rectangle.corners[1], metric);
583 if(b >= l1) return distance<Metric>(point, rectangle.corners[2], metric);
584 return distance<Metric>(point, Edge(rectangle.corners[1], rectangle.corners[2]), metric);
585 }
586 if(b <= 0) return distance<Metric>(point, Edge(rectangle.corners[0], rectangle.corners[1]), metric);
587 return distance<Metric>(point, Edge(rectangle.corners[2], rectangle.corners[3]), metric);
588 }
589 };
590
591 template <class Metric, class Scalar, int dim>
592 struct DistanceImpl<Metric, Scalar, dim, Ball<Scalar,dim>, Point<Scalar,dim> >
593 {
594 static Scalar apply(Ball<Scalar,dim> const& ball, Point<Scalar,dim> const& point, Metric metric)
595 {
596 Scalar distanceToCenter = distance<Metric>(point, ball.center, metric);
597 return (distanceToCenter < ball.radius) ? 0 : distanceToCenter-ball.radius;
598 }
599 };
600
601 template <class Metric, class Scalar, int dim>
602 struct DistanceImpl<Metric, Scalar, dim, Ball<Scalar,dim>, Line<Scalar,dim> >
603 {
604 static Scalar apply(Ball<Scalar,dim> const& ball, Line<Scalar,dim> const& line, Metric metric)
605 {
606
607 int distanceToCenter = distance<Metric>(ball.center, line, metric);
608 return (distanceToCenter < ball.radius) ? 0 : distanceToCenter - ball.radius;
609 }
610 };
611
612 template <class Metric, class Scalar, int dim>
613 struct DistanceImpl<Metric, Scalar, dim, Ball<Scalar,dim>, Rectangle<Scalar,dim> >
614 {
615 static Scalar apply(Ball<Scalar,dim> const& ball, Rectangle<Scalar,dim> const& rectangle, Metric metric)
616 {
617 Scalar distanceToCenter = distance<Metric>(ball.center, rectangle, metric);
618 return (distanceToCenter < ball.radius) ? 0 : distanceToCenter - ball.radius;
619 }
620 };
621
622 template <class Metric, class Scalar, int dim>
623 struct DistanceImpl<Metric, Scalar, dim, Ball<Scalar,dim>, BoundingBox<Scalar,dim> >
624 {
625 static Scalar apply(Ball<Scalar,dim> const& ball, BoundingBox<Scalar,dim> const& boundingBox, Metric metric)
626 {
627 if(boundingBox.contains(ball.center)) return 0;
628 Scalar result=9999;
629 // check corners
630 std::vector<Point<Scalar,dim> > const& corners = boundingBox.getCorners();
631 for(size_t cornerId=0; cornerId<corners.size(); ++cornerId)
632 {
633 Scalar tmp = distance<Metric>(ball, corners[cornerId], metric);
634 if(tmp > 0) result = std::min(tmp,result); else return 0;
635 }
636 // check edges
637 std::vector<Line<Scalar,dim> > const edges = boundingBox.getEdges();
638 for(size_t edgeId=0; edgeId<edges.size(); ++edgeId)
639 {
640 Scalar tmp = distance<Metric>(ball, edges[edgeId], metric);
641 if(tmp > 0) result = std::min(tmp, result); else return 0;
642 }
643 // check faces
644 std::vector<Rectangle<Scalar,dim> > const faces = boundingBox.getFaces();
645 for(size_t faceId=0; faceId<faces.size(); ++faceId)
646 {
647 Scalar tmp = distance<Metric>(ball, faces[faceId], metric);
648 if(tmp > 0) result = std::min(tmp, result); else return 0;
649 }
650
651 return result;
652 } // end distance
653 };
654
655// template <class Metric, class Scalar, int dim, class DuneSimplex>
656// struct DistanceImpl<Metric, Scalar, dim, Ball<Scalar,dim>, DuneSimplex>
657// {
658// static Scalar apply(Ball<Scalar,dim> const& ball, DuneSimplex const& duneEntity)
659// {
660// if(Dune::GenericReferenceElements<double,3>::simplex().checkInside(duneEntity.geometry().local(ball.center))) return 0;
661// Scalar result = 9999;
662// int const numberOfCorners = duneEntity.geometry().corners();
663// // check corners
664// for(int cornerId=0; cornerId<numberOfCorners; ++cornerId)
665// {
666// Scalar tmp = distance<Metric>(ball, duneEntity.geometry().corner(cornerId));
667// if(tmp > 0) result = std::min(tmp, result);
668// else return 0;
669// }
670// // check edges
671// for(int startCornerId=0; startCornerId<numberOfCorners; ++startCornerId)
672// {
673// for(int endCornerId=startCornerId+1; endCornerId<numberOfCorners; ++endCornerId)
674// {
675// Scalar tmp = distance<Metric>(ball, Line<Scalar,dim>(duneEntity.geometry().corner(startCornerId), duneEntity.geometry(),corner(endCornerId)));
676// if(tmp > 0) result = std::min(tmp, result);
677// else return 0;
678// }
679// }
680// // check faces
681// if(dim>2)
682// {
683//
684// }
685//
686// return result;
687// }
688// };
689
690 /*----------------------------------------------------------------------------------*/
691
692 template <class Metric, class Scalar, int dim, class FirstObject, class SecondObject>
694
695 template <class Metric, class Scalar, int dim>
696 struct IntersectionCheckImpl<Metric, Scalar, dim, Ball<Scalar,dim>, BoundingBox<Scalar,dim> >
697 {
698 static bool apply(Ball<Scalar,dim> const& ball, BoundingBox<Scalar,dim> const& boundingBox, Metric metric)
699 {
701 }
702 };
703
704// template <class Metric, class Scalar, int dim, class DuneSimplex>
705// struct IntersectionCheckImpl<Metric, Ball<Scalar,dim>, DuneSimplex, Scalar, dim>
706// {
707// static bool apply(Ball<Scalar,dim> const& ball, DuneSimplex const& duneEntity)
708// {
709// return DistanceImpl<Metric, Scalar, dim, Ball<Scalar,dim>, DuneSimplex >::apply(ball,duneEntity) <= 0;
710// }
711// };
712
713 }
714
715 /*******************************************************************************************************************************/
716
717 // project first object on second
718 template <class Scalar, int dim, class FirstObject, class SecondObject, class ScalarProduct>
719 FirstObject projectFirstOnSecond(FirstObject const& first, SecondObject const& second, ScalarProduct const& scalarProduct = ScalarProduct())
720 {
722 }
723
724 template <class Scalar, int dim, class Metric>
725 Scalar distance(Point<Scalar,dim> const& first, Point<Scalar,dim> const& second, Metric const& metric = Metric())
726 {
728 }
729
730 template <class Scalar, int dim, class Metric>
731 Scalar distance(Point<Scalar,dim> const& point, Line<Scalar,dim> const& line, Metric const& metric = Metric())
732 {
734 }
735
736 template <class Scalar, int dim, class Metric>
737 Scalar distance(Line<Scalar,dim> const& line, Point<Scalar,dim> const& point, Metric const& metric = Metric())
738 {
740 }
741
742 template <class Scalar, int dim, class Metric>
743 Scalar distance(Point<Scalar,dim> const& point, Triangle<Scalar,dim> const& triangle, Metric const& metric = Metric())
744 {
746 }
747
748 template <class Scalar, int dim, class Metric>
749 Scalar distance(Triangle<Scalar,dim> const& triangle, Point<Scalar,dim> const& point, Metric const& metric = Metric())
750 {
752 }
753
754 template <class Scalar, int dim, class Metric>
755 Scalar distance(Point<Scalar,dim> const& point, Rectangle<Scalar,dim> const& rectangle, Metric const& metric = Metric())
756 {
758 }
759
760 template <class Scalar, int dim, class Metric>
761 Scalar distance(Rectangle<Scalar,dim> const& rectangle, Point<Scalar,dim> const& point, Metric const& metric = Metric())
762 {
764 }
765
766 template <class Scalar, int dim, class Metric>
767 Scalar distance(Ball<Scalar,dim> const& ball, Point<Scalar,dim> const& point, Metric const& metric = Metric())
768 {
770 }
771
772 template <class Scalar, int dim, class Metric>
773 Scalar distance(Point<Scalar,dim> const& point, Ball<Scalar,dim> const& ball, Metric const& metric = Metric())
774 {
776 }
777
778 template <class Scalar, int dim, class Metric>
779 Scalar distance(Ball<Scalar,dim> const& ball, Line<Scalar,dim> const& line, Metric const& metric = Metric())
780 {
782 }
783
784 template <class Scalar, int dim, class Metric>
785 Scalar distance(Line<Scalar,dim> const& line, Ball<Scalar,dim> const& ball, Metric const& metric = Metric())
786 {
788 }
789
790 template <class Scalar, int dim, class Metric>
791 Scalar distance(Ball<Scalar,dim> const& ball, Triangle<Scalar,dim> const& triangle, Metric const& metric = Metric())
792 {
794 }
795
796 template <class Scalar, int dim, class Metric>
797 Scalar distance(Triangle<Scalar,dim> const& triangle, Ball<Scalar,dim> const& ball, Metric const& metric = Metric())
798 {
800 }
801
802 template <class Scalar, int dim, class Metric>
803 Scalar distance(Ball<Scalar,dim> const& ball, Rectangle<Scalar,dim> const& rectangle, Metric const& metric = Metric())
804 {
806 }
807
808 template <class Scalar, int dim, class Metric>
809 Scalar distance(Rectangle<Scalar,dim> const& rectangle, Ball<Scalar,dim> const& ball, Metric const& metric = Metric())
810 {
812 }
813
814 template <class Scalar, int dim, class Metric>
815 Scalar distance(Ball<Scalar,dim> const& ball, BoundingBox<Scalar,dim> const& boundingBox, Metric const& metric = Metric())
816 {
818 }
819
820// template <class Metric, class Scalar, int dim, class DuneSimplex>
821// Scalar distance(Ball<Scalar,dim> const& ball, DuneSimplex const& duneEntity)
822// {
823// typedef typename DuneSimplex::Geometry Geom;
824// return ImplementationDetail::DistanceImpl<Metric, Scalar, dim, Ball<Scalar,dim>, DuneSimplex >::apply(ball,duneEntity);
825// }
826
827 template <class Scalar, int dim, class Metric>
828 Scalar intersects(Ball<Scalar,dim> const& ball, BoundingBox<Scalar,dim> const& boundingBox, Metric const& metric = Metric())
829 {
831 }
832
833// template <class Metric, class Scalar, int dim, class DuneSimplex>
834// Scalar intersects(Ball<Scalar,dim> const& ball, DuneSimplex const& boundingBox)
835// {
836// typedef typename DuneSimplex::Geometry Geom;
837// return ImplementationDetail::IntersectionCheckImpl<Metric, Scalar, dim, Ball<Scalar,dim>, DuneSimplex>::apply(ball,duneEntity);
838// }
839}
840
841#endif /* GEOMETRIC_OBJECTS_HH_ */
Dune::FieldVector< Scalar, dim > Base
Point(Dune::FieldVector< Scalar, dim > const &p)
Some simple tools for geometric calculations. Please extend.
Dune::FieldVector< T, n > min(Dune::FieldVector< T, n > x, Dune::FieldVector< T, n > const &y)
Componentwise minimum.
Definition: fixdune.hh:122
std::pair< Dune::FieldVector< double, Cell::dimension >, Dune::FieldVector< double, Cell::dimension > > boundingBox(Cell const &cell)
Computes the bounding box of a cell.
Definition: fixdune.hh:766
Vector normalize(Vector &vector)
Normalize vector.
Definition: geomtools.hh:48
Scalar intersects(Ball< Scalar, dim > const &ball, BoundingBox< Scalar, dim > const &boundingBox, Metric const &metric=Metric())
FirstObject projectFirstOnSecond(FirstObject const &first, SecondObject const &second, ScalarProduct const &scalarProduct=ScalarProduct())
Scalar distance(Point< Scalar, dim > const &first, Point< Scalar, dim > const &second)
bool contains(Position const &x) const
Ball(Dune::FieldVector< Scalar, dim > &c, Scalar r)
Scalar distanceFromCenter(Position const &x) const
Dune::FieldVector< Scalar, dim > center
BoundingBox(BoundingBox const &boundingBox)
std::ostream & print(std::ostream &stream) const
Dune::FieldVector< std::pair< Scalar, Scalar >, dim > coord
BoundingBox(typename Point< Scalar, dim >::Base const &x)
bool contains(Coordinate const &x) const
void update(Coordinate const &x)
friend std::ostream & operator<<(std::ostream &stream, BoundingBox< Scalar, dim > const &boundingBox)
std::vector< Line< Scalar, dim > > edges
BoundingBox< Scalar, dim > Base
FastBoundingBox(FastBoundingBox const &boundingBox)
std::vector< Rectangle< Scalar, dim > > faces
std::vector< Point< Scalar, dim > > corners
std::vector< Point< Scalar, dim > > const & getStoredCorners() const
std::vector< Line< Scalar, dim > > const & getStoredEdges() const
std::vector< Rectangle< Scalar, dim > > const & getStoredFaces() const
static Scalar apply(Ball< Scalar, dim > const &ball, Rectangle< Scalar, dim > const &rectangle, Metric metric)
static Scalar apply(Ball< Scalar, dim > const &ball, Line< Scalar, dim > const &line, Metric metric)
static Scalar apply(Ball< Scalar, dim > const &ball, BoundingBox< Scalar, dim > const &boundingBox, Metric metric)
static Scalar apply(Ball< Scalar, dim > const &ball, Point< Scalar, dim > const &point, Metric metric)
static Scalar apply(Point< Scalar, dim > const &point, Line< Scalar, dim > const &line, Metric metric)
static Scalar apply(Point< Scalar, dim > const &firstPoint, Point< Scalar, dim > const &secondPoint, Metric metric)
static Scalar apply(Point< Scalar, dim > const &point, Rectangle< Scalar, dim > const &rectangle, Metric metric)
static bool apply(Ball< Scalar, dim > const &ball, BoundingBox< Scalar, dim > const &boundingBox, Metric metric)
static Point< Scalar, dim > apply(Point< Scalar, dim > const &point, Rectangle< Scalar, dim > const &rectangle, Scalar &a, Scalar &b, ScalarProduct const scalarProduct)
static Point< Scalar, dim > apply(Point< Scalar, dim > const &point, Line< Scalar, dim > const &line, Scalar &a, ScalarProduct const scalarProduct)
Point< Scalar, dim > end
Line(Point< Scalar, dim > const &s, Point< Scalar, dim > const &e)
Point< Scalar, dim > start
Rectangle(boost::array< Point< Scalar, dim >, 4 > const &e)
Rectangle(Point< Scalar, dim > const &p0, Point< Scalar, dim > const &p1, Point< Scalar, dim > const &p2, Point< Scalar, dim > const &p3)
boost::array< Point< Scalar, dim >, 4 > corners
Triangle(Vertex const &v1, Vertex const &v2, Vertex const &v3)
boost::array< Vertex, 3 > corners
Point< Scalar, dim > Vertex