mirror of
https://github.com/BlackMATov/vmath.hpp.git
synced 2025-12-14 20:31:25 +07:00
translate, rotate and scale for 2d
This commit is contained in:
@@ -180,6 +180,14 @@ namespace vmath_hpp
|
||||
{
|
||||
// translate
|
||||
|
||||
template < typename T >
|
||||
constexpr mat<T, 3> translate(const vec<T, 2>& v) {
|
||||
return {
|
||||
{ 1, 0, 0},
|
||||
{ 0, 1, 0},
|
||||
{v.x, v.y, 1}};
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
constexpr mat<T, 4> translate(const vec<T, 3>& v) {
|
||||
return {
|
||||
@@ -189,6 +197,11 @@ namespace vmath_hpp
|
||||
{v.x, v.y, v.z, 1}};
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
constexpr mat<T, 3> translate(const mat<T, 3>& m, const vec<T, 2>& v) {
|
||||
return m * translate(v);
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
constexpr mat<T, 4> translate(const mat<T, 4>& m, const vec<T, 3>& v) {
|
||||
return m * translate(v);
|
||||
@@ -196,6 +209,16 @@ namespace vmath_hpp
|
||||
|
||||
// rotate
|
||||
|
||||
template < typename T >
|
||||
mat<T, 3> rotate(T angle) {
|
||||
const T cs = cos(angle);
|
||||
const T sn = sin(angle);
|
||||
return {
|
||||
cs, sn, 0,
|
||||
-sn, cs, 0,
|
||||
0, 0, 1};
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
mat<T, 4> rotate(T angle, const vec<T, 3>& axis) {
|
||||
const T x = axis.x;
|
||||
@@ -220,6 +243,11 @@ namespace vmath_hpp
|
||||
0, 0, 0, 1};
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
mat<T, 3> rotate(const mat<T, 3>& m, T angle) {
|
||||
return m * rotate(angle);
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
mat<T, 4> rotate(const mat<T, 4>& m, T angle, const vec<T, 3>& axis) {
|
||||
return m * rotate(angle, axis);
|
||||
@@ -227,13 +255,26 @@ namespace vmath_hpp
|
||||
|
||||
// scale
|
||||
|
||||
template < typename T >
|
||||
constexpr mat<T, 3> scale(const vec<T, 2>& v) {
|
||||
return {
|
||||
{v.x, 0, 0},
|
||||
{ 0, v.y, 0},
|
||||
{ 0, 0, 1}};
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
constexpr mat<T, 4> scale(const vec<T, 3>& v) {
|
||||
return {
|
||||
{v.x, 0, 0, 0},
|
||||
{ 0, v.y, 0, 0},
|
||||
{ 0, 0, v.z, 0},
|
||||
{ 0, 0, 0, 1}};
|
||||
{v.x, 0, 0, 0},
|
||||
{ 0, v.y, 0, 0},
|
||||
{ 0, 0, v.z, 0},
|
||||
{ 0, 0, 0, 1}};
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
constexpr mat<T, 3> scale(const mat<T, 3>& m, const vec<T, 2>& v) {
|
||||
return m * scale(v);
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
|
||||
@@ -108,6 +108,9 @@ TEST_CASE("vmath/ext") {
|
||||
}
|
||||
|
||||
SECTION("matrix translate") {
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * translate(float2{1.f,2.f}) == approx3(3.f,5.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * translate(translate(float2{1.f,2.f}), float2{1.f,2.f}) == approx3(4.f,7.f,1.f));
|
||||
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * translate(float3{1.f,2.f,3.f}) == approx4(3.f,5.f,7.f,1.f));
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * translate(translate(float3{1.f,2.f,3.f}), float3{1.f,2.f,3.f}) == approx4(4.f,7.f,10.f,1.f));
|
||||
}
|
||||
@@ -116,17 +119,21 @@ TEST_CASE("vmath/ext") {
|
||||
constexpr float pi = radians(180.f);
|
||||
constexpr float pi_2 = radians(90.f);
|
||||
|
||||
REQUIRE(float3(2.f,3.f,1.f) * rotate(pi) == approx3(-2.f,-3.f,1.f));
|
||||
REQUIRE(float4(2.f,3.f,4.f,1.f) * rotate(pi,{0.f,0.f,1.f}) == approx4(-2.f,-3.f,4.f,1.f));
|
||||
REQUIRE(float4(2.f,3.f,4.f,1.f) * rotate(pi,float3{0.f,0.f,1.f}) == approx4(-2.f,-3.f,4.f,1.f));
|
||||
|
||||
REQUIRE(float3(2.f,3.f,1.f) * rotate(rotate(pi_2),pi_2) == approx3(-2.f,-3.f,1.f));
|
||||
REQUIRE(float4(2.f,3.f,4.f,1.f) * rotate(rotate(pi_2,{0.f,0.f,1.f}),pi_2,{0.f,0.f,1.f}) == approx4(-2.f,-3.f,4.f,1.f));
|
||||
REQUIRE(float4(2.f,3.f,4.f,1.f) * rotate(rotate(pi_2,float3{0.f,0.f,1.f}),pi_2,float3{0.f,0.f,1.f}) == approx4(-2.f,-3.f,4.f,1.f));
|
||||
}
|
||||
|
||||
SECTION("matrix scale") {
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * scale(float2{2.f,3.f}) == approx3(4.f,9.f,1.f));
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * scale(float3{2.f,3.f,4.f}) == approx4(4.f,9.f,16.f,1.f));
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * scale(float3{2.f,3.f,4.f}) == approx4(4.f,9.f,16.f,1.f));
|
||||
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * scale(scale(float2{2.f,2.f}), {2.f,3.f}) == approx3(8.f,18.f,1.f));
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * scale(scale(float3{2.f,2.f,2.f}), {2.f,3.f,4.f}) == approx4(8.f,18.f,32.f,1.f));
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * scale(scale(float3{2.f,2.f,2.f}), float3{2.f,3.f,4.f}) == approx4(8.f,18.f,32.f,1.f));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user