mirror of
https://github.com/BlackMATov/vmath.hpp.git
synced 2025-12-16 22:19:51 +07:00
length2 and distance2
This commit is contained in:
@@ -131,19 +131,29 @@ namespace vmath_hpp
|
||||
|
||||
namespace vmath_hpp
|
||||
{
|
||||
template < typename T >
|
||||
constexpr T dot(T x, T y) noexcept {
|
||||
return x * y;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
T length(T x) noexcept {
|
||||
return abs(x);
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
T distance(T x, T y) noexcept {
|
||||
return length(x - y);
|
||||
constexpr T length2(T x) noexcept {
|
||||
return dot(x, x);
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
T dot(T x, T y) noexcept {
|
||||
return x * y;
|
||||
T distance(T x, T y) noexcept {
|
||||
return length(y - x);
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
constexpr T distance2(T x, T y) noexcept {
|
||||
return length2(y - x);
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
@@ -152,12 +162,12 @@ namespace vmath_hpp
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
T faceforward(T n, T i, T nref) noexcept {
|
||||
constexpr T faceforward(T n, T i, T nref) noexcept {
|
||||
return dot(nref, i) < T(0) ? n : -n;
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
T reflect(T i, T n) noexcept {
|
||||
constexpr T reflect(T i, T n) noexcept {
|
||||
return i - n * dot(n, i) * T(2);
|
||||
}
|
||||
|
||||
|
||||
@@ -536,19 +536,31 @@ namespace vmath_hpp
|
||||
|
||||
namespace vmath_hpp
|
||||
{
|
||||
template < typename T, std::size_t Size >
|
||||
constexpr T dot(const vec<T, Size>& xs, const vec<T, Size>& ys) {
|
||||
return fold([](T acc, T x, T y){
|
||||
return acc + (x * y);
|
||||
}, T(0), xs, ys);
|
||||
}
|
||||
|
||||
template < typename T, std::size_t Size >
|
||||
T length(const vec<T, Size>& xs) {
|
||||
return sqrt(dot(xs, xs));
|
||||
}
|
||||
|
||||
template < typename T, std::size_t Size >
|
||||
T distance(const vec<T, Size>& xs, const vec<T, Size>& ys) {
|
||||
return length(xs - ys);
|
||||
constexpr T length2(const vec<T, Size>& xs) {
|
||||
return dot(xs, xs);
|
||||
}
|
||||
|
||||
template < typename T, std::size_t Size >
|
||||
constexpr T dot(const vec<T, Size>& xs, const vec<T, Size>& ys) {
|
||||
return fold(std::plus<>(), T(0), zip(std::multiplies<>(), xs, ys));
|
||||
T distance(const vec<T, Size>& xs, const vec<T, Size>& ys) {
|
||||
return length(ys - xs);
|
||||
}
|
||||
|
||||
template < typename T, std::size_t Size >
|
||||
constexpr T distance2(const vec<T, Size>& xs, const vec<T, Size>& ys) {
|
||||
return length2(ys - xs);
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
@@ -565,12 +577,12 @@ namespace vmath_hpp
|
||||
}
|
||||
|
||||
template < typename T, std::size_t Size >
|
||||
vec<T, Size> faceforward(const vec<T, Size>& n, const vec<T, Size>& i, const vec<T, Size>& nref) {
|
||||
constexpr vec<T, Size> faceforward(const vec<T, Size>& n, const vec<T, Size>& i, const vec<T, Size>& nref) {
|
||||
return dot(nref, i) < T(0) ? n : -n;
|
||||
}
|
||||
|
||||
template < typename T, std::size_t Size >
|
||||
vec<T, Size> reflect(const vec<T, Size>& i, const vec<T, Size>& n) {
|
||||
constexpr vec<T, Size> reflect(const vec<T, Size>& i, const vec<T, Size>& n) {
|
||||
return i - n * dot(n, i) * T(2);
|
||||
}
|
||||
|
||||
|
||||
@@ -114,14 +114,20 @@ TEST_CASE("vmath/fun") {
|
||||
REQUIRE(length(10.f) == approx(10.f));
|
||||
REQUIRE(length(-10.f) == approx(10.f));
|
||||
|
||||
STATIC_REQUIRE(length2(10.f) == approx(100.f));
|
||||
STATIC_REQUIRE(length2(-10.f) == approx(100.f));
|
||||
|
||||
REQUIRE(distance(5.f, 10.f) == approx(5.f));
|
||||
REQUIRE(distance(-5.f, -10.f) == approx(5.f));
|
||||
|
||||
STATIC_REQUIRE(distance2(5.f, 10.f) == approx(25.f));
|
||||
STATIC_REQUIRE(distance2(-5.f, -10.f) == approx(25.f));
|
||||
|
||||
REQUIRE(dot(2.f, 5.f) == approx(10.f));
|
||||
REQUIRE(normalize(0.5f) == approx(1.f));
|
||||
|
||||
REQUIRE(faceforward(1.f, 2.f, 3.f) == approx(-1.f));
|
||||
REQUIRE(reflect(1.f, 2.f) == approx(-7.f));
|
||||
STATIC_REQUIRE(faceforward(1.f, 2.f, 3.f) == approx(-1.f));
|
||||
STATIC_REQUIRE(reflect(1.f, 2.f) == approx(-7.f));
|
||||
REQUIRE(refract(1.f, 2.f, 1.f) == approx(-7.f));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -158,15 +158,21 @@ TEST_CASE("vmath/vec_fun") {
|
||||
REQUIRE(length(vec2f(10.f,0.f)) == Approx(10.f));
|
||||
REQUIRE(length(vec2f(-10.f,0.f)) == Approx(10.f));
|
||||
|
||||
STATIC_REQUIRE(length2(vec2f(10.f,0.f)) == approx(100.f));
|
||||
STATIC_REQUIRE(length2(vec2f(-10.f,0.f)) == approx(100.f));
|
||||
|
||||
REQUIRE(distance(vec2f(5.f,0.f), vec2f(10.f,0.f)) == Approx(5.f));
|
||||
REQUIRE(distance(vec2f(-5.f,0.f), vec2f(-10.f,0.f)) == Approx(5.f));
|
||||
|
||||
STATIC_REQUIRE(distance2(vec2f(5.f,0.f), vec2f(10.f,0.f)) == approx(25.f));
|
||||
STATIC_REQUIRE(distance2(vec2f(-5.f,0.f), vec2f(-10.f,0.f)) == approx(25.f));
|
||||
|
||||
STATIC_REQUIRE(dot(vec2i(1,2),vec2i(3,4)) == 11);
|
||||
STATIC_REQUIRE(cross(vec3i(1,0,0),vec3i(0,1,0)) == vec3i(0,0,1));
|
||||
REQUIRE(normalize(vec2f(0.5f,0.f)).x == Approx(1.f));
|
||||
|
||||
REQUIRE(faceforward(vec2f(1.f), vec2f(2.f), vec2f(3.f)).x == Approx(-1.f));
|
||||
REQUIRE(reflect(vec2f(1.f), vec2f(2.f)).x == Approx(-15.f));
|
||||
STATIC_REQUIRE(faceforward(vec2f(1.f), vec2f(2.f), vec2f(3.f)).x == approx(-1.f));
|
||||
STATIC_REQUIRE(reflect(vec2f(1.f), vec2f(2.f)).x == approx(-15.f));
|
||||
REQUIRE(refract(vec2f(1.f), vec2f(2.f), 1.f).x == Approx(-15.f));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user