1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
use na::{DefaultAllocator, RealField}; use crate::aliases::TVec; use crate::traits::{Alloc, Dimension}; /// The squared distance between two points. /// /// # See also: /// /// * [`distance`](fn.distance.html) pub fn distance2<N: RealField, D: Dimension>(p0: &TVec<N, D>, p1: &TVec<N, D>) -> N where DefaultAllocator: Alloc<N, D>, { (p1 - p0).norm_squared() } /// The l1-norm of `x - y`. /// /// # See also: /// /// * [`l1_norm`](fn.l1_norm.html) /// * [`l2_distance`](fn.l2_distance.html) /// * [`l2_norm`](fn.l2_norm.html) pub fn l1_distance<N: RealField, D: Dimension>(x: &TVec<N, D>, y: &TVec<N, D>) -> N where DefaultAllocator: Alloc<N, D>, { l1_norm(&(y - x)) } /// The l1-norm of `v`. /// /// This is also known as the "Manhattan distance" or "taxicab distance" and /// corresponds to the sum of the absolute values of the components of `v`. /// /// # See also: /// /// * [`l1_distance`](fn.l1_distance.html) /// * [`l2_distance`](fn.l2_distance.html) /// * [`l2_norm`](fn.l2_norm.html) pub fn l1_norm<N: RealField, D: Dimension>(v: &TVec<N, D>) -> N where DefaultAllocator: Alloc<N, D>, { crate::comp_add(&v.abs()) } /// The l2-norm of `x - y`. /// /// This is the same value as returned by [`length2`](fn.length2.html) and /// [`magnitude2`](fn.magnitude2.html). /// /// # See also: /// /// * [`l1_distance`](fn.l1_distance.html) /// * [`l1_norm`](fn.l1_norm.html) /// * [`l2_norm`](fn.l2_norm.html) /// * [`length`](fn.length.html) /// * [`length2`](fn.length2.html) /// * [`magnitude`](fn.magnitude.html) /// * [`magnitude2`](fn.magnitude2.html) pub fn l2_distance<N: RealField, D: Dimension>(x: &TVec<N, D>, y: &TVec<N, D>) -> N where DefaultAllocator: Alloc<N, D>, { l2_norm(&(y - x)) } /// The l2-norm of `v`. /// /// This is also known as the Euclidean norm. /// /// This is the same value as returned by [`length`](fn.length.html) and /// [`magnitude`](fn.magnitude.html). /// /// # See also: /// /// * [`l1_distance`](fn.l1_distance.html) /// * [`l1_norm`](fn.l1_norm.html) /// * [`l2_distance`](fn.l2_distance.html) /// * [`length`](fn.length.html) /// * [`length2`](fn.length2.html) /// * [`magnitude`](fn.magnitude.html) /// * [`magnitude2`](fn.magnitude2.html) pub fn l2_norm<N: RealField, D: Dimension>(x: &TVec<N, D>) -> N where DefaultAllocator: Alloc<N, D>, { x.norm() } /// The squared magnitude of `x`. /// /// A synonym for [`magnitude2`](fn.magnitude2.html). /// /// # See also: /// /// * [`distance`](fn.distance.html) /// * [`distance2`](fn.distance2.html) /// * [`length`](fn.length.html) /// * [`magnitude`](fn.magnitude.html) /// * [`magnitude2`](fn.magnitude2.html) pub fn length2<N: RealField, D: Dimension>(x: &TVec<N, D>) -> N where DefaultAllocator: Alloc<N, D>, { x.norm_squared() } /// The squared magnitude of `x`. /// /// A wrapper around [`nalgebra::norm_squared`](../nalgebra/fn.norm_squared.html). /// /// # See also: /// /// * [`distance`](fn.distance.html) /// * [`distance2`](fn.distance2.html) /// * [`length2`](fn.length2.html) /// * [`magnitude`](fn.magnitude.html) /// * [`nalgebra::norm_squared`](../nalgebra/fn.norm_squared.html) pub fn magnitude2<N: RealField, D: Dimension>(x: &TVec<N, D>) -> N where DefaultAllocator: Alloc<N, D>, { x.norm_squared() } //pub fn lxNorm<N: RealField, D: Dimension>(x: &TVec<N, D>, y: &TVec<N, D>, unsigned int Depth) -> N // where DefaultAllocator: Alloc<N, D> { // unimplemented!() //} // //pub fn lxNorm<N: RealField, D: Dimension>(x: &TVec<N, D>, unsigned int Depth) -> N // where DefaultAllocator: Alloc<N, D> { // unimplemented!() //}