Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Shapes/ShapeOps.cpp

    r5e588b5 r79dd0e  
    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 << ")";
     96  return sstr.str();
    4297}
    4398
     
    50105
    51106Stretch_impl::Stretch_impl(const Shape::impl_ptr &_arg, const Vector &_factors) :
    52   arg(_arg),factors(_factors)
     107  ShapeOpsBase_impl(_arg),factors(_factors)
    53108{
    54109  ASSERT(factors[0]>0,"cannot stretch a shape by a negative amount");
     
    62117Stretch_impl::~Stretch_impl(){}
    63118
    64 bool Stretch_impl::isInside(const Vector& point){
     119Vector Stretch_impl::translateIn(const Vector& point){
    65120  Vector helper=point;
    66121  helper.ScaleAll(reciFactors);
    67   return arg->isInside(helper);
     122  return helper;
     123}
     124
     125Vector Stretch_impl::translateOutPos(const Vector& point){
     126  Vector helper=point;
     127  helper.ScaleAll(factors);
     128  return helper;
     129}
     130
     131Vector Stretch_impl::translateOutNormal(const Vector& point){
     132  Vector helper=point;
     133  // the normalFactors are derived from appearances of the factors
     134  // with in the vectorproduct
     135  Vector normalFactors;
     136  normalFactors[0]=factors[1]*factors[2];
     137  normalFactors[1]=factors[0]*factors[2];
     138  normalFactors[2]=factors[0]*factors[1];
     139  helper.ScaleAll(normalFactors);
     140  return helper;
     141}
     142
     143string Stretch_impl::toString(){
     144  stringstream sstr;
     145  sstr << "stretch(" << getArg()->toString() << "," << factors << ")";
     146  return sstr.str();
    68147}
    69148
     
    76155
    77156Transform_impl::Transform_impl(const Shape::impl_ptr &_arg, const Matrix &_transformation) :
    78   arg(_arg),transformation(_transformation)
     157  ShapeOpsBase_impl(_arg),transformation(_transformation)
    79158{
    80159  transformationInv = transformation.invert();
     
    83162Transform_impl::~Transform_impl(){}
    84163
    85 bool Transform_impl::isInside(const Vector& point){
    86   return arg->isInside(transformationInv * point);
     164Vector Transform_impl::translateIn(const Vector& point){
     165  return transformationInv * point;
     166}
     167
     168Vector Transform_impl::translateOutPos(const Vector& point){
     169  return transformation * point;
     170}
     171
     172Vector Transform_impl::translateOutNormal(const Vector& point){
     173  Matrix mat = transformation.determinant() * transformation.invert().transpose();
     174  return mat * point;
     175}
     176
     177string Transform_impl::toString(){
     178  stringstream sstr;
     179  sstr << "transform(" << getArg()->toString() << "," << transformation << ")";
     180  return sstr.str();
    87181}
    88182
Note: See TracChangeset for help on using the changeset viewer.