Changes in src/Shapes/ShapeOps.cpp [955b91:c67c65]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/Shapes/ShapeOps.cpp ¶
r955b91 rc67c65 20 20 #include "CodePatterns/MemDebug.hpp" 21 21 22 #include <algorithm> 23 #include <boost/bind.hpp> 24 22 25 #include "Shapes/ShapeExceptions.hpp" 23 26 #include "Shapes/ShapeOps.hpp" … … 34 37 ShapeOpsBase_impl::~ShapeOpsBase_impl(){} 35 38 36 bool ShapeOpsBase_impl::isInside(const Vector &point) {39 bool ShapeOpsBase_impl::isInside(const Vector &point) const{ 37 40 return arg->isInside(translateIn(point)); 38 41 } 39 42 40 bool ShapeOpsBase_impl::isOnSurface(const Vector &point) {43 bool ShapeOpsBase_impl::isOnSurface(const Vector &point) const{ 41 44 return arg->isOnSurface(translateIn(point)); 42 45 } 43 46 44 Vector ShapeOpsBase_impl::getNormal(const Vector &point) throw (NotOnSurfaceException){47 Vector ShapeOpsBase_impl::getNormal(const Vector &point) const throw (NotOnSurfaceException){ 45 48 Vector helper = translateIn(point); 46 49 if(!arg->isOnSurface(helper)){ … … 52 55 } 53 56 54 LineSegmentSet ShapeOpsBase_impl::getLineIntersections(const Line &line){ 57 Vector ShapeOpsBase_impl::getCenter() const 58 { 59 return arg->getCenter(); 60 } 61 62 double ShapeOpsBase_impl::getRadius() const 63 { 64 return translateOutPos(Vector(arg->getRadius(), 0., 0.)).Norm(); 65 } 66 67 68 LineSegmentSet ShapeOpsBase_impl::getLineIntersections(const Line &line) const{ 55 69 Line newLine(translateIn(line.getOrigin()),translateIn(line.getDirection())); 56 70 LineSegmentSet res(line); … … 71 85 } 72 86 87 enum ShapeType ShapeOpsBase_impl::getType() const { 88 return getArg()->getType(); 89 } 90 73 91 std::vector<Vector> ShapeOpsBase_impl::getHomogeneousPointsOnSurface(const size_t N) const { 74 return getArg()->getHomogeneousPointsOnSurface(N);; 92 return getArg()->getHomogeneousPointsOnSurface(N); 93 } 94 95 std::vector<Vector> ShapeOpsBase_impl::getHomogeneousPointsInVolume(const size_t N) const { 96 return getArg()->getHomogeneousPointsInVolume(N); 75 97 } 76 98 … … 89 111 Resize_impl::~Resize_impl(){} 90 112 91 bool Resize_impl::isInside(const Vector& point){ 113 double Resize_impl::getVolume() const 114 { 115 return getArg()->getVolume() * size; 116 } 117 118 double Resize_impl::getSurfaceArea() const 119 { 120 return getArg()->getSurfaceArea() * size; 121 } 122 123 124 bool Resize_impl::isInside(const Vector& point) const{ 92 125 return getArg()->isInside((1/size) * point); 93 126 } 94 127 95 Vector Resize_impl::translateIn(const Vector& point) {128 Vector Resize_impl::translateIn(const Vector& point) const{ 96 129 return (1/size) * point; 97 130 } 98 131 99 Vector Resize_impl::translateOutPos(const Vector& point) {132 Vector Resize_impl::translateOutPos(const Vector& point) const{ 100 133 return size * point; 101 134 } 102 135 103 Vector Resize_impl::translateOutNormal(const Vector& point) {136 Vector Resize_impl::translateOutNormal(const Vector& point) const{ 104 137 return point; 105 138 } 106 139 107 std::string Resize_impl::toString() {140 std::string Resize_impl::toString() const{ 108 141 std::stringstream sstr; 109 142 sstr << "resize(" << getArg()->toString() << "," << size << ")"; … … 113 146 std::vector<Vector> Resize_impl::getHomogeneousPointsOnSurface(const size_t N) const { 114 147 std::vector<Vector> PointsOnSurface = getArg()->getHomogeneousPointsOnSurface(N); 115 for(std::vector<Vector>::iterator iter = PointsOnSurface.begin(); iter != PointsOnSurface.end(); ++iter) { 116 *iter *= size; 117 } 118 return PointsOnSurface; 148 std::for_each(PointsOnSurface.begin(), PointsOnSurface.end(), 149 boost::bind(&Vector::operator*, _1, size) ); 150 return PointsOnSurface; 151 } 152 153 std::vector<Vector> Resize_impl::getHomogeneousPointsInVolume(const size_t N) const { 154 std::vector<Vector> PointsOnSurface = getArg()->getHomogeneousPointsInVolume(N); 155 std::for_each(PointsOnSurface.begin(), PointsOnSurface.end(), 156 boost::bind(&Vector::operator*, _1, size) ); 157 return std::vector<Vector>(); 119 158 } 120 159 … … 133 172 Translate_impl::~Translate_impl(){} 134 173 135 bool Translate_impl::isInside(const Vector& point) {174 bool Translate_impl::isInside(const Vector& point) const{ 136 175 return getArg()->isInside(point-offset); 137 176 } 138 177 139 Vector Translate_impl::translateIn(const Vector& point){ 178 Vector Translate_impl::getCenter() const 179 { 180 return getArg()->getCenter()+offset; 181 } 182 183 double Translate_impl::getRadius() const 184 { 185 return getArg()->getRadius(); 186 } 187 188 double Translate_impl::getVolume() const 189 { 190 return getArg()->getVolume(); 191 } 192 193 double Translate_impl::getSurfaceArea() const 194 { 195 return getArg()->getSurfaceArea(); 196 } 197 198 Vector Translate_impl::translateIn(const Vector& point) const{ 140 199 return point-offset; 141 200 } 142 201 143 Vector Translate_impl::translateOutPos(const Vector& point) {202 Vector Translate_impl::translateOutPos(const Vector& point) const{ 144 203 return point+offset; 145 204 } 146 205 147 Vector Translate_impl::translateOutNormal(const Vector& point) {206 Vector Translate_impl::translateOutNormal(const Vector& point) const{ 148 207 return point; 149 208 } 150 209 151 std::string Translate_impl::toString() {210 std::string Translate_impl::toString() const{ 152 211 std::stringstream sstr; 153 212 sstr << "translate(" << getArg()->toString() << "," << offset << ")"; … … 157 216 std::vector<Vector> Translate_impl::getHomogeneousPointsOnSurface(const size_t N) const { 158 217 std::vector<Vector> PointsOnSurface = getArg()->getHomogeneousPointsOnSurface(N); 159 for(std::vector<Vector>::iterator iter = PointsOnSurface.begin(); iter != PointsOnSurface.end(); ++iter) { 160 *iter += offset; 161 } 218 std::for_each(PointsOnSurface.begin(), PointsOnSurface.end(), 219 boost::bind(&Vector::operator+, _1, offset) ); 220 return PointsOnSurface; 221 } 222 223 std::vector<Vector> Translate_impl::getHomogeneousPointsInVolume(const size_t N) const { 224 std::vector<Vector> PointsOnSurface = getArg()->getHomogeneousPointsInVolume(N); 225 std::for_each(PointsOnSurface.begin(), PointsOnSurface.end(), 226 boost::bind(&Vector::operator+, _1, offset) ); 162 227 return PointsOnSurface; 163 228 } … … 173 238 ShapeOpsBase_impl(_arg),factors(_factors) 174 239 { 175 ASSERT(factors[0]>0,"cannot stretch a shape by a negative amount");176 ASSERT(factors[1]>0,"cannot stretch a shape by a negative amount");177 ASSERT(factors[2]>0,"cannot stretch a shape by a negative amount");178 240 for(int i = NDIM;i--;){ 179 reciFactors[i] = 1/factors[i]; 241 ASSERT(factors[i]>0.,"cannot stretch a shape by a negative amount"); 242 reciFactors[i] = 1./factors[i]; 180 243 } 181 244 } … … 183 246 Stretch_impl::~Stretch_impl(){} 184 247 185 bool Stretch_impl::isInside(const Vector& point){ 248 double Stretch_impl::getVolume() const 249 { 250 // TODO 251 return -1.; 252 } 253 254 double Stretch_impl::getSurfaceArea() const 255 { 256 // TODO 257 return -1.; 258 } 259 260 bool Stretch_impl::isInside(const Vector& point) const{ 186 261 Vector helper=point; 187 262 helper.ScaleAll(reciFactors); … … 189 264 } 190 265 191 Vector Stretch_impl::translateIn(const Vector& point) {266 Vector Stretch_impl::translateIn(const Vector& point) const{ 192 267 Vector helper=point; 193 268 helper.ScaleAll(reciFactors); … … 195 270 } 196 271 197 Vector Stretch_impl::translateOutPos(const Vector& point) {272 Vector Stretch_impl::translateOutPos(const Vector& point) const{ 198 273 Vector helper=point; 199 274 helper.ScaleAll(factors); … … 201 276 } 202 277 203 Vector Stretch_impl::translateOutNormal(const Vector& point) {278 Vector Stretch_impl::translateOutNormal(const Vector& point) const{ 204 279 Vector helper=point; 205 280 // the normalFactors are derived from appearances of the factors … … 213 288 } 214 289 215 std::string Stretch_impl::toString() {290 std::string Stretch_impl::toString() const{ 216 291 std::stringstream sstr; 217 292 sstr << "stretch(" << getArg()->toString() << "," << factors << ")"; … … 221 296 std::vector<Vector> Stretch_impl::getHomogeneousPointsOnSurface(const size_t N) const { 222 297 std::vector<Vector> PointsOnSurface = getArg()->getHomogeneousPointsOnSurface(N); 223 for(std::vector<Vector>::iterator iter = PointsOnSurface.begin(); iter != PointsOnSurface.end(); ++iter) { 224 (*iter).ScaleAll(reciFactors); 225 } 298 std::for_each(PointsOnSurface.begin(), PointsOnSurface.end(), 299 boost::bind( static_cast<void (Vector::*)(const Vector&)>(&Vector::ScaleAll), _1, reciFactors) ); 300 return PointsOnSurface; 301 } 302 303 std::vector<Vector> Stretch_impl::getHomogeneousPointsInVolume(const size_t N) const { 304 std::vector<Vector> PointsOnSurface = getArg()->getHomogeneousPointsInVolume(N); 305 std::for_each(PointsOnSurface.begin(), PointsOnSurface.end(), 306 boost::bind( static_cast<void (Vector::*)(const Vector&)>(&Vector::ScaleAll), _1, reciFactors) ); 226 307 return PointsOnSurface; 227 308 } … … 242 323 Transform_impl::~Transform_impl(){} 243 324 244 bool Transform_impl::isInside(const Vector& point){ 325 double Transform_impl::getVolume() const 326 { 327 return getArg()->getVolume(); 328 } 329 330 double Transform_impl::getSurfaceArea() const 331 { 332 return getArg()->getSurfaceArea(); 333 } 334 335 bool Transform_impl::isInside(const Vector& point) const{ 245 336 return getArg()->isInside(transformationInv * point); 246 337 } 247 338 248 Vector Transform_impl::translateIn(const Vector& point) {339 Vector Transform_impl::translateIn(const Vector& point) const{ 249 340 return transformationInv * point; 250 341 } 251 342 252 Vector Transform_impl::translateOutPos(const Vector& point) {343 Vector Transform_impl::translateOutPos(const Vector& point) const{ 253 344 return transformation * point; 254 345 } 255 346 256 Vector Transform_impl::translateOutNormal(const Vector& point){ 347 Vector Transform_impl::translateOutNormal(const Vector& point) const 348 { 257 349 RealSpaceMatrix mat = transformation.invert().transpose(); 258 350 return mat * point; 259 351 } 260 352 261 std::string Transform_impl::toString() {353 std::string Transform_impl::toString() const{ 262 354 std::stringstream sstr; 263 355 sstr << "transform(" << getArg()->toString() << "," << transformation << ")"; … … 267 359 std::vector<Vector> Transform_impl::getHomogeneousPointsOnSurface(const size_t N) const { 268 360 std::vector<Vector> PointsOnSurface = getArg()->getHomogeneousPointsOnSurface(N); 269 for(std::vector<Vector>::iterator iter = PointsOnSurface.begin(); iter != PointsOnSurface.end(); ++iter) { 270 *iter = transformation * (*iter); 271 } 361 std::transform( PointsOnSurface.begin(), PointsOnSurface.end(), PointsOnSurface.begin(), 362 boost::bind(static_cast<Vector(*)(const RealSpaceMatrix&,const Vector&)>(operator*), transformation, _1)); 363 return PointsOnSurface; 364 } 365 366 std::vector<Vector> Transform_impl::getHomogeneousPointsInVolume(const size_t N) const { 367 std::vector<Vector> PointsOnSurface = getArg()->getHomogeneousPointsInVolume(N); 368 std::transform( PointsOnSurface.begin(), PointsOnSurface.end(), PointsOnSurface.begin(), 369 boost::bind(static_cast<Vector(*)(const RealSpaceMatrix&,const Vector&)>(operator*), transformation, _1)); 272 370 return PointsOnSurface; 273 371 }
Note:
See TracChangeset
for help on using the changeset viewer.