Changes in src/Shapes/BaseShapes.cpp [c6f395:e38447]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Shapes/BaseShapes.cpp
rc6f395 re38447 8 8 #include "Shapes/BaseShapes.hpp" 9 9 #include "Shapes/BaseShapes_impl.hpp" 10 #include "Shapes/ShapeOps.hpp"11 10 12 11 #include "vector.hpp" 13 #include "Helpers/Assert.hpp"14 15 #include "Line.hpp"16 #include "Plane.hpp"17 #include "LineSegment.hpp"18 #include "LineSegmentSet.hpp"19 20 #include <cmath>21 #include <algorithm>22 12 23 13 bool Sphere_impl::isInside(const Vector &point){ 24 14 return point.NormSquared()<=1; 25 }26 27 bool Sphere_impl::isOnSurface(const Vector &point){28 return fabs(point.NormSquared()-1)<MYEPSILON;29 }30 31 Vector Sphere_impl::getNormal(const Vector &point) throw(NotOnSurfaceException){32 if(!isOnSurface(point)){33 throw NotOnSurfaceException(__FILE__,__LINE__);34 }35 return point;36 }37 38 LineSegmentSet Sphere_impl::getLineIntersections(const Line &line){39 LineSegmentSet res(line);40 std::vector<Vector> intersections = line.getSphereIntersections();41 if(intersections.size()==2){42 res.insert(LineSegment(intersections[0],intersections[1]));43 }44 return res;45 }46 47 string Sphere_impl::toString(){48 return "Sphere()";49 15 } 50 16 … … 54 20 } 55 21 56 Shape Sphere(const Vector ¢er,double radius){57 return translate(resize(Sphere(),radius),center);58 }59 60 Shape Ellipsoid(const Vector ¢er, const Vector &radius){61 return translate(stretch(Sphere(),radius),center);62 }63 64 22 bool Cuboid_impl::isInside(const Vector &point){ 65 return fabs(point[0])<=1 && fabs(point[1])<=1 && fabs(point[2])<=1; 66 } 67 68 bool Cuboid_impl::isOnSurface(const Vector &point){ 69 bool retVal = isInside(point); 70 // test all borders of the cuboid 71 // double fabs 72 retVal = retVal && 73 ((fabs(fabs(point[0])-1) < MYEPSILON) || 74 (fabs(fabs(point[1])-1) < MYEPSILON) || 75 (fabs(fabs(point[2])-1) < MYEPSILON)); 76 return retVal; 77 } 78 79 Vector Cuboid_impl::getNormal(const Vector &point) throw(NotOnSurfaceException){ 80 if(!isOnSurface(point)){ 81 throw NotOnSurfaceException(__FILE__,__LINE__); 82 } 83 Vector res; 84 // figure out on which sides the Vector lies (maximum 3, when it is in a corner) 85 for(int i=NDIM;i--;){ 86 if(fabs(fabs(point[i])-1)<MYEPSILON){ 87 // add the scaled (-1/+1) Vector to the set of surface vectors 88 res[i] = point[i]; 89 } 90 } 91 ASSERT(res.NormSquared()>=1 && res.NormSquared()<=3,"To many or to few sides found for this Vector"); 92 93 res.Normalize(); 94 return res; 95 } 96 97 LineSegmentSet Cuboid_impl::getLineIntersections(const Line &line){ 98 LineSegmentSet res(line); 99 // get the intersection on each of the six faces 100 vector<Vector> intersections; 101 intersections.resize(2); 102 int c=0; 103 int x[2]={-1,+1}; 104 for(int i=NDIM;i--;){ 105 for(int p=0;p<2;++p){ 106 if(c==2) goto end; // I know this sucks, but breaking two loops is stupid 107 Vector base; 108 base[i]=x[p]; 109 // base now points to the surface and is normal to it at the same time 110 Plane p(base,base); 111 Vector intersection = p.GetIntersection(line); 112 if(isInside(intersection)){ 113 // if we have a point on the edge it might already be contained 114 if(c==1 && intersections[0]==intersection) 115 continue; 116 intersections[c++]=intersection; 117 } 118 } 119 } 120 end: 121 if(c==2){ 122 res.insert(LineSegment(intersections[0],intersections[1])); 123 } 124 return res; 125 } 126 127 string Cuboid_impl::toString(){ 128 return "Cuboid()"; 23 return point[0]<=1 && point[1]<=1 && point[2]<=1; 129 24 } 130 25 131 26 Shape Cuboid(){ 132 Shape::impl_ptr impl = Shape::impl_ptr(new Cuboid_impl());27 Shape::impl_ptr impl = Shape::impl_ptr(new Sphere_impl()); 133 28 return Shape(impl); 134 29 } 135 136 Shape Cuboid(const Vector &corner1, const Vector &corner2){137 // make sure the two edges are upper left front and lower right back138 Vector sortedC1;139 Vector sortedC2;140 for(int i=NDIM;i--;){141 sortedC1[i] = min(corner1[i],corner2[i]);142 sortedC2[i] = max(corner1[i],corner2[i]);143 ASSERT(corner1[i]!=corner2[i],"Given points for cuboid edges did not define a valid space");144 }145 // get the middle point146 Vector middle = (1./2.)*(sortedC1+sortedC2);147 Vector factors = sortedC2-middle;148 return translate(stretch(Cuboid(),factors),middle);149 }
Note:
See TracChangeset
for help on using the changeset viewer.