Tue, 07 Jul 2015 21:35:20 +0300
Refactoring update.
Removed all asserts.
/* * LDForge: LDraw parts authoring CAD * Copyright (C) 2013 - 2015 Teemu Piippo * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #pragma once #include <QString> #include <QObject> #include <QStringList> #include <QMetaType> #include <QVector> #include <QVector3D> #include <QSharedPointer> #include "macros.h" class LDObject; class QFile; class QTextStream; class Matrix; class LDDocument; using int8 = qint8; using int16 = qint16; using int32 = qint32; using int64 = qint64; using uint8 = quint8; using uint16 = quint16; using uint32 = quint32; using uint64 = quint64; using LDObjectPtr = QSharedPointer<LDObject>; using LDObjectList = QList<LDObjectPtr>; using LDObjectWeakPtr = QWeakPointer<LDObject>; using LDObjectWeakList = QList<LDObjectWeakPtr>; using LDDocumentPtr = QSharedPointer<LDDocument>; using LDDocumentWeakPtr = QWeakPointer<LDDocument>; using real = double; template<typename T, typename R> using Pair = std::pair<T, R>; // // A mathematical 3 x 3 matrix // class Matrix { public: Matrix() {} Matrix (const std::initializer_list<double>& vals); // Constructs a matrix all 9 elements initialized to the same value. Matrix (double fillval); // Constructs a matrix with a C-array. // note: @vals is expected to have exactly 9 elements. Matrix (double vals[]); // Calculates the matrix's determinant. double getDeterminant() const; // Multiplies this matrix with @other // note: a.mult(b) is not equivalent to b.mult(a)! Matrix mult (const Matrix& other) const; // Prints the matrix to stdout. void dump() const; // Yields a string representation of the matrix. QString toString() const; // Zeroes the matrix out. void zero(); // Assigns the matrix values to the values of @other. Matrix& operator= (const Matrix& other); // Returns a mutable reference to a value by @idx inline double& value (int idx) { return m_vals[idx]; } // An overload of value() for const matrices. inline const double& value (int idx) const { return m_vals[idx]; } // An operator overload for mult(). inline Matrix operator* (const Matrix& other) const { return mult (other); } // An operator overload for value(). inline double& operator[] (int idx) { return value (idx); } // An operator overload for value() const. inline const double& operator[] (int idx) const { return value (idx); } // Checks whether the two matrices have the same values. bool operator== (const Matrix& other) const; private: double m_vals[9]; }; extern const Matrix IdentityMatrix; static const double Pi = 3.14159265358979323846; template<typename T> T clamp (T a, T min, T max) { return (a > max) ? max : (a < min) ? min : a; } template<typename T> T min (T a, T b) { return (a < b) ? a : b; } template<typename T> T max (T a, T b) { return (a > b) ? a : b; } template<typename T> T abs (T a) { return (a >= 0) ? a : -a; } template<typename T> bool isZero (T a) { return abs<T> (a) < 0.00001; } template<typename T> const char* plural (T n) { return (not isZero (n - 1)) ? "s" : ""; } template<typename T> bool isInteger (T a) { return (abs (a - floor(a)) < 0.00001) or (abs (a - ceil(a)) < 0.00001); } template<typename T> bool isInRange (T a, T b, T c) { return a >= b and a <= c; } template<typename T> void removeDuplicates (T& a) { std::sort (a.begin(), a.end()); a.erase (std::unique (a.begin(), a.end()), a.end()); } // // Returns true if first arg is equal to any of the other args // template<typename T, typename Arg, typename... Args> bool Eq (T const& a, Arg const& arg, Args const&... args) { if (a == arg) return true; return Eq (a, args...); } template<typename T> bool Eq (T const&) { return false; }