translate, rotate and scale for 2d

This commit is contained in:
BlackMATov
2020-11-26 17:49:13 +07:00
parent 15cd3a981e
commit 29b6ec8d89
2 changed files with 52 additions and 4 deletions

View File

@@ -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 >

View File

@@ -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));
}