fuckingtech/public/assets/glsl/lygia/math/dist.glsl
Elias Rhouzlane bf76c6b086 fix: code
2025-04-06 17:23:52 +02:00

44 lines
No EOL
2.3 KiB
GLSL

/*
contributors: Shadi El Hajj
description: Commonly used distance functions.
options:
- DIST_FNC: change the distance function, currently implemented are distEuclidean, distManhattan, distChebychev and distMinkowski
- DIST_MINKOWSKI_P: the power of the Minkowski distance function (1.0 Manhattan, 2.0 Euclidean, Infinity Chebychev)
license: MIT License (MIT) Copyright (c) 2024 Shadi EL Hajj
*/
#ifndef DIST_FNC
#define DIST_FNC distEuclidean
#endif
#ifndef DIST_MINKOWSKI_P
#define DIST_MINKOWSKI_P 2.0 // 1: Manhattan, 2: Euclidean, Infinity: Chebychev
#endif
#ifndef FNC_DIST
#define FNC_DIST
float distEuclidean(vec2 a, vec2 b) { return distance(a, b); }
float distEuclidean(vec3 a, vec3 b) { return distance(a, b); }
float distEuclidean(vec4 a, vec4 b) { return distance(a, b); }
// https://en.wikipedia.org/wiki/Taxicab_geometry
float distManhattan(vec2 a, vec2 b) { return abs(a.x - b.x) + abs(a.y - b.y); }
float distManhattan(vec3 a, vec3 b) { return abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z); }
float distManhattan(vec4 a, vec4 b) { return abs(a.x - b.x) + abs(a.y - b.y) + abs(a.z - b.z) + abs(a.w - b.w); }
// https://en.wikipedia.org/wiki/Chebyshev_distance
float distChebychev(vec2 a, vec2 b) { return max(abs(a.x - b.x), abs(a.y - b.y)); }
float distChebychev(vec3 a, vec3 b) { return max(abs(a.x - b.x), max(abs(a.y - b.y), abs(a.z - b.z))); }
float distChebychev(vec4 a, vec4 b) { return max(abs(a.x - b.x), max(abs(a.y - b.y), max(abs(a.z - b.z), abs(a.w - b.w) ))); }
// https://en.wikipedia.org/wiki/Minkowski_distance
float distMinkowski(vec2 a, vec2 b) { return pow(pow(abs(a.x - b.x), DIST_MINKOWSKI_P) + pow(abs(a.y - b.y), DIST_MINKOWSKI_P), 1.0 / DIST_MINKOWSKI_P); }
float distMinkowski(vec3 a, vec3 b) { return pow(pow(abs(a.x - b.x), DIST_MINKOWSKI_P) + pow(abs(a.y - b.y), DIST_MINKOWSKI_P) + pow(abs(a.z - b.z), DIST_MINKOWSKI_P), 1.0 / DIST_MINKOWSKI_P); }
float distMinkowski(vec4 a, vec4 b) { return pow(pow(abs(a.x - b.x), DIST_MINKOWSKI_P) + pow(abs(a.y - b.y), DIST_MINKOWSKI_P) + pow(abs(a.z - b.z), DIST_MINKOWSKI_P) + pow(abs(a.w - b.w), DIST_MINKOWSKI_P), 1.0 / DIST_MINKOWSKI_P); }
float dist(vec2 a, vec2 b) { return DIST_FNC(a, b); }
float dist(vec3 a, vec3 b) { return DIST_FNC(a, b); }
float dist(vec4 a, vec4 b) { return DIST_FNC(a, b); }
#endif