X-Git-Url: http://git.tdb.fi/?p=libs%2Fmath.git;a=blobdiff_plain;f=source%2Fgeometry%2Faffinetransformation.h;fp=source%2Fgeometry%2Faffinetransformation.h;h=0000000000000000000000000000000000000000;hp=e311b885f2111a4d777d7a5c775a780cbc9468a3;hb=d0534789125d5ef8c44743b1fd9eaff21b9e7e0d;hpb=60caa19c84877c89d750140a90e5d891bce30ee7 diff --git a/source/geometry/affinetransformation.h b/source/geometry/affinetransformation.h deleted file mode 100644 index e311b88..0000000 --- a/source/geometry/affinetransformation.h +++ /dev/null @@ -1,228 +0,0 @@ -#ifndef MSP_GEOMETRY_AFFINETRANSFORMATION_H_ -#define MSP_GEOMETRY_AFFINETRANSFORMATION_H_ - -#include -#include "angle.h" -#include "boundingbox.h" -#include "ray.h" - -namespace Msp { -namespace Geometry { - -template -class AffineTransformation; - - -/** -Helper class to provide specialized operations for AffineTransformation. -*/ -template -class AffineTransformationOps -{ -protected: - AffineTransformationOps() { } -}; - -template -class AffineTransformationOps -{ -protected: - AffineTransformationOps() { } - -public: - static AffineTransformation rotation(const Angle &); -}; - -template -class AffineTransformationOps -{ -protected: - AffineTransformationOps() { } - -public: - static AffineTransformation rotation(const Angle &, const LinAl::Vector &); -}; - - -/** -An affine transformation in D dimensions. Affine transformations preserve -straightness of lines and ratios of distances. Angles and distances themselves -may change. Internally this is represented by a square matrix of size D+1. -*/ -template -class AffineTransformation: public AffineTransformationOps -{ - friend class AffineTransformationOps; - -private: - LinAl::Matrix matrix; - -public: - AffineTransformation(); - - static AffineTransformation translation(const LinAl::Vector &); - static AffineTransformation scaling(const LinAl::Vector &); - static AffineTransformation shear(const LinAl::Vector &, const LinAl::Vector &); - - AffineTransformation &operator*=(const AffineTransformation &); - AffineTransformation &invert(); - - const LinAl::Matrix &get_matrix() const { return matrix; } - operator const LinAl::Matrix &() const { return matrix; } - - LinAl::Vector transform(const LinAl::Vector &) const; - LinAl::Vector transform_linear(const LinAl::Vector &) const; - Ray transform(const Ray &) const; - BoundingBox transform(const BoundingBox &) const; -}; - -template -inline AffineTransformation::AffineTransformation() -{ - this->matrix = LinAl::Matrix::identity(); -} - - -template -AffineTransformation AffineTransformation::translation(const LinAl::Vector &v) -{ - AffineTransformation r; - for(unsigned i=0; i -AffineTransformation AffineTransformation::scaling(const LinAl::Vector &factors) -{ - AffineTransformation r; - for(unsigned i=0; i -AffineTransformation AffineTransformation::shear(const LinAl::Vector &normal, const LinAl::Vector &shift) -{ - AffineTransformation r; - for(unsigned i=0; i -AffineTransformation AffineTransformationOps::rotation(const Angle &angle) -{ - AffineTransformation r; - T c = cos(angle); - T s = sin(angle); - r.matrix(0, 0) = c; - r.matrix(0, 1) = -s; - r.matrix(1, 0) = s; - r.matrix(1, 1) = c; - return r; -} - -template -AffineTransformation AffineTransformationOps::rotation(const Angle &angle, const LinAl::Vector &axis) -{ - AffineTransformation r; - LinAl::Vector axn = normalize(axis); - T c = cos(angle); - T s = sin(angle); - // http://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle - r.matrix(0, 0) = c+axn.x*axn.x*(1-c); - r.matrix(0, 1) = axn.x*axn.y*(1-c)-axn.z*s; - r.matrix(0, 2) = axn.x*axn.z*(1-c)+axn.y*s; - r.matrix(1, 0) = axn.y*axn.x*(1-c)+axn.z*s; - r.matrix(1, 1) = c+axn.y*axn.y*(1-c); - r.matrix(1, 2) = axn.y*axn.z*(1-c)-axn.x*s; - r.matrix(2, 0) = axn.z*axn.x*(1-c)-axn.y*s; - r.matrix(2, 1) = axn.z*axn.y*(1-c)+axn.x*s; - r.matrix(2, 2) = c+axn.z*axn.z*(1-c); - return r; -} - -template -inline AffineTransformation &AffineTransformation::operator*=(const AffineTransformation &other) -{ - matrix *= other.get_matrix(); - return *this; -} - -template -inline AffineTransformation operator*(const AffineTransformation &at1, const AffineTransformation &at2) -{ - AffineTransformation r = at1; - return r *= at2; -} - -template -inline AffineTransformation &AffineTransformation::invert() -{ - matrix.invert(); - return *this; -} - -template -inline AffineTransformation invert(const AffineTransformation &at) -{ - AffineTransformation r = at; - return r.invert(); -} - -template -inline LinAl::Vector AffineTransformation::transform(const LinAl::Vector &v) const -{ - return (matrix*compose(v, T(1))).template slice(0); -} - -template -inline LinAl::Vector AffineTransformation::transform_linear(const LinAl::Vector &v) const -{ - return (matrix*compose(v, T(0))).template slice(0); -} - -template -inline Ray AffineTransformation::transform(const Ray &ray) const -{ - LinAl::Vector dir = transform_linear(ray.get_direction()); - return Ray(transform(ray.get_start()), dir, ray.get_limit()*dir.norm()); -} - -template -inline BoundingBox AffineTransformation::transform(const BoundingBox &bbox) const -{ - LinAl::Vector min_pt; - LinAl::Vector max_pt; - for(unsigned i=0; i<(1< point; - for(unsigned j=0; j>j)&1 ? bbox.get_maximum_coordinate(j) : bbox.get_minimum_coordinate(j)); - - point = transform(point); - - if(i==0) - { - min_pt = point; - max_pt = point; - } - else - { - for(unsigned j=0; j(min_pt, max_pt); -} - -} // namespace Geometry -} // namespace Msp - -#endif