| [e38447] | 1 | /*
 | 
|---|
 | 2 |  * BaseShapes_impl.cpp
 | 
|---|
 | 3 |  *
 | 
|---|
 | 4 |  *  Created on: Jun 18, 2010
 | 
|---|
 | 5 |  *      Author: crueger
 | 
|---|
 | 6 |  */
 | 
|---|
 | 7 | 
 | 
|---|
 | 8 | #include "Shapes/BaseShapes.hpp"
 | 
|---|
 | 9 | #include "Shapes/BaseShapes_impl.hpp"
 | 
|---|
| [f3526d] | 10 | #include "Shapes/ShapeOps.hpp"
 | 
|---|
| [e38447] | 11 | 
 | 
|---|
 | 12 | #include "vector.hpp"
 | 
|---|
| [5de9da] | 13 | #include "Helpers/Assert.hpp"
 | 
|---|
 | 14 | 
 | 
|---|
 | 15 | #include <cmath>
 | 
|---|
| [d76a7c] | 16 | #include <algorithm>
 | 
|---|
| [e38447] | 17 | 
 | 
|---|
 | 18 | bool Sphere_impl::isInside(const Vector &point){
 | 
|---|
 | 19 |   return point.NormSquared()<=1;
 | 
|---|
 | 20 | }
 | 
|---|
 | 21 | 
 | 
|---|
| [5de9da] | 22 | bool Sphere_impl::isOnSurface(const Vector &point){
 | 
|---|
 | 23 |   return fabs(point.NormSquared()-1)<MYEPSILON;
 | 
|---|
 | 24 | }
 | 
|---|
 | 25 | 
 | 
|---|
 | 26 | Vector Sphere_impl::getNormal(const Vector &point) throw(NotOnSurfaceException){
 | 
|---|
 | 27 |   if(!isOnSurface(point)){
 | 
|---|
 | 28 |     throw NotOnSurfaceException(__FILE__,__LINE__);
 | 
|---|
 | 29 |   }
 | 
|---|
 | 30 |   return point;
 | 
|---|
 | 31 | }
 | 
|---|
 | 32 | 
 | 
|---|
| [cfda65] | 33 | string Sphere_impl::toString(){
 | 
|---|
 | 34 |   return "Sphere()";
 | 
|---|
 | 35 | }
 | 
|---|
 | 36 | 
 | 
|---|
| [e38447] | 37 | Shape Sphere(){
 | 
|---|
 | 38 |   Shape::impl_ptr impl = Shape::impl_ptr(new Sphere_impl());
 | 
|---|
 | 39 |   return Shape(impl);
 | 
|---|
 | 40 | }
 | 
|---|
 | 41 | 
 | 
|---|
| [f3526d] | 42 | Shape Sphere(const Vector ¢er,double radius){
 | 
|---|
 | 43 |   return translate(resize(Sphere(),radius),center);
 | 
|---|
 | 44 | }
 | 
|---|
 | 45 | 
 | 
|---|
 | 46 | Shape Ellipsoid(const Vector ¢er, const Vector &radius){
 | 
|---|
 | 47 |   return translate(stretch(Sphere(),radius),center);
 | 
|---|
 | 48 | }
 | 
|---|
 | 49 | 
 | 
|---|
| [e38447] | 50 | bool Cuboid_impl::isInside(const Vector &point){
 | 
|---|
| [5de9da] | 51 |   return fabs(point[0])<=1 && fabs(point[1])<=1 && fabs(point[2])<=1;
 | 
|---|
 | 52 | }
 | 
|---|
 | 53 | 
 | 
|---|
 | 54 | bool Cuboid_impl::isOnSurface(const Vector &point){
 | 
|---|
 | 55 |   bool retVal = isInside(point);
 | 
|---|
 | 56 |   // test all borders of the cuboid
 | 
|---|
 | 57 |   // double fabs
 | 
|---|
 | 58 |   retVal = retVal &&
 | 
|---|
 | 59 |            ((fabs(fabs(point[0])-1)  < MYEPSILON) ||
 | 
|---|
 | 60 |             (fabs(fabs(point[1])-1)  < MYEPSILON) ||
 | 
|---|
 | 61 |             (fabs(fabs(point[2])-1)  < MYEPSILON));
 | 
|---|
 | 62 |   return retVal;
 | 
|---|
 | 63 | }
 | 
|---|
 | 64 | 
 | 
|---|
 | 65 | Vector Cuboid_impl::getNormal(const Vector &point) throw(NotOnSurfaceException){
 | 
|---|
 | 66 |   if(!isOnSurface(point)){
 | 
|---|
 | 67 |     throw NotOnSurfaceException(__FILE__,__LINE__);
 | 
|---|
 | 68 |   }
 | 
|---|
 | 69 |   Vector res;
 | 
|---|
 | 70 |   // figure out on which sides the Vector lies (maximum 3, when it is in a corner)
 | 
|---|
 | 71 |   for(int i=NDIM;i--;){
 | 
|---|
 | 72 |     if(fabs(fabs(point[i])-1)<MYEPSILON){
 | 
|---|
 | 73 |       // add the scaled (-1/+1) Vector to the set of surface vectors
 | 
|---|
 | 74 |       res[i] = point[i];
 | 
|---|
 | 75 |     }
 | 
|---|
 | 76 |   }
 | 
|---|
 | 77 |   ASSERT(res.NormSquared()>=1 && res.NormSquared()<=3,"To many or to few sides found for this Vector");
 | 
|---|
 | 78 | 
 | 
|---|
 | 79 |   res.Normalize();
 | 
|---|
 | 80 |   return res;
 | 
|---|
| [e38447] | 81 | }
 | 
|---|
 | 82 | 
 | 
|---|
| [cfda65] | 83 | string Cuboid_impl::toString(){
 | 
|---|
 | 84 |   return "Cuboid()";
 | 
|---|
 | 85 | }
 | 
|---|
 | 86 | 
 | 
|---|
| [e38447] | 87 | Shape Cuboid(){
 | 
|---|
| [5de9da] | 88 |   Shape::impl_ptr impl = Shape::impl_ptr(new Cuboid_impl());
 | 
|---|
| [e38447] | 89 |   return Shape(impl);
 | 
|---|
 | 90 | }
 | 
|---|
| [d76a7c] | 91 | 
 | 
|---|
 | 92 | Shape Cuboid(const Vector &corner1, const Vector &corner2){
 | 
|---|
 | 93 |   // make sure the two edges are upper left front and lower right back
 | 
|---|
 | 94 |   Vector sortedC1;
 | 
|---|
 | 95 |   Vector sortedC2;
 | 
|---|
 | 96 |   for(int i=NDIM;i--;){
 | 
|---|
 | 97 |     sortedC1[i] = min(corner1[i],corner2[i]);
 | 
|---|
 | 98 |     sortedC2[i] = max(corner1[i],corner2[i]);
 | 
|---|
 | 99 |     ASSERT(corner1[i]!=corner2[i],"Given points for cuboid edges did not define a valid space");
 | 
|---|
 | 100 |   }
 | 
|---|
 | 101 |   // get the middle point
 | 
|---|
 | 102 |   Vector middle = (1./2.)*(sortedC1+sortedC2);
 | 
|---|
 | 103 |   Vector factors = sortedC2-middle;
 | 
|---|
 | 104 |   return translate(stretch(Cuboid(),factors),middle);
 | 
|---|
 | 105 | }
 | 
|---|