vector project function

This commit is contained in:
BlackMATov
2020-12-06 03:07:08 +07:00
parent f9dd3b6105
commit 80287ccaf8
3 changed files with 15 additions and 0 deletions

View File

@@ -1286,6 +1286,9 @@ vec<T, 3> rotate(const vec<T, 3>& v, T angle, const vec<T, 3>& normal);
template < typename T >
vec<T, 4> rotate(const vec<T, 4>& v, T angle, const vec<T, 3>& normal);
template < typename T, std::size_t Size >
vec<T, Size> project(const vec<T, Size>& v, const vec<T, Size>& normal);
```
## [License (MIT)](./LICENSE.md)

View File

@@ -636,4 +636,11 @@ namespace vmath_hpp
[[nodiscard]] vec<T, 4> rotate(const vec<T, 4>& v, T angle, const vec<T, 3>& normal) {
return v * rotate(angle, normal);
}
// project
template < typename T, std::size_t Size >
[[nodiscard]] vec<T, Size> project(const vec<T, Size>& v, const vec<T, Size>& normal) {
return dot(v, normal) / length2(normal) * normal;
}
}

View File

@@ -221,4 +221,9 @@ TEST_CASE("vmath/ext") {
REQUIRE(rotate(float3(1.5f,0.f,0.f), radians(90.f), float3(0,0,1)) == approx3(0.f,1.5f,0.f));
REQUIRE(rotate(float4(1.5f,0.f,0.f,1.f), radians(90.f), float3(0,0,1)) == approx4(0.f,1.5f,0.f,1.f));
}
SUBCASE("vector project") {
REQUIRE(project(float2(2.f, 2.f), float2(0.f, 1.f)) == approx2(0.f, 2.f));
REQUIRE(project(float3(2.f, 2.f, 2.f), float3(0.f, 0.f, 1.f)) == approx3(0.f, 0.f, 2.f));
}
}