1 #ifndef MSP_GEOMETRY_TRANSFORMEDSHAPE_H_
2 #define MSP_GEOMETRY_TRANSFORMEDSHAPE_H_
4 #include "affinetransformation.h"
11 template<typename T, unsigned D>
12 class TransformedShape
16 AffineTransformation<T, D> transformation;
19 TransformedShape(const Shape<T, D> &, const AffineTransformation<T, D> &);
20 TransformedShape(const TransformedShape &);
21 TransformedShape &operator=(const TransformedShape &);
24 virtual TransformedShape *clone() const;
26 const Shape<T, D> &get_shape() const { return *shape; }
27 const AffineTransformation<T, D> &get_transformation() const { return transformation; }
29 virtual bool check_intersection(const Ray<T, D> &) const;
32 template<typename T, unsigned D>
33 inline TransformedShape<T, D>::TransformedShape(const Shape<T, D> &s, const AffineTransformation<T, D> &t):
38 template<typename T, unsigned D>
39 inline TransformedShape<T, D>::TransformedShape(const TransformedShape &other):
40 shape(other.shape->clone()),
41 transformation(other.transformation)
44 template<typename T, unsigned D>
45 inline TransformedShape<T, D> &TransformedShape<T, D>::operator=(const TransformedShape<T, D> &other)
48 shape = other.shape->clone();
49 transformation = other.transformation();
52 template<typename T, unsigned D>
53 inline TransformedShape<T, D>::~TransformedShape()
58 template<typename T, unsigned D>
59 inline TransformedShape<T, D> *TransformedShape<T, D>::clone() const
61 return new TransformedShape<T, D>(*this);
64 template<typename T, unsigned D>
65 inline bool TransformedShape<T, D>::check_intersection(const Ray<T, D> &ray) const
67 // TODO cache the inverse transformation for performance
68 LinAl::SquareMatrix<T, D+1> inverse_trans = LinAl::invert(transformation.get_matrix());
69 Ray<T, D> trans_ray(reduce_vector(inverse_trans*augment_vector(ray.get_start(), T(1))),
70 reduce_vector(inverse_trans*augment_vector(ray.get_direction(), T(0))));
71 return shape->check_intersection(trans_ray);
74 } // namespace Geometry