X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgeometry%2Faffinetransformation.h;h=e311b885f2111a4d777d7a5c775a780cbc9468a3;hb=60caa19c84877c89d750140a90e5d891bce30ee7;hp=430619ed163702594f71b267e800e85b87876504;hpb=cfffb770e4dadddadb3657599811900be34244b6;p=libs%2Fmath.git diff --git a/source/geometry/affinetransformation.h b/source/geometry/affinetransformation.h index 430619e..e311b88 100644 --- a/source/geometry/affinetransformation.h +++ b/source/geometry/affinetransformation.h @@ -1,8 +1,10 @@ #ifndef MSP_GEOMETRY_AFFINETRANSFORMATION_H_ #define MSP_GEOMETRY_AFFINETRANSFORMATION_H_ -#include +#include #include "angle.h" +#include "boundingbox.h" +#include "ray.h" namespace Msp { namespace Geometry { @@ -53,7 +55,7 @@ class AffineTransformation: public AffineTransformationOps friend class AffineTransformationOps; private: - LinAl::SquareMatrix matrix; + LinAl::Matrix matrix; public: AffineTransformation(); @@ -65,17 +67,19 @@ public: AffineTransformation &operator*=(const AffineTransformation &); AffineTransformation &invert(); - const LinAl::SquareMatrix &get_matrix() const { return matrix; } - operator const LinAl::SquareMatrix &() const { return matrix; } + 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::SquareMatrix::identity(); + this->matrix = LinAl::Matrix::identity(); } @@ -168,46 +172,54 @@ inline AffineTransformation invert(const AffineTransformation &at) return r.invert(); } - -template -inline LinAl::Vector augment_vector(const LinAl::Vector &v, T s) -{ - LinAl::Vector r; - for(unsigned i=0; i -inline LinAl::Vector reduce_vector(const LinAl::Vector &v) +template +inline LinAl::Vector AffineTransformation::transform(const LinAl::Vector &v) const { - LinAl::Vector r; - for(unsigned i=0; i(0); } -template -inline LinAl::Vector divide_vector(const LinAl::Vector &v) +template +inline LinAl::Vector AffineTransformation::transform_linear(const LinAl::Vector &v) const { - LinAl::Vector r; - for(unsigned i=0; i(0); } - template -inline LinAl::Vector AffineTransformation::transform(const LinAl::Vector &v) const +inline Ray AffineTransformation::transform(const Ray &ray) const { - return reduce_vector(matrix*augment_vector(v, T(1))); + LinAl::Vector dir = transform_linear(ray.get_direction()); + return Ray(transform(ray.get_start()), dir, ray.get_limit()*dir.norm()); } template -inline LinAl::Vector AffineTransformation::transform_linear(const LinAl::Vector &v) const +inline BoundingBox AffineTransformation::transform(const BoundingBox &bbox) const { - return reduce_vector(matrix*augment_vector(v, T(0))); + 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