X-Git-Url: http://git.tdb.fi/?p=libs%2Fmath.git;a=blobdiff_plain;f=source%2Fgeometry%2Faffinetransformation.h;h=15bd92675405a36a4b4205326400256ee3187934;hp=0e377baaa51d633186969ace978494d79edfccf1;hb=4bb4d03d5a6a0252083d6bc45b8a50fe7b504c51;hpb=de53838941cc8ccf00aeffa77c28d915317879bd diff --git a/source/geometry/affinetransformation.h b/source/geometry/affinetransformation.h index 0e377ba..15bd926 100644 --- a/source/geometry/affinetransformation.h +++ b/source/geometry/affinetransformation.h @@ -3,6 +3,8 @@ #include #include "angle.h" +#include "boundingbox.h" +#include "ray.h" namespace Msp { namespace Geometry { @@ -70,6 +72,8 @@ public: 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 @@ -180,6 +184,44 @@ inline LinAl::Vector AffineTransformation::transform_linear(const Li return LinAl::Vector(matrix*LinAl::Vector(v, T(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