Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Shapes/ShapeOps.cpp

    r5e588b5 rf12805  
    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  Vector res = translateOutNormal(arg->getNormal(helper));
     34  res.Normalize();
     35  return res;
     36}
     37
     38LineSegmentSet 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
     57Shape::impl_ptr ShapeOpsBase_impl::getArg(){
     58  return arg;
     59}
     60
    1361/********************* Resize ********************/
    1462
    1563Resize_impl::Resize_impl(const Shape::impl_ptr &_arg,double _size) :
    16   arg(_arg), size(_size)
     64  ShapeOpsBase_impl(_arg), size(_size)
    1765{
    1866  ASSERT(size>0,"Cannot resize a Shape to size zero or below");
     
    2169Resize_impl::~Resize_impl(){}
    2270
    23 bool Resize_impl::isInside(const Vector& point){
    24   return arg->isInside((1/size) * point);
     71Vector Resize_impl::translateIn(const Vector& point){
     72  return (1/size) * point;
     73}
     74
     75Vector Resize_impl::translateOutPos(const Vector& point){
     76  return size * point;
     77}
     78
     79Vector Resize_impl::translateOutNormal(const Vector& point){
     80  return point;
     81}
     82
     83string Resize_impl::toString(){
     84  stringstream sstr;
     85  sstr << "resize(" << getArg()->toString() << "," << size << ")";
     86  return sstr.str();
    2587}
    2688
     
    3395
    3496Translate_impl::Translate_impl(const Shape::impl_ptr &_arg, const Vector &_offset) :
    35   arg(_arg),offset(_offset)
     97  ShapeOpsBase_impl(_arg),offset(_offset)
    3698{}
    3799
    38100Translate_impl::~Translate_impl(){}
    39101
    40 bool Translate_impl::isInside(const Vector& point){
    41   return arg->isInside(point-offset);
     102Vector Translate_impl::translateIn(const Vector& point){
     103  return point-offset;
     104}
     105
     106Vector Translate_impl::translateOutPos(const Vector& point){
     107  return point+offset;
     108}
     109
     110Vector Translate_impl::translateOutNormal(const Vector& point){
     111  return point;
     112}
     113
     114string Translate_impl::toString(){
     115  stringstream sstr;
     116  sstr << "translate(" << getArg()->toString() << "," << offset << ")";
     117  return sstr.str();
    42118}
    43119
     
    50126
    51127Stretch_impl::Stretch_impl(const Shape::impl_ptr &_arg, const Vector &_factors) :
    52   arg(_arg),factors(_factors)
     128  ShapeOpsBase_impl(_arg),factors(_factors)
    53129{
    54130  ASSERT(factors[0]>0,"cannot stretch a shape by a negative amount");
     
    62138Stretch_impl::~Stretch_impl(){}
    63139
    64 bool Stretch_impl::isInside(const Vector& point){
     140Vector Stretch_impl::translateIn(const Vector& point){
    65141  Vector helper=point;
    66142  helper.ScaleAll(reciFactors);
    67   return arg->isInside(helper);
     143  return helper;
     144}
     145
     146Vector Stretch_impl::translateOutPos(const Vector& point){
     147  Vector helper=point;
     148  helper.ScaleAll(factors);
     149  return helper;
     150}
     151
     152Vector 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
     164string Stretch_impl::toString(){
     165  stringstream sstr;
     166  sstr << "stretch(" << getArg()->toString() << "," << factors << ")";
     167  return sstr.str();
    68168}
    69169
     
    76176
    77177Transform_impl::Transform_impl(const Shape::impl_ptr &_arg, const Matrix &_transformation) :
    78   arg(_arg),transformation(_transformation)
     178  ShapeOpsBase_impl(_arg),transformation(_transformation)
    79179{
    80180  transformationInv = transformation.invert();
     
    83183Transform_impl::~Transform_impl(){}
    84184
    85 bool Transform_impl::isInside(const Vector& point){
    86   return arg->isInside(transformationInv * point);
     185Vector Transform_impl::translateIn(const Vector& point){
     186  return transformationInv * point;
     187}
     188
     189Vector Transform_impl::translateOutPos(const Vector& point){
     190  return transformation * point;
     191}
     192
     193Vector Transform_impl::translateOutNormal(const Vector& point){
     194  Matrix mat = transformation.invert().transpose();
     195  return mat * point;
     196}
     197
     198string Transform_impl::toString(){
     199  stringstream sstr;
     200  sstr << "transform(" << getArg()->toString() << "," << transformation << ")";
     201  return sstr.str();
    87202}
    88203
Note: See TracChangeset for help on using the changeset viewer.