Changes in src/Shapes/ShapeOps.cpp [79dd0e:5e588b5]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Shapes/ShapeOps.cpp
r79dd0e r5e588b5 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 40 13 /********************* Resize ********************/ 41 14 42 15 Resize_impl::Resize_impl(const Shape::impl_ptr &_arg,double _size) : 43 ShapeOpsBase_impl(_arg), size(_size)16 arg(_arg), size(_size) 44 17 { 45 18 ASSERT(size>0,"Cannot resize a Shape to size zero or below"); … … 48 21 Resize_impl::~Resize_impl(){} 49 22 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(); 23 bool Resize_impl::isInside(const Vector& point){ 24 return arg->isInside((1/size) * point); 66 25 } 67 26 … … 74 33 75 34 Translate_impl::Translate_impl(const Shape::impl_ptr &_arg, const Vector &_offset) : 76 ShapeOpsBase_impl(_arg),offset(_offset)35 arg(_arg),offset(_offset) 77 36 {} 78 37 79 38 Translate_impl::~Translate_impl(){} 80 39 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 << ")"; 96 return sstr.str(); 40 bool Translate_impl::isInside(const Vector& point){ 41 return arg->isInside(point-offset); 97 42 } 98 43 … … 105 50 106 51 Stretch_impl::Stretch_impl(const Shape::impl_ptr &_arg, const Vector &_factors) : 107 ShapeOpsBase_impl(_arg),factors(_factors)52 arg(_arg),factors(_factors) 108 53 { 109 54 ASSERT(factors[0]>0,"cannot stretch a shape by a negative amount"); … … 117 62 Stretch_impl::~Stretch_impl(){} 118 63 119 Vector Stretch_impl::translateIn(const Vector& point){64 bool Stretch_impl::isInside(const Vector& point){ 120 65 Vector helper=point; 121 66 helper.ScaleAll(reciFactors); 122 return helper; 123 } 124 125 Vector Stretch_impl::translateOutPos(const Vector& point){ 126 Vector helper=point; 127 helper.ScaleAll(factors); 128 return helper; 129 } 130 131 Vector Stretch_impl::translateOutNormal(const Vector& point){ 132 Vector helper=point; 133 // the normalFactors are derived from appearances of the factors 134 // with in the vectorproduct 135 Vector normalFactors; 136 normalFactors[0]=factors[1]*factors[2]; 137 normalFactors[1]=factors[0]*factors[2]; 138 normalFactors[2]=factors[0]*factors[1]; 139 helper.ScaleAll(normalFactors); 140 return helper; 141 } 142 143 string Stretch_impl::toString(){ 144 stringstream sstr; 145 sstr << "stretch(" << getArg()->toString() << "," << factors << ")"; 146 return sstr.str(); 67 return arg->isInside(helper); 147 68 } 148 69 … … 155 76 156 77 Transform_impl::Transform_impl(const Shape::impl_ptr &_arg, const Matrix &_transformation) : 157 ShapeOpsBase_impl(_arg),transformation(_transformation)78 arg(_arg),transformation(_transformation) 158 79 { 159 80 transformationInv = transformation.invert(); … … 162 83 Transform_impl::~Transform_impl(){} 163 84 164 Vector Transform_impl::translateIn(const Vector& point){ 165 return transformationInv * point; 166 } 167 168 Vector Transform_impl::translateOutPos(const Vector& point){ 169 return transformation * point; 170 } 171 172 Vector Transform_impl::translateOutNormal(const Vector& point){ 173 Matrix mat = transformation.determinant() * transformation.invert().transpose(); 174 return mat * point; 175 } 176 177 string Transform_impl::toString(){ 178 stringstream sstr; 179 sstr << "transform(" << getArg()->toString() << "," << transformation << ")"; 180 return sstr.str(); 85 bool Transform_impl::isInside(const Vector& point){ 86 return arg->isInside(transformationInv * point); 181 87 } 182 88
Note:
See TracChangeset
for help on using the changeset viewer.