mirror of
https://github.com/BlackMATov/vmath.hpp.git
synced 2025-12-15 04:35:25 +07:00
diagonal ext function
This commit is contained in:
10
README.md
10
README.md
@@ -1769,13 +1769,13 @@ template < typename T, size_t Size >
|
|||||||
T component(const vec<T, Size>& v, size_t index);
|
T component(const vec<T, Size>& v, size_t index);
|
||||||
|
|
||||||
template < typename T, size_t Size >
|
template < typename T, size_t Size >
|
||||||
vec<T, Size> component(vec<T, Size> v, size_t index, T x);
|
vec<T, Size> component(const vec<T, Size>& v, size_t index, T x);
|
||||||
|
|
||||||
template < typename T, size_t Size >
|
template < typename T, size_t Size >
|
||||||
vec<T, Size> row(const mat<T, Size>& m, size_t index);
|
vec<T, Size> row(const mat<T, Size>& m, size_t index);
|
||||||
|
|
||||||
template < typename T, size_t Size >
|
template < typename T, size_t Size >
|
||||||
mat<T, Size> row(mat<T, Size> m, size_t index, const vec<T, Size>& v);
|
mat<T, Size> row(const mat<T, Size>& m, size_t index, const vec<T, Size>& v);
|
||||||
|
|
||||||
template < typename T, size_t Size >
|
template < typename T, size_t Size >
|
||||||
vec<T, Size> column(const mat<T, Size>& m, size_t index);
|
vec<T, Size> column(const mat<T, Size>& m, size_t index);
|
||||||
@@ -1783,6 +1783,12 @@ vec<T, Size> column(const mat<T, Size>& m, size_t index);
|
|||||||
template < typename T, size_t Size >
|
template < typename T, size_t Size >
|
||||||
mat<T, Size> column(const mat<T, Size>& m, size_t index, const vec<T, Size>& v);
|
mat<T, Size> column(const mat<T, Size>& m, size_t index, const vec<T, Size>& v);
|
||||||
|
|
||||||
|
template < typename T, size_t Size >
|
||||||
|
vec<T, Size> diagonal(const mat<T, Size>& m);
|
||||||
|
|
||||||
|
template < typename T, size_t Size >
|
||||||
|
mat<T, Size> diagonal(const mat<T, Size>& m, const vec<T, Size>& diagonal);
|
||||||
|
|
||||||
template < typename T >
|
template < typename T >
|
||||||
T real(const qua<T>& q);
|
T real(const qua<T>& q);
|
||||||
|
|
||||||
|
|||||||
@@ -152,9 +152,10 @@ namespace vmath_hpp
|
|||||||
}
|
}
|
||||||
|
|
||||||
template < typename T, std::size_t Size >
|
template < typename T, std::size_t Size >
|
||||||
[[nodiscard]] constexpr vec<T, Size> component(vec<T, Size> v, std::size_t index, T component) {
|
[[nodiscard]] constexpr vec<T, Size> component(const vec<T, Size>& v, std::size_t index, T component) {
|
||||||
v[index] = component;
|
vec vv = v;
|
||||||
return v;
|
vv[index] = component;
|
||||||
|
return vv;
|
||||||
}
|
}
|
||||||
|
|
||||||
// row
|
// row
|
||||||
@@ -165,9 +166,10 @@ namespace vmath_hpp
|
|||||||
}
|
}
|
||||||
|
|
||||||
template < typename T, std::size_t Size >
|
template < typename T, std::size_t Size >
|
||||||
[[nodiscard]] constexpr mat<T, Size> row(mat<T, Size> m, std::size_t index, const vec<T, Size>& row) {
|
[[nodiscard]] constexpr mat<T, Size> row(const mat<T, Size>& m, std::size_t index, const vec<T, Size>& row) {
|
||||||
m.rows[index] = row;
|
mat mm = m;
|
||||||
return m;
|
mm[index] = row;
|
||||||
|
return mm;
|
||||||
}
|
}
|
||||||
|
|
||||||
// column
|
// column
|
||||||
@@ -197,6 +199,31 @@ namespace vmath_hpp
|
|||||||
return impl::column_impl(m, index, column, std::make_index_sequence<Size>{});
|
return impl::column_impl(m, index, column, std::make_index_sequence<Size>{});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// diagonal
|
||||||
|
|
||||||
|
namespace impl
|
||||||
|
{
|
||||||
|
template < typename T, std::size_t Size, std::size_t... Is >
|
||||||
|
[[nodiscard]] constexpr vec<T, Size> diagonal_impl(const mat<T, Size>& m, std::index_sequence<Is...>) {
|
||||||
|
return { m[Is][Is]... };
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename T, std::size_t Size, std::size_t... Is >
|
||||||
|
[[nodiscard]] constexpr mat<T, Size> diagonal_impl(const mat<T, Size>& m, const vec<T, Size>& diagonal, std::index_sequence<Is...>) {
|
||||||
|
return { component(m[Is], Is, diagonal[Is])... };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename T, std::size_t Size >
|
||||||
|
[[nodiscard]] constexpr vec<T, Size> diagonal(const mat<T, Size>& m) {
|
||||||
|
return impl::diagonal_impl(m, std::make_index_sequence<Size>{});
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename T, std::size_t Size >
|
||||||
|
[[nodiscard]] constexpr mat<T, Size> diagonal(const mat<T, Size>& m, const vec<T, Size>& diagonal) {
|
||||||
|
return impl::diagonal_impl(m, diagonal, std::make_index_sequence<Size>{});
|
||||||
|
}
|
||||||
|
|
||||||
// real
|
// real
|
||||||
|
|
||||||
template < typename T >
|
template < typename T >
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ endif()
|
|||||||
|
|
||||||
file(GLOB_RECURSE UNTESTS_SOURCES "*.cpp" "*.hpp")
|
file(GLOB_RECURSE UNTESTS_SOURCES "*.cpp" "*.hpp")
|
||||||
add_executable(${PROJECT_NAME} ${UNTESTS_SOURCES})
|
add_executable(${PROJECT_NAME} ${UNTESTS_SOURCES})
|
||||||
target_link_libraries(${PROJECT_NAME} vmath.hpp.singles)
|
target_link_libraries(${PROJECT_NAME} vmath.hpp)
|
||||||
|
|
||||||
target_compile_options(${PROJECT_NAME}
|
target_compile_options(${PROJECT_NAME}
|
||||||
PRIVATE
|
PRIVATE
|
||||||
|
|||||||
@@ -205,6 +205,14 @@ TEST_CASE("vmath/ext/access") {
|
|||||||
STATIC_CHECK(column(imat2(), 1, {3,4}) == imat2(1,3,0,4));
|
STATIC_CHECK(column(imat2(), 1, {3,4}) == imat2(1,3,0,4));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SUBCASE("diagonal") {
|
||||||
|
STATIC_CHECK(diagonal(imat2(1,2,3,4)) == ivec2(1,4));
|
||||||
|
STATIC_CHECK(diagonal(imat2(1,2,3,4), ivec2(10,40)) == imat2(10,2,3,40));
|
||||||
|
|
||||||
|
STATIC_CHECK(diagonal(imat3(1,2,3,4,5,6,7,8,9)) == ivec3(1,5,9));
|
||||||
|
STATIC_CHECK(diagonal(imat3(1,2,3,4,5,6,7,8,9), ivec3(10,50,90)) == imat3(10,2,3,4,50,6,7,8,90));
|
||||||
|
}
|
||||||
|
|
||||||
SUBCASE("real") {
|
SUBCASE("real") {
|
||||||
STATIC_CHECK(real(qua{1,2,3,4}) == 4);
|
STATIC_CHECK(real(qua{1,2,3,4}) == 4);
|
||||||
STATIC_CHECK(real(qua{1,2,3,4}, 5) == qua{1,2,3,5});
|
STATIC_CHECK(real(qua{1,2,3,4}, 5) == qua{1,2,3,5});
|
||||||
|
|||||||
@@ -362,10 +362,10 @@ namespace vmath_hpp
|
|||||||
namespace vmath_hpp
|
namespace vmath_hpp
|
||||||
{
|
{
|
||||||
template fix<float> component(const fix2f&, std::size_t);
|
template fix<float> component(const fix2f&, std::size_t);
|
||||||
template fix2f component(fix2f, std::size_t, fix<float>);
|
template fix2f component(const fix2f&, std::size_t, fix<float>);
|
||||||
|
|
||||||
template fix2f row(const fix2x2f&, std::size_t);
|
template fix2f row(const fix2x2f&, std::size_t);
|
||||||
template fix2x2f row(fix2x2f, std::size_t, const fix2f&);
|
template fix2x2f row(const fix2x2f&, std::size_t, const fix2f&);
|
||||||
|
|
||||||
template fix2f column(const fix2x2f&, std::size_t);
|
template fix2f column(const fix2x2f&, std::size_t);
|
||||||
template fix2x2f column(const fix2x2f&, std::size_t, const fix2f&);
|
template fix2x2f column(const fix2x2f&, std::size_t, const fix2f&);
|
||||||
|
|||||||
Reference in New Issue
Block a user