Implement Several Methods
This commit is contained in:
@@ -63,7 +63,8 @@ add_library(J3ML SHARED ${J3ML_SRC}
|
||||
include/J3ML/Algorithm/Spring.h
|
||||
include/J3ML/Algorithm/DifferentialSolvers.h
|
||||
include/J3ML/Units.h
|
||||
src/J3ML/J3ML.cpp)
|
||||
src/J3ML/J3ML.cpp
|
||||
include/J3ML/LinearAlgebra/Matrix.h)
|
||||
set_target_properties(J3ML PROPERTIES LINKER_LANGUAGE CXX)
|
||||
|
||||
install(TARGETS ${PROJECT_NAME} DESTINATION lib/${PROJECT_NAME})
|
||||
|
66
include/J3ML/LinearAlgebra/Matrix.h
Normal file
66
include/J3ML/LinearAlgebra/Matrix.h
Normal file
@@ -0,0 +1,66 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstdlib>
|
||||
#include <algorithm>
|
||||
#include "Vector.h"
|
||||
|
||||
namespace J3ML::LinearAlgebra
|
||||
{
|
||||
|
||||
|
||||
template <uint ROWS, uint COLS, typename T>
|
||||
class Matrix
|
||||
{
|
||||
static constexpr uint Diag = std::min(ROWS, COLS);
|
||||
|
||||
using RowVector = Vector<ROWS, T>;
|
||||
using ColVector = Vector<COLS, T>;
|
||||
using DiagVector = Vector<Diag, T>;
|
||||
|
||||
enum { Rows = ROWS };
|
||||
enum { Cols = COLS };
|
||||
|
||||
void AssertRowSize(uint rows)
|
||||
{
|
||||
assert(rows < Rows && "");
|
||||
}
|
||||
void AssertColumnSize(uint cols)
|
||||
{
|
||||
assert(cols < Cols && "");
|
||||
}
|
||||
|
||||
RowVector GetRow(uint index) const;
|
||||
ColVector GetColumn(uint index) const;
|
||||
void SetRow(uint index, RowVector);
|
||||
void SetColumn(uint index, ColVector);
|
||||
|
||||
RowVector &Row(uint index) const;
|
||||
ColVector &Column(uint index) const;
|
||||
|
||||
const T At(uint row, uint col) const
|
||||
{
|
||||
AssertRowSize(row);
|
||||
AssertColumnSize(col);
|
||||
|
||||
return elems[row][col];
|
||||
}
|
||||
|
||||
T &At(uint row, uint col)
|
||||
{
|
||||
AssertRowSize(row);
|
||||
AssertColumnSize(col);
|
||||
|
||||
return elems[row][col];
|
||||
}
|
||||
|
||||
float* ptr();
|
||||
const float* ptr() const;
|
||||
|
||||
float operator[](uint index) const;
|
||||
float& operator[](uint index);
|
||||
|
||||
private:
|
||||
T elems[ROWS][COLS];
|
||||
};
|
||||
}
|
@@ -16,9 +16,17 @@ namespace J3ML::LinearAlgebra {
|
||||
Matrix2x2(float val);
|
||||
Matrix2x2(float m00, float m01, float m10, float m11);
|
||||
Matrix2x2(const Vector2& r1, const Vector2& r2);
|
||||
explicit Matrix2x2(const float *data);
|
||||
|
||||
Vector2 GetRow(int index) const;
|
||||
Vector2 GetColumn(int index) const;
|
||||
|
||||
void SetRow(int i, const Vector2& row);
|
||||
void SetColumn(int i, const Vector2& col);
|
||||
void SetAt(int x, int y, float value);
|
||||
|
||||
float At(int x, int y) const;
|
||||
float &At(int x, int y);
|
||||
|
||||
float Determinant() const;
|
||||
Matrix2x2 Inverse() const;
|
||||
|
@@ -40,6 +40,8 @@ namespace J3ML::LinearAlgebra {
|
||||
Matrix3x3(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22);
|
||||
Matrix3x3(const Vector3& r1, const Vector3& r2, const Vector3& r3);
|
||||
explicit Matrix3x3(const Quaternion& orientation);
|
||||
explicit Matrix3x3(const float *data);
|
||||
|
||||
|
||||
static Matrix3x3 RotateX(float radians);
|
||||
static Matrix3x3 RotateY(float radians);
|
||||
@@ -56,10 +58,8 @@ namespace J3ML::LinearAlgebra {
|
||||
/// Creates a new M3x3 that rotates about the given axis by the given angle
|
||||
static Matrix3x3 RotateAxisAngle(const Vector3& axis, float angleRadians);
|
||||
|
||||
static Matrix3x3 RotateFromTo(const Vector3& source, const Vector3& direction)
|
||||
{
|
||||
|
||||
}
|
||||
// TODO: Implement
|
||||
static Matrix3x3 RotateFromTo(const Vector3& source, const Vector3& direction);
|
||||
|
||||
void SetRow(int i, const Vector3 &vector3);
|
||||
void SetColumn(int i, const Vector3& vector);
|
||||
|
@@ -46,29 +46,7 @@ namespace J3ML::LinearAlgebra {
|
||||
/// Constructs this float4x4 to represent the same transformation as the given float3x3.
|
||||
/** This function expands the last row and column of this matrix with the elements from the identity matrix. */
|
||||
Matrix4x4(const Matrix3x3&);
|
||||
explicit Matrix4x4(const float* data)
|
||||
{
|
||||
assert(data);
|
||||
At(0, 0) = data[0];
|
||||
At(0, 1) = data[1];
|
||||
At(0, 2) = data[2];
|
||||
At(0, 3) = data[3];
|
||||
|
||||
At(1, 0) = data[4];
|
||||
At(1, 1) = data[5];
|
||||
At(1, 2) = data[6];
|
||||
At(1, 3) = data[7];
|
||||
|
||||
At(2, 0) = data[8];
|
||||
At(2, 1) = data[9];
|
||||
At(2, 2) = data[10];
|
||||
At(2, 3) = data[11];
|
||||
|
||||
At(3, 0) = data[12];
|
||||
At(3, 1) = data[13];
|
||||
At(3, 2) = data[14];
|
||||
At(3, 3) = data[15];
|
||||
}
|
||||
explicit Matrix4x4(const float* data);
|
||||
|
||||
/// Constructs a new float4x4 by explicitly specifying all the matrix elements.
|
||||
/// The elements are specified in row-major format, i.e. the first row first followed by the second and third row.
|
||||
|
@@ -1,13 +1,15 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
template <typename T, int Dims>
|
||||
class templated_vector
|
||||
#include <cstdlib>
|
||||
|
||||
namespace J3ML::LinearAlgebra
|
||||
{
|
||||
template <uint DIMS, typename T>
|
||||
class Vector {
|
||||
public:
|
||||
enum { Dimensions = DIMS};
|
||||
T elems[DIMS];
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
using v2f = templated_vector<float, 2>;
|
||||
using v3f = templated_vector<float, 3>;
|
||||
using v4f = templated_vector<float, 4>;
|
||||
}
|
||||
|
@@ -18,4 +18,8 @@ namespace J3ML::LinearAlgebra {
|
||||
float Matrix2x2::At(int x, int y) const {
|
||||
return this->elems[x][y];
|
||||
}
|
||||
|
||||
float &Matrix2x2::At(int x, int y) {
|
||||
return this->elems[x][y];
|
||||
}
|
||||
}
|
@@ -362,5 +362,20 @@ namespace J3ML::LinearAlgebra {
|
||||
SetColumn(c2, v2);
|
||||
}
|
||||
|
||||
Matrix3x3::Matrix3x3(const float *data) {
|
||||
assert(data);
|
||||
At(0, 0) = data[0];
|
||||
At(0, 1) = data[1];
|
||||
At(0, 2) = data[2];
|
||||
|
||||
At(1, 0) = data[4];
|
||||
At(1, 1) = data[5];
|
||||
At(1, 2) = data[6];
|
||||
|
||||
At(2, 0) = data[8];
|
||||
At(2, 1) = data[9];
|
||||
At(2, 2) = data[10];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@@ -570,4 +570,27 @@ namespace J3ML::LinearAlgebra {
|
||||
|
||||
return {p00, p01, p02, p03, p10, p11, p12, p13, p20, p21, p22, p23, p30, p31, p32, p33};
|
||||
}
|
||||
|
||||
Matrix4x4::Matrix4x4(const float *data) {
|
||||
assert(data);
|
||||
At(0, 0) = data[0];
|
||||
At(0, 1) = data[1];
|
||||
At(0, 2) = data[2];
|
||||
At(0, 3) = data[3];
|
||||
|
||||
At(1, 0) = data[4];
|
||||
At(1, 1) = data[5];
|
||||
At(1, 2) = data[6];
|
||||
At(1, 3) = data[7];
|
||||
|
||||
At(2, 0) = data[8];
|
||||
At(2, 1) = data[9];
|
||||
At(2, 2) = data[10];
|
||||
At(2, 3) = data[11];
|
||||
|
||||
At(3, 0) = data[12];
|
||||
At(3, 1) = data[13];
|
||||
At(3, 2) = data[14];
|
||||
At(3, 3) = data[15];
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user