Changes in src/Shapes/ShapeOps.cpp [f12805:5e588b5]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Shapes/ShapeOps.cpp
rf12805 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 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 linepoints46 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 61 13 /********************* Resize ********************/ 62 14 63 15 Resize_impl::Resize_impl(const Shape::impl_ptr &_arg,double _size) : 64 ShapeOpsBase_impl(_arg), size(_size)16 arg(_arg), size(_size) 65 17 { 66 18 ASSERT(size>0,"Cannot resize a Shape to size zero or below"); … … 69 21 Resize_impl::~Resize_impl(){} 70 22 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(); 23 bool Resize_impl::isInside(const Vector& point){ 24 return arg->isInside((1/size) * point); 87 25 } 88 26 … … 95 33 96 34 Translate_impl::Translate_impl(const Shape::impl_ptr &_arg, const Vector &_offset) : 97 ShapeOpsBase_impl(_arg),offset(_offset)35 arg(_arg),offset(_offset) 98 36 {} 99 37 100 38 Translate_impl::~Translate_impl(){} 101 39 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(); 40 bool Translate_impl::isInside(const Vector& point){ 41 return arg->isInside(point-offset); 118 42 } 119 43 … … 126 50 127 51 Stretch_impl::Stretch_impl(const Shape::impl_ptr &_arg, const Vector &_factors) : 128 ShapeOpsBase_impl(_arg),factors(_factors)52 arg(_arg),factors(_factors) 129 53 { 130 54 ASSERT(factors[0]>0,"cannot stretch a shape by a negative amount"); … … 138 62 Stretch_impl::~Stretch_impl(){} 139 63 140 Vector Stretch_impl::translateIn(const Vector& point){64 bool Stretch_impl::isInside(const Vector& point){ 141 65 Vector helper=point; 142 66 helper.ScaleAll(reciFactors); 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(); 67 return arg->isInside(helper); 168 68 } 169 69 … … 176 76 177 77 Transform_impl::Transform_impl(const Shape::impl_ptr &_arg, const Matrix &_transformation) : 178 ShapeOpsBase_impl(_arg),transformation(_transformation)78 arg(_arg),transformation(_transformation) 179 79 { 180 80 transformationInv = transformation.invert(); … … 183 83 Transform_impl::~Transform_impl(){} 184 84 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(); 85 bool Transform_impl::isInside(const Vector& point){ 86 return arg->isInside(transformationInv * point); 202 87 } 203 88
Note:
See TracChangeset
for help on using the changeset viewer.