Ignore:
File:
1 edited

Legend:

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

    r955b91 rc67c65  
    2020#include "CodePatterns/MemDebug.hpp"
    2121
     22#include <algorithm>
     23#include <boost/bind.hpp>
     24
    2225#include "Shapes/ShapeExceptions.hpp"
    2326#include "Shapes/ShapeOps.hpp"
     
    3437ShapeOpsBase_impl::~ShapeOpsBase_impl(){}
    3538
    36 bool ShapeOpsBase_impl::isInside(const Vector &point){
     39bool ShapeOpsBase_impl::isInside(const Vector &point) const{
    3740  return arg->isInside(translateIn(point));
    3841}
    3942
    40 bool ShapeOpsBase_impl::isOnSurface(const Vector &point){
     43bool ShapeOpsBase_impl::isOnSurface(const Vector &point) const{
    4144  return arg->isOnSurface(translateIn(point));
    4245}
    4346
    44 Vector ShapeOpsBase_impl::getNormal(const Vector &point) throw (NotOnSurfaceException){
     47Vector ShapeOpsBase_impl::getNormal(const Vector &point) const throw (NotOnSurfaceException){
    4548  Vector helper = translateIn(point);
    4649  if(!arg->isOnSurface(helper)){
     
    5255}
    5356
    54 LineSegmentSet ShapeOpsBase_impl::getLineIntersections(const Line &line){
     57Vector ShapeOpsBase_impl::getCenter() const
     58{
     59  return arg->getCenter();
     60}
     61
     62double ShapeOpsBase_impl::getRadius() const
     63{
     64  return translateOutPos(Vector(arg->getRadius(), 0., 0.)).Norm();
     65}
     66
     67
     68LineSegmentSet ShapeOpsBase_impl::getLineIntersections(const Line &line) const{
    5569  Line newLine(translateIn(line.getOrigin()),translateIn(line.getDirection()));
    5670  LineSegmentSet res(line);
     
    7185}
    7286
     87enum ShapeType ShapeOpsBase_impl::getType() const {
     88        return getArg()->getType();
     89}
     90
    7391std::vector<Vector> ShapeOpsBase_impl::getHomogeneousPointsOnSurface(const size_t N) const {
    74   return getArg()->getHomogeneousPointsOnSurface(N);;
     92  return getArg()->getHomogeneousPointsOnSurface(N);
     93}
     94
     95std::vector<Vector> ShapeOpsBase_impl::getHomogeneousPointsInVolume(const size_t N) const {
     96  return getArg()->getHomogeneousPointsInVolume(N);
    7597}
    7698
     
    89111Resize_impl::~Resize_impl(){}
    90112
    91 bool Resize_impl::isInside(const Vector& point){
     113double Resize_impl::getVolume() const
     114{
     115        return getArg()->getVolume() * size;
     116}
     117
     118double Resize_impl::getSurfaceArea() const
     119{
     120        return getArg()->getSurfaceArea() * size;
     121}
     122
     123
     124bool Resize_impl::isInside(const Vector& point) const{
    92125  return getArg()->isInside((1/size) * point);
    93126}
    94127
    95 Vector Resize_impl::translateIn(const Vector& point){
     128Vector Resize_impl::translateIn(const Vector& point) const{
    96129  return (1/size) * point;
    97130}
    98131
    99 Vector Resize_impl::translateOutPos(const Vector& point){
     132Vector Resize_impl::translateOutPos(const Vector& point) const{
    100133  return size * point;
    101134}
    102135
    103 Vector Resize_impl::translateOutNormal(const Vector& point){
     136Vector Resize_impl::translateOutNormal(const Vector& point) const{
    104137  return point;
    105138}
    106139
    107 std::string Resize_impl::toString() {
     140std::string Resize_impl::toString() const{
    108141  std::stringstream sstr;
    109142  sstr << "resize(" << getArg()->toString() << "," << size << ")";
     
    113146std::vector<Vector> Resize_impl::getHomogeneousPointsOnSurface(const size_t N) const {
    114147  std::vector<Vector> PointsOnSurface = getArg()->getHomogeneousPointsOnSurface(N);
    115   for(std::vector<Vector>::iterator iter = PointsOnSurface.begin(); iter != PointsOnSurface.end(); ++iter) {
    116     *iter *= size;
    117   }
    118   return PointsOnSurface;
     148  std::for_each(PointsOnSurface.begin(), PointsOnSurface.end(),
     149                boost::bind(&Vector::operator*, _1, size) );
     150  return PointsOnSurface;
     151}
     152
     153std::vector<Vector> Resize_impl::getHomogeneousPointsInVolume(const size_t N) const {
     154  std::vector<Vector> PointsOnSurface = getArg()->getHomogeneousPointsInVolume(N);
     155  std::for_each(PointsOnSurface.begin(), PointsOnSurface.end(),
     156                boost::bind(&Vector::operator*, _1, size) );
     157        return std::vector<Vector>();
    119158}
    120159
     
    133172Translate_impl::~Translate_impl(){}
    134173
    135 bool Translate_impl::isInside(const Vector& point){
     174bool Translate_impl::isInside(const Vector& point) const{
    136175  return getArg()->isInside(point-offset);
    137176}
    138177
    139 Vector Translate_impl::translateIn(const Vector& point){
     178Vector Translate_impl::getCenter() const
     179{
     180  return getArg()->getCenter()+offset;
     181}
     182
     183double Translate_impl::getRadius() const
     184{
     185  return getArg()->getRadius();
     186}
     187
     188double Translate_impl::getVolume() const
     189{
     190        return getArg()->getVolume();
     191}
     192
     193double Translate_impl::getSurfaceArea() const
     194{
     195        return getArg()->getSurfaceArea();
     196}
     197
     198Vector Translate_impl::translateIn(const Vector& point) const{
    140199  return point-offset;
    141200}
    142201
    143 Vector Translate_impl::translateOutPos(const Vector& point){
     202Vector Translate_impl::translateOutPos(const Vector& point) const{
    144203  return point+offset;
    145204}
    146205
    147 Vector Translate_impl::translateOutNormal(const Vector& point){
     206Vector Translate_impl::translateOutNormal(const Vector& point) const{
    148207  return point;
    149208}
    150209
    151 std::string Translate_impl::toString() {
     210std::string Translate_impl::toString() const{
    152211  std::stringstream sstr;
    153212  sstr << "translate(" << getArg()->toString() << "," << offset << ")";
     
    157216std::vector<Vector> Translate_impl::getHomogeneousPointsOnSurface(const size_t N) const {
    158217  std::vector<Vector> PointsOnSurface = getArg()->getHomogeneousPointsOnSurface(N);
    159   for(std::vector<Vector>::iterator iter = PointsOnSurface.begin(); iter != PointsOnSurface.end(); ++iter) {
    160     *iter += offset;
    161   }
     218  std::for_each(PointsOnSurface.begin(), PointsOnSurface.end(),
     219                boost::bind(&Vector::operator+, _1, offset) );
     220  return PointsOnSurface;
     221}
     222
     223std::vector<Vector> Translate_impl::getHomogeneousPointsInVolume(const size_t N) const {
     224  std::vector<Vector> PointsOnSurface = getArg()->getHomogeneousPointsInVolume(N);
     225  std::for_each(PointsOnSurface.begin(), PointsOnSurface.end(),
     226                boost::bind(&Vector::operator+, _1, offset) );
    162227  return PointsOnSurface;
    163228}
     
    173238  ShapeOpsBase_impl(_arg),factors(_factors)
    174239{
    175   ASSERT(factors[0]>0,"cannot stretch a shape by a negative amount");
    176   ASSERT(factors[1]>0,"cannot stretch a shape by a negative amount");
    177   ASSERT(factors[2]>0,"cannot stretch a shape by a negative amount");
    178240  for(int i = NDIM;i--;){
    179     reciFactors[i] = 1/factors[i];
     241    ASSERT(factors[i]>0.,"cannot stretch a shape by a negative amount");
     242    reciFactors[i] = 1./factors[i];
    180243  }
    181244}
     
    183246Stretch_impl::~Stretch_impl(){}
    184247
    185 bool Stretch_impl::isInside(const Vector& point){
     248double Stretch_impl::getVolume() const
     249{
     250        // TODO
     251        return -1.;
     252}
     253
     254double Stretch_impl::getSurfaceArea() const
     255{
     256        // TODO
     257        return -1.;
     258}
     259
     260bool Stretch_impl::isInside(const Vector& point) const{
    186261  Vector helper=point;
    187262  helper.ScaleAll(reciFactors);
     
    189264}
    190265
    191 Vector Stretch_impl::translateIn(const Vector& point){
     266Vector Stretch_impl::translateIn(const Vector& point) const{
    192267  Vector helper=point;
    193268  helper.ScaleAll(reciFactors);
     
    195270}
    196271
    197 Vector Stretch_impl::translateOutPos(const Vector& point){
     272Vector Stretch_impl::translateOutPos(const Vector& point) const{
    198273  Vector helper=point;
    199274  helper.ScaleAll(factors);
     
    201276}
    202277
    203 Vector Stretch_impl::translateOutNormal(const Vector& point){
     278Vector Stretch_impl::translateOutNormal(const Vector& point) const{
    204279  Vector helper=point;
    205280  // the normalFactors are derived from appearances of the factors
     
    213288}
    214289
    215 std::string Stretch_impl::toString() {
     290std::string Stretch_impl::toString() const{
    216291  std::stringstream sstr;
    217292  sstr << "stretch(" << getArg()->toString() << "," << factors << ")";
     
    221296std::vector<Vector> Stretch_impl::getHomogeneousPointsOnSurface(const size_t N) const {
    222297  std::vector<Vector> PointsOnSurface = getArg()->getHomogeneousPointsOnSurface(N);
    223   for(std::vector<Vector>::iterator iter = PointsOnSurface.begin(); iter != PointsOnSurface.end(); ++iter) {
    224     (*iter).ScaleAll(reciFactors);
    225   }
     298  std::for_each(PointsOnSurface.begin(), PointsOnSurface.end(),
     299                boost::bind( static_cast<void (Vector::*)(const Vector&)>(&Vector::ScaleAll), _1, reciFactors) );
     300  return PointsOnSurface;
     301}
     302
     303std::vector<Vector> Stretch_impl::getHomogeneousPointsInVolume(const size_t N) const {
     304  std::vector<Vector> PointsOnSurface = getArg()->getHomogeneousPointsInVolume(N);
     305  std::for_each(PointsOnSurface.begin(), PointsOnSurface.end(),
     306      boost::bind( static_cast<void (Vector::*)(const Vector&)>(&Vector::ScaleAll), _1, reciFactors) );
    226307  return PointsOnSurface;
    227308}
     
    242323Transform_impl::~Transform_impl(){}
    243324
    244 bool Transform_impl::isInside(const Vector& point){
     325double Transform_impl::getVolume() const
     326{
     327        return getArg()->getVolume();
     328}
     329
     330double Transform_impl::getSurfaceArea() const
     331{
     332        return getArg()->getSurfaceArea();
     333}
     334
     335bool Transform_impl::isInside(const Vector& point) const{
    245336  return getArg()->isInside(transformationInv * point);
    246337}
    247338
    248 Vector Transform_impl::translateIn(const Vector& point){
     339Vector Transform_impl::translateIn(const Vector& point) const{
    249340  return transformationInv * point;
    250341}
    251342
    252 Vector Transform_impl::translateOutPos(const Vector& point){
     343Vector Transform_impl::translateOutPos(const Vector& point) const{
    253344  return transformation * point;
    254345}
    255346
    256 Vector Transform_impl::translateOutNormal(const Vector& point){
     347Vector Transform_impl::translateOutNormal(const Vector& point) const
     348{
    257349  RealSpaceMatrix mat = transformation.invert().transpose();
    258350  return mat * point;
    259351}
    260352
    261 std::string Transform_impl::toString() {
     353std::string Transform_impl::toString() const{
    262354  std::stringstream sstr;
    263355  sstr << "transform(" << getArg()->toString() << "," << transformation << ")";
     
    267359std::vector<Vector> Transform_impl::getHomogeneousPointsOnSurface(const size_t N) const {
    268360  std::vector<Vector> PointsOnSurface = getArg()->getHomogeneousPointsOnSurface(N);
    269   for(std::vector<Vector>::iterator iter = PointsOnSurface.begin(); iter != PointsOnSurface.end(); ++iter) {
    270     *iter = transformation * (*iter);
    271   }
     361  std::transform( PointsOnSurface.begin(), PointsOnSurface.end(), PointsOnSurface.begin(),
     362      boost::bind(static_cast<Vector(*)(const RealSpaceMatrix&,const Vector&)>(operator*), transformation, _1));
     363  return PointsOnSurface;
     364}
     365
     366std::vector<Vector> Transform_impl::getHomogeneousPointsInVolume(const size_t N) const {
     367  std::vector<Vector> PointsOnSurface = getArg()->getHomogeneousPointsInVolume(N);
     368  std::transform( PointsOnSurface.begin(), PointsOnSurface.end(), PointsOnSurface.begin(),
     369      boost::bind(static_cast<Vector(*)(const RealSpaceMatrix&,const Vector&)>(operator*), transformation, _1));
    272370  return PointsOnSurface;
    273371}
Note: See TracChangeset for help on using the changeset viewer.