diff options
Diffstat (limited to 'src/2geom/matrix.h')
| -rw-r--r-- | src/2geom/matrix.h | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/src/2geom/matrix.h b/src/2geom/matrix.h new file mode 100644 index 000000000..6a45b50c8 --- /dev/null +++ b/src/2geom/matrix.h @@ -0,0 +1,158 @@ +#ifndef __Geom_MATRIX_H__ +#define __Geom_MATRIX_H__ + +/** \file + * Definition of Geom::Matrix types. + * + * Main authors: + * Lauris Kaplinski <lauris@kaplinski.com>: + * Original NRMatrix definition and related macros. + * + * Nathan Hurst <njh@mail.csse.monash.edu.au>: + * Geom::Matrix class version of the above. + * + * Michael G. Sloan <mgsloan@gmail.com>: + * Reorganization and additions. + * + * This code is in public domain. + */ + +//#include <glib/gmessages.h> + +#include "point.h" + +namespace Geom { + +/** + * The Matrix class. + * + * For purposes of multiplication, points should be thought of as row vectors + * + * \f$(p_X p_Y 1)\f$ + * + * to be right-multiplied by transformation matrices of the form + * \f[ + \left[ + \begin{array}{ccc} + c_0&c_1&0 \\ + c_2&c_3&0 \\ + c_4&c_5&1 + \end{array} + \right] + \f] + * (so the columns of the matrix correspond to the columns (elements) of the result, + * and the rows of the matrix correspond to columns (elements) of the "input"). + */ +class Matrix { + private: + Coord _c[6]; + public: + Matrix() {} + + Matrix(Matrix const &m) { + for(int i = 0; i < 6; i++) { + _c[i] = m[i]; + } + } + + Matrix(Coord c0, Coord c1, Coord c2, Coord c3, Coord c4, Coord c5) { + _c[0] = c0; _c[1] = c1; + _c[2] = c2; _c[3] = c3; + _c[4] = c4; _c[5] = c5; + } + + Matrix &operator=(Matrix const &m) { + for(int i = 0; i < 6; i++) + _c[i] = m._c[i]; + return *this; + } + + inline Coord operator[](unsigned const i) const { return _c[i]; } + inline Coord &operator[](unsigned const i) { return _c[i]; } + + + Point xAxis() const; + Point yAxis() const; + Point translation() const; + void setXAxis(Point const &vec); + void setYAxis(Point const &vec); + void setTranslation(Point const &loc); + + double expansionX() const; + double expansionY() const; + void setExpansionX(double val); + void setExpansionY(double val); + + void setIdentity(); + + bool isIdentity(Coord eps = EPSILON) const; + bool isTranslation(Coord eps = EPSILON) const; + bool isRotation(double eps = EPSILON) const; + bool isScale(double eps = EPSILON) const; + bool isUniformScale(double eps = EPSILON) const; + + Matrix without_translation() const; + + Matrix inverse() const; + + Coord det() const; + Coord descrim2() const; + Coord descrim() const; +}; + +Matrix operator*(Matrix const &a, Matrix const &b); + +/** A function to print out the Matrix (for debugging) */ +inline std::ostream &operator<< (std::ostream &out_file, const Geom::Matrix &m) { + out_file << "A: " << m[0] << " C: " << m[2] << " E: " << m[4] << "\n"; + out_file << "B: " << m[1] << " D: " << m[3] << " F: " << m[5] << "\n"; + return out_file; +} + +/** Given a matrix m such that unit_circle = m*x, this returns the + * quadratic form x*A*x = 1. */ +Matrix elliptic_quadratic_form(Matrix const &m); + +/** Given a matrix (ignoring the translation) this returns the eigen + * values and vectors. */ +class Eigen{ +public: + Point vectors[2]; + double values[2]; + Eigen(Matrix const &m); +}; + +// Matrix factories +Matrix from_basis(const Point x_basis, const Point y_basis, const Point offset=Point(0,0)); + +/** Returns the Identity Matrix. */ +inline Matrix identity() { + return Matrix(1.0, 0.0, + 0.0, 1.0, + 0.0, 0.0); +} + +inline bool operator==(Matrix const &a, Matrix const &b) { + for(unsigned i = 0; i < 6; ++i) { + if ( a[i] != b[i] ) return false; + } + return true; +} +inline bool operator!=(Matrix const &a, Matrix const &b) { return !( a == b ); } + + + +} /* namespace Geom */ + +#endif /* !__Geom_MATRIX_H__ */ + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : |
