Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Shapes/ShapeOps.cpp

    rf12805 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   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 linepoints
    46     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 
    6113/********************* Resize ********************/
    6214
    6315Resize_impl::Resize_impl(const Shape::impl_ptr &_arg,double _size) :
    64   ShapeOpsBase_impl(_arg), size(_size)
     16  arg(_arg), size(_size)
    6517{
    6618  ASSERT(size>0,"Cannot resize a Shape to size zero or below");
     
    6921Resize_impl::~Resize_impl(){}
    7022
    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();
     23bool Resize_impl::isInside(const Vector& point){
     24  return arg->isInside((1/size) * point);
    8725}
    8826
     
    9533
    9634Translate_impl::Translate_impl(const Shape::impl_ptr &_arg, const Vector &_offset) :
    97   ShapeOpsBase_impl(_arg),offset(_offset)
     35  arg(_arg),offset(_offset)
    9836{}
    9937
    10038Translate_impl::~Translate_impl(){}
    10139
    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();
     40bool Translate_impl::isInside(const Vector& point){
     41  return arg->isInside(point-offset);
    11842}
    11943
     
    12650
    12751Stretch_impl::Stretch_impl(const Shape::impl_ptr &_arg, const Vector &_factors) :
    128   ShapeOpsBase_impl(_arg),factors(_factors)
     52  arg(_arg),factors(_factors)
    12953{
    13054  ASSERT(factors[0]>0,"cannot stretch a shape by a negative amount");
     
    13862Stretch_impl::~Stretch_impl(){}
    13963
    140 Vector Stretch_impl::translateIn(const Vector& point){
     64bool Stretch_impl::isInside(const Vector& point){
    14165  Vector helper=point;
    14266  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);
    16868}
    16969
     
    17676
    17777Transform_impl::Transform_impl(const Shape::impl_ptr &_arg, const Matrix &_transformation) :
    178   ShapeOpsBase_impl(_arg),transformation(_transformation)
     78  arg(_arg),transformation(_transformation)
    17979{
    18080  transformationInv = transformation.invert();
     
    18383Transform_impl::~Transform_impl(){}
    18484
    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();
     85bool Transform_impl::isInside(const Vector& point){
     86  return arg->isInside(transformationInv * point);
    20287}
    20388
Note: See TracChangeset for help on using the changeset viewer.