// L============================================================================= // L This software is distributed under the MIT license. // L Copyright 2021 Péter Kardos // L============================================================================= #pragma once #include "../Matrix/MatrixImpl.hpp" #include "../Vector.hpp" namespace mathter { template class ShearBuilder { public: ShearBuilder(T slope, int principalAxis, int modulatorAxis) : slope(slope), principalAxis(principalAxis), modulatorAxis(modulatorAxis) {} ShearBuilder& operator=(const ShearBuilder&) = delete; template operator Matrix() const { Matrix m; Set(m); return m; } private: template void Set(Matrix& m) const { assert(principalAxis != modulatorAxis); m = Identity(); if constexpr (Order == eMatrixOrder::FOLLOW_VECTOR) { assert(modulatorAxis < Rows); assert(principalAxis < Columns); m(modulatorAxis, principalAxis) = slope; } else { assert(principalAxis < Rows); assert(modulatorAxis < Columns); m(principalAxis, modulatorAxis) = slope; } } const T slope; const int principalAxis; const int modulatorAxis; }; /// Creates a shear matrix. /// Strength of the shear. /// Points are moved along this axis. /// The displacement of points is proportional to this coordinate's value. /// The formula for displacement along the pricipal axis is /// *pos[]. template auto Shear(T slope, int principalAxis, int modulatorAxis) { return ShearBuilder(slope, principalAxis, modulatorAxis); } } // namespace mathter