Changes in src/Shapes/ShapeOps.cpp [5e588b5:f12805]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Shapes/ShapeOps.cpp
r5e588b5 rf12805 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 Vector res = translateOutNormal(arg->getNormal(helper)); 34 res.Normalize(); 35 return res; 36 } 37 38 LineSegmentSet ShapeOpsBase_impl::getLineIntersections(const Line &line){ 39 Line newLine(translateIn(line.getOrigin()),translateIn(line.getDirection())); 40 LineSegmentSet res(line); 41 LineSegmentSet helper = getArg()->getLineIntersections(newLine); 42 for(LineSegmentSet::iterator iter = helper.begin();iter!=helper.end();++iter){ 43 LinePoint lpBegin = iter->getBegin(); 44 LinePoint lpEnd = iter->getBegin(); 45 // translate both linepoints 46 lpBegin = lpBegin.isNegInfinity()? 47 line.negEndpoint(): 48 line.getLinePoint(translateOutPos(lpBegin.getPoint())); 49 lpEnd = lpEnd.isPosInfinity()? 50 line.posEndpoint(): 51 line.getLinePoint(translateOutPos(lpEnd.getPoint())); 52 res.insert(LineSegment(lpBegin,lpEnd)); 53 } 54 return res; 55 } 56 57 Shape::impl_ptr ShapeOpsBase_impl::getArg(){ 58 return arg; 59 } 60 13 61 /********************* Resize ********************/ 14 62 15 63 Resize_impl::Resize_impl(const Shape::impl_ptr &_arg,double _size) : 16 arg(_arg), size(_size)64 ShapeOpsBase_impl(_arg), size(_size) 17 65 { 18 66 ASSERT(size>0,"Cannot resize a Shape to size zero or below"); … … 21 69 Resize_impl::~Resize_impl(){} 22 70 23 bool Resize_impl::isInside(const Vector& point){ 24 return arg->isInside((1/size) * point); 71 Vector Resize_impl::translateIn(const Vector& point){ 72 return (1/size) * point; 73 } 74 75 Vector Resize_impl::translateOutPos(const Vector& point){ 76 return size * point; 77 } 78 79 Vector Resize_impl::translateOutNormal(const Vector& point){ 80 return point; 81 } 82 83 string Resize_impl::toString(){ 84 stringstream sstr; 85 sstr << "resize(" << getArg()->toString() << "," << size << ")"; 86 return sstr.str(); 25 87 } 26 88 … … 33 95 34 96 Translate_impl::Translate_impl(const Shape::impl_ptr &_arg, const Vector &_offset) : 35 arg(_arg),offset(_offset)97 ShapeOpsBase_impl(_arg),offset(_offset) 36 98 {} 37 99 38 100 Translate_impl::~Translate_impl(){} 39 101 40 bool Translate_impl::isInside(const Vector& point){ 41 return arg->isInside(point-offset); 102 Vector Translate_impl::translateIn(const Vector& point){ 103 return point-offset; 104 } 105 106 Vector Translate_impl::translateOutPos(const Vector& point){ 107 return point+offset; 108 } 109 110 Vector Translate_impl::translateOutNormal(const Vector& point){ 111 return point; 112 } 113 114 string Translate_impl::toString(){ 115 stringstream sstr; 116 sstr << "translate(" << getArg()->toString() << "," << offset << ")"; 117 return sstr.str(); 42 118 } 43 119 … … 50 126 51 127 Stretch_impl::Stretch_impl(const Shape::impl_ptr &_arg, const Vector &_factors) : 52 arg(_arg),factors(_factors)128 ShapeOpsBase_impl(_arg),factors(_factors) 53 129 { 54 130 ASSERT(factors[0]>0,"cannot stretch a shape by a negative amount"); … … 62 138 Stretch_impl::~Stretch_impl(){} 63 139 64 bool Stretch_impl::isInside(const Vector& point){140 Vector Stretch_impl::translateIn(const Vector& point){ 65 141 Vector helper=point; 66 142 helper.ScaleAll(reciFactors); 67 return arg->isInside(helper); 143 return helper; 144 } 145 146 Vector Stretch_impl::translateOutPos(const Vector& point){ 147 Vector helper=point; 148 helper.ScaleAll(factors); 149 return helper; 150 } 151 152 Vector Stretch_impl::translateOutNormal(const Vector& point){ 153 Vector helper=point; 154 // the normalFactors are derived from appearances of the factors 155 // with in the vectorproduct 156 Vector normalFactors; 157 normalFactors[0]=factors[1]*factors[2]; 158 normalFactors[1]=factors[0]*factors[2]; 159 normalFactors[2]=factors[0]*factors[1]; 160 helper.ScaleAll(normalFactors); 161 return helper; 162 } 163 164 string Stretch_impl::toString(){ 165 stringstream sstr; 166 sstr << "stretch(" << getArg()->toString() << "," << factors << ")"; 167 return sstr.str(); 68 168 } 69 169 … … 76 176 77 177 Transform_impl::Transform_impl(const Shape::impl_ptr &_arg, const Matrix &_transformation) : 78 arg(_arg),transformation(_transformation)178 ShapeOpsBase_impl(_arg),transformation(_transformation) 79 179 { 80 180 transformationInv = transformation.invert(); … … 83 183 Transform_impl::~Transform_impl(){} 84 184 85 bool Transform_impl::isInside(const Vector& point){ 86 return arg->isInside(transformationInv * point); 185 Vector Transform_impl::translateIn(const Vector& point){ 186 return transformationInv * point; 187 } 188 189 Vector Transform_impl::translateOutPos(const Vector& point){ 190 return transformation * point; 191 } 192 193 Vector Transform_impl::translateOutNormal(const Vector& point){ 194 Matrix mat = transformation.invert().transpose(); 195 return mat * point; 196 } 197 198 string Transform_impl::toString(){ 199 stringstream sstr; 200 sstr << "transform(" << getArg()->toString() << "," << transformation << ")"; 201 return sstr.str(); 87 202 } 88 203
Note:
See TracChangeset
for help on using the changeset viewer.