fiddling ...

This commit is contained in:
Hartmut Seichter 2019-01-21 17:11:10 +01:00
parent bf834a33e0
commit b2172d88fb
3 changed files with 203 additions and 194 deletions

View file

@ -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;

View file

@ -40,9 +40,9 @@ struct quaternion_ : vector4_<T> {
using Base::y; using Base::y;
using Base::z; using Base::z;
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();
} }

View file

@ -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() ) );
} }