Function image_go_nord::utils::delta[][src]

pub fn delta(a: &[u8], b: &[u8]) -> i32
Expand description

Euclidian distance squared between colors

Uses the 3-dimensional euclidian distance formula to get the distance between two colors. This function returns an i32 because the intermediate calculations would overflow u8. It is guaranteed to not overflow for slices with a length at most 33,025, but if you reach this limit, I guarantee you’re doing something wrong.


let a = [173, 87, 119, 255]; // a pinkish color
let b = [0, 255, 255]; // cyan, my favorite color

// `a` is rbga, but it doesn't matter. `delta` will only take components up to the length of
//the smallest slice
assert_eq!(delta(&a, &b), 76649);

delta takes two slices and zips them to calculate their component-wise distance. This is safe because it will only take elements up to the last of the shortest slice, which usually comes from a palette color (which is an array).

This function can be proven not to overflow with some simple set theory. If $d$ is the function delta, $B \subset \Z^+$ is the set of unsigned 8-bit integers (u8), and $I \subset \Z$ is the set of signed 32-bit integers, and we know $B \subset I$, then we can prove, for two arbitrary 8-bit subpixel colors $x = (r_1, g_1, b_1)$ and $y = (r_2, g_2, b_2)$ (where $r \in B \and g \in B \and b \in B$), that $\forall x \forall y, d(x, y) \in I$.

$d$ can be defined as follows (where $n = min(|x|, |y|)$).

$$ d(x, y) = \sum_{i=1}^n (x_i - y_i)^2 $$

Since $d : B \rightarrow I$ and $min(A) < min(B) < max(B) < max(A)$, we just need to prove the range of $d$ does not exceed the minimum or maximum of its codomain.