Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Shapes/ShapeOps.cpp

    rcfda65 r5e588b5  
    1111#include "Helpers/Assert.hpp"
    1212
    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 
    4013/********************* Resize ********************/
    4114
    4215Resize_impl::Resize_impl(const Shape::impl_ptr &_arg,double _size) :
    43   ShapeOpsBase_impl(_arg), size(_size)
     16  arg(_arg), size(_size)
    4417{
    4518  ASSERT(size>0,"Cannot resize a Shape to size zero or below");
     
    4821Resize_impl::~Resize_impl(){}
    4922
    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();
     23bool Resize_impl::isInside(const Vector& point){
     24  return arg->isInside((1/size) * point);
    6625}
    6726
     
    7433
    7534Translate_impl::Translate_impl(const Shape::impl_ptr &_arg, const Vector &_offset) :
    76   ShapeOpsBase_impl(_arg),offset(_offset)
     35  arg(_arg),offset(_offset)
    7736{}
    7837
    7938Translate_impl::~Translate_impl(){}
    8039
    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 << ")";
     40bool Translate_impl::isInside(const Vector& point){
     41  return arg->isInside(point-offset);
    9642}
    9743
     
    10450
    10551Stretch_impl::Stretch_impl(const Shape::impl_ptr &_arg, const Vector &_factors) :
    106   ShapeOpsBase_impl(_arg),factors(_factors)
     52  arg(_arg),factors(_factors)
    10753{
    10854  ASSERT(factors[0]>0,"cannot stretch a shape by a negative amount");
     
    11662Stretch_impl::~Stretch_impl(){}
    11763
    118 Vector Stretch_impl::translateIn(const Vector& point){
     64bool Stretch_impl::isInside(const Vector& point){
    11965  Vector helper=point;
    12066  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);
    14668}
    14769
     
    15476
    15577Transform_impl::Transform_impl(const Shape::impl_ptr &_arg, const Matrix &_transformation) :
    156   ShapeOpsBase_impl(_arg),transformation(_transformation)
     78  arg(_arg),transformation(_transformation)
    15779{
    15880  transformationInv = transformation.invert();
     
    16183Transform_impl::~Transform_impl(){}
    16284
    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();
     85bool Transform_impl::isInside(const Vector& point){
     86  return arg->isInside(transformationInv * point);
    18087}
    18188
Note: See TracChangeset for help on using the changeset viewer.