You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
225 lines
4.9 KiB
C
225 lines
4.9 KiB
C
7 months ago
|
#ifndef MATRIX4D_H_
|
||
|
#define MATRIX4D_H_
|
||
|
|
||
|
#include "Vector3f.h"
|
||
|
|
||
|
#define M_ROWS 4
|
||
|
#define M_COLS 4
|
||
|
#define M_LENGTH (M_ROWS * M_COLS)
|
||
|
|
||
|
/**
|
||
|
* @class Matrix4D
|
||
|
*
|
||
|
* This class represents a 4x4 matrix and contains methods
|
||
|
* to operate on it
|
||
|
*
|
||
|
* @author Nuno Almeida (nuno.alm@ua.pt)
|
||
|
* Adapted - Miguel Abreu
|
||
|
*/
|
||
|
class Matrix4D {
|
||
|
|
||
|
public:
|
||
|
float content[M_LENGTH]; // content of the matrix, vector-like
|
||
|
|
||
|
/**
|
||
|
* Default constructor returns the identity matrix
|
||
|
*/
|
||
|
Matrix4D();
|
||
|
|
||
|
/**
|
||
|
* Constructor returns a matrix from a vector of floats
|
||
|
*/
|
||
|
Matrix4D(const float[]);
|
||
|
|
||
|
/**
|
||
|
* Copy constructor
|
||
|
*/
|
||
|
Matrix4D(const Matrix4D& other);
|
||
|
|
||
|
/**
|
||
|
* Constructor returns a translation matrix
|
||
|
*/
|
||
|
Matrix4D(const Vector3f& v);
|
||
|
|
||
|
/**
|
||
|
* Destructor
|
||
|
*/
|
||
|
~Matrix4D();
|
||
|
|
||
|
/**
|
||
|
* Sets a value in some position (vector-like)
|
||
|
*/
|
||
|
void set(unsigned i, float value);
|
||
|
|
||
|
/**
|
||
|
* Sets a value in some position (matrix-like)
|
||
|
*/
|
||
|
void set(unsigned i, unsigned j, float value);
|
||
|
|
||
|
/**
|
||
|
* Gets a value from some position (vector-like)
|
||
|
*/
|
||
|
float get(unsigned i) const;
|
||
|
|
||
|
/**
|
||
|
* Gets a value from some position (matrix-like)
|
||
|
*/
|
||
|
float get(unsigned i, unsigned j) const;
|
||
|
|
||
|
/**
|
||
|
* Assigns another matrix to this one
|
||
|
*
|
||
|
* @param other Another matrix
|
||
|
*/
|
||
|
void operator=(const Matrix4D& other);
|
||
|
|
||
|
/**
|
||
|
* Gets the sum of another vector with this one
|
||
|
*
|
||
|
* @param other Another matrix
|
||
|
*/
|
||
|
Matrix4D operator+(const Matrix4D& other) const;
|
||
|
|
||
|
/**
|
||
|
* Sums this matrix to another
|
||
|
*
|
||
|
* @param other Another matrix
|
||
|
* @return Sum of this matrix with another
|
||
|
*/
|
||
|
void operator+=(const Matrix4D& other);
|
||
|
|
||
|
/**
|
||
|
* Gets the subtraction of another vector from this one
|
||
|
*
|
||
|
* @param other Another matrix
|
||
|
*/
|
||
|
Matrix4D operator-(const Matrix4D&) const;
|
||
|
|
||
|
/**
|
||
|
* Subtracts another matrix from this one
|
||
|
*
|
||
|
* @param other Another matrix
|
||
|
* @return This matrix minus another
|
||
|
*/
|
||
|
void operator-=(const Matrix4D& other);
|
||
|
|
||
|
/**
|
||
|
* Multiplies two matrices
|
||
|
*
|
||
|
* @param other Another matrix
|
||
|
* @return Multiplication matrix
|
||
|
*/
|
||
|
Matrix4D operator*(const Matrix4D& other) const;
|
||
|
|
||
|
/**
|
||
|
* Multiplies a matrix with a vector
|
||
|
*
|
||
|
* @param other Another matrix
|
||
|
* @return Multiplication vector
|
||
|
*/
|
||
|
Vector3f operator*(const Vector3f& other) const;
|
||
|
|
||
|
/**
|
||
|
* Checks whether this matrix is equal to another
|
||
|
*
|
||
|
* @param other Another matrix
|
||
|
* @return true/false
|
||
|
*/
|
||
|
bool operator==(const Matrix4D&) const;
|
||
|
|
||
|
/**
|
||
|
* Gets the content of the position i (in vector representation) of this
|
||
|
* matrix
|
||
|
*
|
||
|
* @param pos Position
|
||
|
* @return Value in the position
|
||
|
*/
|
||
|
float& operator[](const unsigned pos);
|
||
|
|
||
|
/**
|
||
|
* Gets the translation vector from this matrix
|
||
|
*
|
||
|
* @return Translation vector
|
||
|
*/
|
||
|
Vector3f toVector3f() const;
|
||
|
|
||
|
/**
|
||
|
* Gets the transpose of this matrix
|
||
|
*
|
||
|
* @return Transpose
|
||
|
*/
|
||
|
Matrix4D transpose();
|
||
|
|
||
|
/**
|
||
|
* Gets the inverse of this matrix (m.abreu@2020)
|
||
|
*
|
||
|
* @param inverse_out inverse matrix
|
||
|
* @return true if it exists
|
||
|
*/
|
||
|
bool inverse(Matrix4D& inverse_out) const;
|
||
|
|
||
|
/**
|
||
|
* Gets the inverse of this matrix, (m.abreu@2020)
|
||
|
* assuming that it represents an affine transformation with only translation and rotation
|
||
|
* This method creates a new matrix
|
||
|
*
|
||
|
* @return inverse matrix
|
||
|
*/
|
||
|
Matrix4D inverse_tranformation_matrix() const;
|
||
|
|
||
|
/**
|
||
|
* Gets the inverse of this matrix, (m.abreu@2020)
|
||
|
* assuming that it represents an affine transformation with only translation and rotation
|
||
|
* This method overwrites the given matrix
|
||
|
*
|
||
|
* @param inverse_out inverse matrix output
|
||
|
*/
|
||
|
void inverse_tranformation_matrix(Matrix4D& inverse_out) const;
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Gets the rotation matrix around x-axis
|
||
|
*
|
||
|
* @param angle Angle (degrees)
|
||
|
*/
|
||
|
static Matrix4D rotationX(float angle);
|
||
|
|
||
|
/**
|
||
|
* Gets the rotation matrix around y-axis
|
||
|
*
|
||
|
* @param angle Angle (degrees)
|
||
|
*/
|
||
|
static Matrix4D rotationY(float angle);
|
||
|
|
||
|
/**
|
||
|
* Gets the rotation matrix around z-axis
|
||
|
*
|
||
|
* @param angle Angle (degrees)
|
||
|
*/
|
||
|
static Matrix4D rotationZ(float angle);
|
||
|
|
||
|
/**
|
||
|
* Gets the rotation matrix around an arbitrary axis
|
||
|
*
|
||
|
* @param axis Axis (x, y and z)
|
||
|
* @param angle Angle (degrees)
|
||
|
*/
|
||
|
static Matrix4D rotation(Vector3f axis, float angle);
|
||
|
|
||
|
/**
|
||
|
* Gets the translation matrix
|
||
|
*
|
||
|
* @param x x-axis coordinate
|
||
|
* @param y y-axis coordinate
|
||
|
* @param z z-axis coordinate
|
||
|
*/
|
||
|
static Matrix4D translation(Vector3f v) {
|
||
|
return translation(v.getX(), v.getY(), v.getZ());
|
||
|
}
|
||
|
static Matrix4D translation(float x, float y, float z);
|
||
|
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif // MATRIX4D_H_
|