fiddling ...
This commit is contained in:
parent
bf834a33e0
commit
b2172d88fb
3 changed files with 203 additions and 194 deletions
|
@ -31,19 +31,34 @@
|
||||||
|
|
||||||
namespace pw {
|
namespace pw {
|
||||||
|
|
||||||
|
template <std::size_t R,std::size_t C,bool RowMajor = false>
|
||||||
|
struct matrixtraits_
|
||||||
|
{
|
||||||
|
//! rows
|
||||||
|
inline std::size_t rows() const { return R; }
|
||||||
|
|
||||||
|
//! return number of columns
|
||||||
|
inline std::size_t cols() const { return C; }
|
||||||
|
};
|
||||||
|
|
||||||
template <typename T, std::size_t R,std::size_t C,bool RowMajor = false>
|
template <typename T, std::size_t R,std::size_t C,bool RowMajor = false>
|
||||||
struct matrix_ : matrixbase_<T, matrix_<T, R, C>> {
|
struct matrix_ : matrixbase_<T, matrix_<T, R, C>>,matrixtraits_<R,C,RowMajor>
|
||||||
|
{
|
||||||
|
|
||||||
T data[R*C];
|
T data[R*C];
|
||||||
|
|
||||||
typedef matrixbase_<T, matrix_<T, R, C>> Base;
|
// typedef matrixbase_<T, matrix_<T, R, C>> Base;
|
||||||
using Base::Base;
|
using matrixbase_<T, matrix_<T, R, C>>::matrixbase_;
|
||||||
|
using matrixtraits_<R,C,RowMajor>::rows;
|
||||||
|
using matrixtraits_<R,C,RowMajor>::cols;
|
||||||
|
|
||||||
|
|
||||||
matrix_(const matrix_& other)
|
matrix_(const matrix_& other)
|
||||||
{
|
{
|
||||||
*this = other;
|
*this = other;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
explicit matrix_(std::initializer_list<T> args)
|
explicit matrix_(std::initializer_list<T> args)
|
||||||
{
|
{
|
||||||
typename std::initializer_list<T>::iterator it = args.begin();
|
typename std::initializer_list<T>::iterator it = args.begin();
|
||||||
|
@ -64,14 +79,9 @@ struct matrix_ : matrixbase_<T, matrix_<T, R, C>> {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! rows
|
|
||||||
inline std::size_t rows() const { return R; }
|
|
||||||
|
|
||||||
//! return number of columns
|
// //! get cell count
|
||||||
inline std::size_t cols() const { return C; }
|
// inline std::size_t coefficients() const { return this->size(); }
|
||||||
|
|
||||||
//! get cell count
|
|
||||||
inline std::size_t coefficients() const { return this->size(); }
|
|
||||||
|
|
||||||
inline size_t offset(size_t r,size_t c) const {
|
inline size_t offset(size_t r,size_t c) const {
|
||||||
return (RowMajor) ? r * C + c : c * R + r;
|
return (RowMajor) ? r * C + c : c * R + r;
|
||||||
|
|
|
@ -42,7 +42,7 @@ struct quaternion_ : vector4_<T> {
|
||||||
using Base::w;
|
using Base::w;
|
||||||
// using Base::lerp;
|
// using Base::lerp;
|
||||||
// using Base::operator*;
|
// using Base::operator*;
|
||||||
// using Base::operator/;
|
using Base::operator/;
|
||||||
|
|
||||||
inline const quaternion_ operator * (const quaternion_& rhs) const {
|
inline const quaternion_ operator * (const quaternion_& rhs) const {
|
||||||
return quaternion_(
|
return quaternion_(
|
||||||
|
@ -57,7 +57,7 @@ struct quaternion_ : vector4_<T> {
|
||||||
inline quaternion_ conjugate() const { return quaternion_( { -x(),-y(),-z(),w() } ); }
|
inline quaternion_ conjugate() const { return quaternion_( { -x(),-y(),-z(),w() } ); }
|
||||||
|
|
||||||
//! compute inverse
|
//! compute inverse
|
||||||
inline auto inverse() const {
|
inline quaternion_ inverse() const {
|
||||||
return conjugate() / this->norm();
|
return conjugate() / this->norm();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
|
|
||||||
namespace pw {
|
namespace pw {
|
||||||
|
|
||||||
|
|
||||||
template <typename T, std::size_t N>
|
template <typename T, std::size_t N>
|
||||||
struct vector_ : matrix_<T, N, 1,false>
|
struct vector_ : matrix_<T, N, 1,false>
|
||||||
{
|
{
|
||||||
|
@ -36,12 +35,12 @@ struct vector_ : matrix_<T, N, 1,false>
|
||||||
using typename Base::value_type;
|
using typename Base::value_type;
|
||||||
using Base::Base;
|
using Base::Base;
|
||||||
|
|
||||||
static T dot(const vector_ &a,const vector_ &b) {
|
static T dot(const Base &a,const Base &b) {
|
||||||
vector_ r; for (size_t i = 0;i < N;i++) r[i] = a[i] * b[i];
|
vector_ r; for (size_t i = 0;i < N;i++) r[i] = a[i] * b[i];
|
||||||
return std::accumulate(std::begin(r), std::end(r), T(0));
|
return std::accumulate(std::begin(r), std::end(r), T(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
static T angle_between(const vector_ &a,const vector_ &b) {
|
static T angle_between(const Base &a,const Base &b) {
|
||||||
return std::acos( dot( a.normalized(), b.normalized() ) );
|
return std::acos( dot( a.normalized(), b.normalized() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue