Changes in src/Shapes/ShapeOps.cpp [cfda65:5e588b5]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Shapes/ShapeOps.cpp
rcfda65 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 << ")"; 40 bool Translate_impl::isInside(const Vector& point){ 41 return arg->isInside(point-offset); 96 42 } 97 43 … … 104 50 105 51 Stretch_impl::Stretch_impl(const Shape::impl_ptr &_arg, const Vector &_factors) : 106 ShapeOpsBase_impl(_arg),factors(_factors)52 arg(_arg),factors(_factors) 107 53 { 108 54 ASSERT(factors[0]>0,"cannot stretch a shape by a negative amount"); … … 116 62 Stretch_impl::~Stretch_impl(){} 117 63 118 Vector Stretch_impl::translateIn(const Vector& point){64 bool Stretch_impl::isInside(const Vector& point){ 119 65 Vector helper=point; 120 66 helper.ScaleAll(reciFactors); 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(); 67 return arg->isInside(helper); 146 68 } 147 69 … … 154 76 155 77 Transform_impl::Transform_impl(const Shape::impl_ptr &_arg, const Matrix &_transformation) : 156 ShapeOpsBase_impl(_arg),transformation(_transformation)78 arg(_arg),transformation(_transformation) 157 79 { 158 80 transformationInv = transformation.invert(); … … 161 83 Transform_impl::~Transform_impl(){} 162 84 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(); 85 bool Transform_impl::isInside(const Vector& point){ 86 return arg->isInside(transformationInv * point); 180 87 } 181 88
Note:
See TracChangeset
for help on using the changeset viewer.