Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision e38447444304566cccc4a9f79d61ec95482b450b)
+++ src/Makefile.am	(revision e09b70d7a588dbbff293dc4d06351cffd07f187a)
@@ -105,8 +105,10 @@
 SHAPESOURCE = \
   Shapes/BaseShapes.cpp \
-  Shapes/Shape.cpp
+  Shapes/Shape.cpp \
+  Shapes/ShapeOps.cpp
 SHAPEHEADER = \
   Shapes/BaseShapes.hpp \
-  Shapes/Shape.hpp
+  Shapes/Shape.hpp \
+  Shapes/ShapeOps.hpp
   
 
Index: src/Shapes/Shape.cpp
===================================================================
--- src/Shapes/Shape.cpp	(revision e38447444304566cccc4a9f79d61ec95482b450b)
+++ src/Shapes/Shape.cpp	(revision e09b70d7a588dbbff293dc4d06351cffd07f187a)
@@ -34,4 +34,9 @@
 }
 
+// allows arbitrary friendship, but only if implementation is known
+Shape::impl_ptr getShapeImpl(const Shape &shape){
+  return shape.getImpl();
+}
+
 /***************************** Some simple Shapes ***************************/
 
@@ -61,5 +66,5 @@
 
 Shape operator&&(const Shape &lhs,const Shape &rhs){
-  Shape::impl_ptr newImpl = Shape::impl_ptr(new AndShape_impl(lhs.getImpl(),rhs.getImpl()));
+  Shape::impl_ptr newImpl = Shape::impl_ptr(new AndShape_impl(getShapeImpl(lhs),getShapeImpl(rhs)));
   return Shape(newImpl);
 }
@@ -78,5 +83,5 @@
 
 Shape operator||(const Shape &lhs,const Shape &rhs){
-  Shape::impl_ptr newImpl = Shape::impl_ptr(new OrShape_impl(lhs.getImpl(),rhs.getImpl()));
+  Shape::impl_ptr newImpl = Shape::impl_ptr(new OrShape_impl(getShapeImpl(lhs),getShapeImpl(rhs)));
   return Shape(newImpl);
 }
@@ -95,5 +100,5 @@
 
 Shape operator!(const Shape &arg){
-  Shape::impl_ptr newImpl = Shape::impl_ptr(new NotShape_impl(arg.getImpl()));
+  Shape::impl_ptr newImpl = Shape::impl_ptr(new NotShape_impl(getShapeImpl(arg)));
   return Shape(newImpl);
 }
