Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified src/Shapes/ShapeOps.cpp

    r5e588b5 rcfda65  
    1111#include "Helpers/Assert.hpp"
    1212
     13/*************** Base case ***********************/
     14
     15ShapeOpsBase_impl::ShapeOpsBase_impl(const Shape::impl_ptr &_arg) :
     16  arg(_arg){}
     17
     18ShapeOpsBase_impl::~ShapeOpsBase_impl(){}
     19
     20bool ShapeOpsBase_impl::isInside(const Vector &point){
     21  return arg->isInside(translateIn(point));
     22}
     23
     24bool ShapeOpsBase_impl::isOnSurface(const Vector &point){
     25  return arg->isOnSurface(translateIn(point));
     26}
     27
     28Vector 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
     36Shape::impl_ptr ShapeOpsBase_impl::getArg(){
     37  return arg;
     38}
     39
    1340/********************* Resize ********************/
    1441
    1542Resize_impl::Resize_impl(const Shape::impl_ptr &_arg,double _size) :
    16   arg(_arg), size(_size)
     43  ShapeOpsBase_impl(_arg), size(_size)
    1744{
    1845  ASSERT(size>0,"Cannot resize a Shape to size zero or below");
     
    2148Resize_impl::~Resize_impl(){}
    2249
    23 bool Resize_impl::isInside(const Vector& point){
    24   return arg->isInside((1/size) * point);
     50Vector Resize_impl::translateIn(const Vector& point){
     51  return (1/size) * point;
     52}
     53
     54Vector Resize_impl::translateOutPos(const Vector& point){
     55  return size * point;
     56}
     57
     58Vector Resize_impl::translateOutNormal(const Vector& point){
     59  return point;
     60}
     61
     62string Resize_impl::toString(){
     63  stringstream sstr;
     64  sstr << "resize(" << getArg()->toString() << "," << size << ")";
     65  return sstr.str();
    2566}
    2667
     
    3374
    3475Translate_impl::Translate_impl(const Shape::impl_ptr &_arg, const Vector &_offset) :
    35   arg(_arg),offset(_offset)
     76  ShapeOpsBase_impl(_arg),offset(_offset)
    3677{}
    3778
    3879Translate_impl::~Translate_impl(){}
    3980
    40 bool Translate_impl::isInside(const Vector& point){
    41   return arg->isInside(point-offset);
     81Vector Translate_impl::translateIn(const Vector& point){
     82  return point-offset;
     83}
     84
     85Vector Translate_impl::translateOutPos(const Vector& point){
     86  return point+offset;
     87}
     88
     89Vector Translate_impl::translateOutNormal(const Vector& point){
     90  return point;
     91}
     92
     93string Translate_impl::toString(){
     94  stringstream sstr;
     95  sstr << "translate(" << getArg()->toString() << "," << offset << ")";
    4296}
    4397
     
    50104
    51105Stretch_impl::Stretch_impl(const Shape::impl_ptr &_arg, const Vector &_factors) :
    52   arg(_arg),factors(_factors)
     106  ShapeOpsBase_impl(_arg),factors(_factors)
    53107{
    54108  ASSERT(factors[0]>0,"cannot stretch a shape by a negative amount");
     
    62116Stretch_impl::~Stretch_impl(){}
    63117
    64 bool Stretch_impl::isInside(const Vector& point){
     118Vector Stretch_impl::translateIn(const Vector& point){
    65119  Vector helper=point;
    66120  helper.ScaleAll(reciFactors);
    67   return arg->isInside(helper);
     121  return helper;
     122}
     123
     124Vector Stretch_impl::translateOutPos(const Vector& point){
     125  Vector helper=point;
     126  helper.ScaleAll(factors);
     127  return helper;
     128}
     129
     130Vector 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
     142string Stretch_impl::toString(){
     143  stringstream sstr;
     144  sstr << "stretch(" << getArg()->toString() << "," << factors << ")";
     145  return sstr.str();
    68146}
    69147
     
    76154
    77155Transform_impl::Transform_impl(const Shape::impl_ptr &_arg, const Matrix &_transformation) :
    78   arg(_arg),transformation(_transformation)
     156  ShapeOpsBase_impl(_arg),transformation(_transformation)
    79157{
    80158  transformationInv = transformation.invert();
     
    83161Transform_impl::~Transform_impl(){}
    84162
    85 bool Transform_impl::isInside(const Vector& point){
    86   return arg->isInside(transformationInv * point);
     163Vector Transform_impl::translateIn(const Vector& point){
     164  return transformationInv * point;
     165}
     166
     167Vector Transform_impl::translateOutPos(const Vector& point){
     168  return transformation * point;
     169}
     170
     171Vector Transform_impl::translateOutNormal(const Vector& point){
     172  Matrix mat = transformation.determinant() * transformation.invert().transpose();
     173  return mat * point;
     174}
     175
     176string Transform_impl::toString(){
     177  stringstream sstr;
     178  sstr << "transform(" << getArg()->toString() << "," << transformation << ")";
     179  return sstr.str();
    87180}
    88181
Note: See TracChangeset for help on using the changeset viewer.