// 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" #include "IdentityBuilder.hpp" namespace mathter { template class ScaleBuilder { public: ScaleBuilder(const Vector& scale) : scale(scale) {} ScaleBuilder& operator=(const ScaleBuilder&) = delete; template operator Matrix() const { Matrix m; Set(m); return m; } template operator Matrix() const { Matrix m; Set(m); return m; } template operator Matrix() const { Matrix m; Set(m); return m; } template operator Matrix() const { Matrix m; Set(m); return m; } private: template void Set(Matrix& m) const { m = Identity(); int i; for (i = 0; i < scale.Dimension(); ++i) { m(i, i) = std::move(scale(i)); } for (; i < std::min(Rows, Columns); ++i) { m(i, i) = T(1); } } const Vector scale; }; /// Creates a scaling matrix. /// A vector containing the scales of respective axes. /// The vector's dimension must be less than or equal to the matrix dimension. template auto Scale(const Vector& scale) { return ScaleBuilder{ scale }; } /// Creates a scaling matrix. /// A list of scalars corresponding to scaling on respective axes. /// The number of arguments must be less than or equal to the matrix dimension. template ::type...>::value), int>::type = 0> auto Scale(Args&&... scales) { using PromotedT = decltype((0 + ... + scales)); return ScaleBuilder{ Vector(scales...) }; } } // namespace mathter