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 {
|
||||
|
||||
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>
|
||||
struct matrix_ : matrixbase_<T, matrix_<T, R, C>> {
|
||||
struct matrix_ : matrixbase_<T, matrix_<T, R, C>>,matrixtraits_<R,C,RowMajor>
|
||||
{
|
||||
|
||||
T data[R*C];
|
||||
|
||||
typedef matrixbase_<T, matrix_<T, R, C>> Base;
|
||||
using Base::Base;
|
||||
// typedef matrixbase_<T, matrix_<T, R, C>> 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)
|
||||
{
|
||||
*this = other;
|
||||
}
|
||||
|
||||
|
||||
explicit matrix_(std::initializer_list<T> args)
|
||||
{
|
||||
typename std::initializer_list<T>::iterator it = args.begin();
|
||||
|
@ -64,14 +79,9 @@ struct matrix_ : matrixbase_<T, matrix_<T, R, C>> {
|
|||
return *this;
|
||||
}
|
||||
|
||||
//! rows
|
||||
inline std::size_t rows() const { return R; }
|
||||
|
||||
//! return number of columns
|
||||
inline std::size_t cols() const { return C; }
|
||||
|
||||
//! get cell count
|
||||
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 {
|
||||
return (RowMajor) ? r * C + c : c * R + r;
|
||||
|
|
|
@ -42,7 +42,7 @@ struct quaternion_ : vector4_<T> {
|
|||
using Base::w;
|
||||
// using Base::lerp;
|
||||
// using Base::operator*;
|
||||
// using Base::operator/;
|
||||
using Base::operator/;
|
||||
|
||||
inline const quaternion_ operator * (const quaternion_& rhs) const {
|
||||
return quaternion_(
|
||||
|
@ -57,7 +57,7 @@ struct quaternion_ : vector4_<T> {
|
|||
inline quaternion_ conjugate() const { return quaternion_( { -x(),-y(),-z(),w() } ); }
|
||||
|
||||
//! compute inverse
|
||||
inline auto inverse() const {
|
||||
inline quaternion_ inverse() const {
|
||||
return conjugate() / this->norm();
|
||||
}
|
||||
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
|
||||
namespace pw {
|
||||
|
||||
|
||||
template <typename T, std::size_t N>
|
||||
struct vector_ : matrix_<T, N, 1,false>
|
||||
{
|
||||
|
@ -36,12 +35,12 @@ struct vector_ : matrix_<T, N, 1,false>
|
|||
using typename Base::value_type;
|
||||
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];
|
||||
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() ) );
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue