Changes in src/Shapes/ShapeOps.cpp [5e588b5:cfda65]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/Shapes/ShapeOps.cpp ¶
r5e588b5 rcfda65 11 11 #include "Helpers/Assert.hpp" 12 12 13 /*************** Base case ***********************/ 14 15 ShapeOpsBase_impl::ShapeOpsBase_impl(const Shape::impl_ptr &_arg) : 16 arg(_arg){} 17 18 ShapeOpsBase_impl::~ShapeOpsBase_impl(){} 19 20 bool ShapeOpsBase_impl::isInside(const Vector &point){ 21 return arg->isInside(translateIn(point)); 22 } 23 24 bool ShapeOpsBase_impl::isOnSurface(const Vector &point){ 25 return arg->isOnSurface(translateIn(point)); 26 } 27 28 Vector ShapeOpsBase_impl::getNormal(const Vector &point) throw (NotOnSurfaceException){ 29 Vector helper = translateIn(point); 30 if(!arg->isOnSurface(helper)){ 31 throw NotOnSurfaceException(__FILE__,__LINE__); 32 } 33 return translateOutNormal(arg->getNormal(helper)); 34 } 35 36 Shape::impl_ptr ShapeOpsBase_impl::getArg(){ 37 return arg; 38 } 39 13 40 /********************* Resize ********************/ 14 41 15 42 Resize_impl::Resize_impl(const Shape::impl_ptr &_arg,double _size) : 16 arg(_arg), size(_size)43 ShapeOpsBase_impl(_arg), size(_size) 17 44 { 18 45 ASSERT(size>0,"Cannot resize a Shape to size zero or below"); … … 21 48 Resize_impl::~Resize_impl(){} 22 49 23 bool Resize_impl::isInside(const Vector& point){ 24 return arg->isInside((1/size) * point); 50 Vector Resize_impl::translateIn(const Vector& point){ 51 return (1/size) * point; 52 } 53 54 Vector Resize_impl::translateOutPos(const Vector& point){ 55 return size * point; 56 } 57 58 Vector Resize_impl::translateOutNormal(const Vector& point){ 59 return point; 60 } 61 62 string Resize_impl::toString(){ 63 stringstream sstr; 64 sstr << "resize(" << getArg()->toString() << "," << size << ")"; 65 return sstr.str(); 25 66 } 26 67 … … 33 74 34 75 Translate_impl::Translate_impl(const Shape::impl_ptr &_arg, const Vector &_offset) : 35 arg(_arg),offset(_offset)76 ShapeOpsBase_impl(_arg),offset(_offset) 36 77 {} 37 78 38 79 Translate_impl::~Translate_impl(){} 39 80 40 bool Translate_impl::isInside(const Vector& point){ 41 return arg->isInside(point-offset); 81 Vector Translate_impl::translateIn(const Vector& point){ 82 return point-offset; 83 } 84 85 Vector Translate_impl::translateOutPos(const Vector& point){ 86 return point+offset; 87 } 88 89 Vector Translate_impl::translateOutNormal(const Vector& point){ 90 return point; 91 } 92 93 string Translate_impl::toString(){ 94 stringstream sstr; 95 sstr << "translate(" << getArg()->toString() << "," << offset << ")"; 42 96 } 43 97 … … 50 104 51 105 Stretch_impl::Stretch_impl(const Shape::impl_ptr &_arg, const Vector &_factors) : 52 arg(_arg),factors(_factors)106 ShapeOpsBase_impl(_arg),factors(_factors) 53 107 { 54 108 ASSERT(factors[0]>0,"cannot stretch a shape by a negative amount"); … … 62 116 Stretch_impl::~Stretch_impl(){} 63 117 64 bool Stretch_impl::isInside(const Vector& point){118 Vector Stretch_impl::translateIn(const Vector& point){ 65 119 Vector helper=point; 66 120 helper.ScaleAll(reciFactors); 67 return arg->isInside(helper); 121 return helper; 122 } 123 124 Vector Stretch_impl::translateOutPos(const Vector& point){ 125 Vector helper=point; 126 helper.ScaleAll(factors); 127 return helper; 128 } 129 130 Vector Stretch_impl::translateOutNormal(const Vector& point){ 131 Vector helper=point; 132 // the normalFactors are derived from appearances of the factors 133 // with in the vectorproduct 134 Vector normalFactors; 135 normalFactors[0]=factors[1]*factors[2]; 136 normalFactors[1]=factors[0]*factors[2]; 137 normalFactors[2]=factors[0]*factors[1]; 138 helper.ScaleAll(normalFactors); 139 return helper; 140 } 141 142 string Stretch_impl::toString(){ 143 stringstream sstr; 144 sstr << "stretch(" << getArg()->toString() << "," << factors << ")"; 145 return sstr.str(); 68 146 } 69 147 … … 76 154 77 155 Transform_impl::Transform_impl(const Shape::impl_ptr &_arg, const Matrix &_transformation) : 78 arg(_arg),transformation(_transformation)156 ShapeOpsBase_impl(_arg),transformation(_transformation) 79 157 { 80 158 transformationInv = transformation.invert(); … … 83 161 Transform_impl::~Transform_impl(){} 84 162 85 bool Transform_impl::isInside(const Vector& point){ 86 return arg->isInside(transformationInv * point); 163 Vector Transform_impl::translateIn(const Vector& point){ 164 return transformationInv * point; 165 } 166 167 Vector Transform_impl::translateOutPos(const Vector& point){ 168 return transformation * point; 169 } 170 171 Vector Transform_impl::translateOutNormal(const Vector& point){ 172 Matrix mat = transformation.determinant() * transformation.invert().transpose(); 173 return mat * point; 174 } 175 176 string Transform_impl::toString(){ 177 stringstream sstr; 178 sstr << "transform(" << getArg()->toString() << "," << transformation << ")"; 179 return sstr.str(); 87 180 } 88 181
Note:
See TracChangeset
for help on using the changeset viewer.