summaryrefslogtreecommitdiff
path: root/boost/gil/extension/numeric/affine.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/gil/extension/numeric/affine.hpp')
-rw-r--r--boost/gil/extension/numeric/affine.hpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/boost/gil/extension/numeric/affine.hpp b/boost/gil/extension/numeric/affine.hpp
new file mode 100644
index 0000000000..6a77070063
--- /dev/null
+++ b/boost/gil/extension/numeric/affine.hpp
@@ -0,0 +1,93 @@
+/*
+ Copyright 2005-2007 Adobe Systems Incorporated
+
+ Use, modification and distribution are subject to the Boost Software License,
+ Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_NUMERIC_AFFINE_HPP
+#define BOOST_GIL_EXTENSION_NUMERIC_AFFINE_HPP
+
+#include <boost/gil/utilities.hpp> // point2
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file
+/// \brief support for affine transformations
+/// \author Lubomir Bourdev and Hailin Jin \n
+/// Adobe Systems Incorporated
+/// \date 2005-2007 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+namespace boost { namespace gil {
+
+////////////////////////////////////////////////////////////////////////////////////////
+///
+/// Simple matrix to do 2D affine transformations. It is actually 3x3 but the last column is [0 0 1]
+///
+////////////////////////////////////////////////////////////////////////////////////////
+template <typename T>
+class matrix3x2 {
+public:
+ matrix3x2() : a(1), b(0), c(0), d(1), e(0), f(0) {}
+ matrix3x2(T A, T B, T C, T D, T E, T F) : a(A),b(B),c(C),d(D),e(E),f(F) {}
+ matrix3x2(const matrix3x2& mat) : a(mat.a), b(mat.b), c(mat.c), d(mat.d), e(mat.e), f(mat.f) {}
+ matrix3x2& operator=(const matrix3x2& m) { a=m.a; b=m.b; c=m.c; d=m.d; e=m.e; f=m.f; return *this; }
+
+ matrix3x2& operator*=(const matrix3x2& m) { (*this) = (*this)*m; return *this; }
+
+ static matrix3x2 get_rotate(T rads) { T c=std::cos(rads); T s=std::sin(rads); return matrix3x2(c,s,-s,c,0,0); }
+ static matrix3x2 get_translate(const point2<T>& t) { return matrix3x2(1 ,0,0,1 ,t.x,t.y); }
+ static matrix3x2 get_translate(T x, T y) { return matrix3x2(1 ,0,0,1 ,x, y ); }
+ static matrix3x2 get_scale (const point2<T>& s) { return matrix3x2(s.x,0,0,s.y,0 ,0 ); }
+ static matrix3x2 get_scale (T x, T y) { return matrix3x2(x, 0,0,y, 0 ,0 ); }
+ static matrix3x2 get_scale (T s) { return matrix3x2(s ,0,0,s ,0 ,0 ); }
+
+ T a,b,c,d,e,f;
+};
+
+template <typename T> BOOST_FORCEINLINE
+matrix3x2<T> operator*(const matrix3x2<T>& m1, const matrix3x2<T>& m2) {
+ return matrix3x2<T>(
+ m1.a * m2.a + m1.b * m2.c,
+ m1.a * m2.b + m1.b * m2.d,
+ m1.c * m2.a + m1.d * m2.c,
+ m1.c * m2.b + m1.d * m2.d,
+ m1.e * m2.a + m1.f * m2.c + m2.e,
+ m1.e * m2.b + m1.f * m2.d + m2.f );
+}
+
+template <typename T, typename F> BOOST_FORCEINLINE
+point2<F> operator*(const point2<T>& p, const matrix3x2<F>& m) {
+ return point2<F>(m.a*p.x + m.c*p.y + m.e, m.b*p.x + m.d*p.y + m.f);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// Define affine mapping that transforms the source coordinates by the affine transformation
+////////////////////////////////////////////////////////////////////////////////////////
+/*
+template <typename MapFn>
+concept MappingFunctionConcept {
+ typename mapping_traits<MapFn>::result_type; where PointNDConcept<result_type>;
+
+ template <typename Domain> { where PointNDConcept<Domain> }
+ result_type transform(MapFn&, const Domain& src);
+};
+*/
+
+template <typename T> struct mapping_traits;
+
+template <typename F>
+struct mapping_traits<matrix3x2<F> > {
+ typedef point2<F> result_type;
+};
+
+template <typename F, typename F2> BOOST_FORCEINLINE
+point2<F> transform(const matrix3x2<F>& mat, const point2<F2>& src) { return src * mat; }
+
+} } // namespace boost::gil
+
+#endif // BOOST_GIL_EXTENSION_NUMERIC_AFFINE_HPP