Index: src/Shapes/Shape.hpp
===================================================================
--- src/Shapes/Shape.hpp	(revision e38447444304566cccc4a9f79d61ec95482b450b)
+++ src/Shapes/Shape.hpp	(revision e09b70d7a588dbbff293dc4d06351cffd07f187a)
@@ -16,9 +16,7 @@
 class Shape
 {
-friend Shape operator&&(const Shape&,const Shape&);
-friend Shape operator||(const Shape&,const Shape&);
-friend Shape operator!(const Shape&);
 public:
   typedef boost::shared_ptr<Shape_impl> impl_ptr;
+  friend impl_ptr getShapeImpl(const Shape&);
 
   Shape(impl_ptr);
Index: src/Shapes/ShapeOps.cpp
===================================================================
--- src/Shapes/ShapeOps.cpp	(revision e09b70d7a588dbbff293dc4d06351cffd07f187a)
+++ src/Shapes/ShapeOps.cpp	(revision e09b70d7a588dbbff293dc4d06351cffd07f187a)
@@ -0,0 +1,39 @@
+/*
+ * ShapeOps.cpp
+ *
+ *  Created on: Jun 18, 2010
+ *      Author: crueger
+ */
+
+#include "Shapes/ShapeOps.hpp"
+#include "Shapes/ShapeOps_impl.hpp"
+
+Resize_impl::Resize_impl(const Shape::impl_ptr &_arg,double _size) :
+  arg(_arg), size(_size)
+{}
+
+Resize_impl::~Resize_impl(){}
+
+bool Resize_impl::isInside(const Vector& point){
+  return arg->isInside((1/size) * point);
+}
+
+Shape resize(const Shape &arg,double size){
+  Shape::impl_ptr impl = Shape::impl_ptr(new Resize_impl(getShapeImpl(arg),size));
+  return Shape(impl);
+}
+
+Translate_impl::Translate_impl(const Shape::impl_ptr &_arg, const Vector &_offset) :
+  arg(_arg),offset(_offset)
+{}
+
+Translate_impl::~Translate_impl(){}
+
+bool Translate_impl::isInside(const Vector& point){
+  return arg->isInside(point-offset);
+}
+
+Shape translate(const Shape &arg, const Vector &offset){
+  Shape::impl_ptr impl = Shape::impl_ptr(new Translate_impl(getShapeImpl(arg),offset));
+  return Shape(impl);
+}
Index: src/Shapes/ShapeOps.hpp
===================================================================
--- src/Shapes/ShapeOps.hpp	(revision e09b70d7a588dbbff293dc4d06351cffd07f187a)
+++ src/Shapes/ShapeOps.hpp	(revision e09b70d7a588dbbff293dc4d06351cffd07f187a)
@@ -0,0 +1,17 @@
+/*
+ * ShapeOps.hpp
+ *
+ *  Created on: Jun 18, 2010
+ *      Author: crueger
+ */
+
+#ifndef SHAPEOPS_HPP_
+#define SHAPEOPS_HPP_
+
+#include "Shapes/Shape.hpp"
+
+Shape resize(const Shape&,double);
+
+Shape translate(const Shape&, const Vector&);
+
+#endif /* SHAPEOPS_HPP_ */
Index: src/Shapes/ShapeOps_impl.hpp
===================================================================
--- src/Shapes/ShapeOps_impl.hpp	(revision e09b70d7a588dbbff293dc4d06351cffd07f187a)
+++ src/Shapes/ShapeOps_impl.hpp	(revision e09b70d7a588dbbff293dc4d06351cffd07f187a)
@@ -0,0 +1,36 @@
+/*
+ * ShapeOps_impl.hpp
+ *
+ *  Created on: Jun 18, 2010
+ *      Author: crueger
+ */
+
+#ifndef SHAPEOPS_IMPL_HPP_
+#define SHAPEOPS_IMPL_HPP_
+
+#include "Shapes/Shape_impl.hpp"
+#include "vector.hpp"
+
+class Resize_impl :  public Shape_impl
+{
+public:
+  Resize_impl(const Shape::impl_ptr&,double);
+  virtual ~Resize_impl();
+  virtual bool isInside(const Vector& point);
+private:
+  Shape::impl_ptr arg;
+  double size;
+};
+
+class Translate_impl :  public Shape_impl
+{
+public:
+  Translate_impl(const Shape::impl_ptr&, const Vector&);
+  virtual ~Translate_impl();
+  virtual bool isInside(const Vector& point);
+private:
+  Shape::impl_ptr arg;
+  Vector offset;
+};
+
+#endif /* SHAPEOPS_IMPL_HPP_ */
Index: src/Shapes/Shape_impl.hpp
===================================================================
--- src/Shapes/Shape_impl.hpp	(revision e38447444304566cccc4a9f79d61ec95482b450b)
+++ src/Shapes/Shape_impl.hpp	(revision e09b70d7a588dbbff293dc4d06351cffd07f187a)
@@ -13,4 +13,6 @@
 class Shape_impl {
 public:
+  Shape_impl(){};
+  virtual ~Shape_impl(){};
   virtual bool isInside(const Vector &point)=0;
 };
@@ -58,3 +60,5 @@
 };
 
+Shape::impl_ptr getShapeImpl(const Shape&);
+
 #endif /* SHAPE_IMPL_HPP_ */
