1pub fn sub_<T>(a: &[T; 2], b: &[T; 2]) -> [T; 2]
4where
5 T: std::ops::Sub<Output = T> + Copy,
6{
7 [a[0] - b[0], a[1] - b[1]]
8}
9
10pub fn from_homogeneous<Real>(v: &[Real; 3]) -> Option<[Real; 2]>
11where
12 Real: num_traits::Float,
13{
14 if v[2].is_zero() {
15 return None;
16 }
17 Some([v[0] / v[2], v[0] / v[2]])
18}
19
20pub fn rotate90<T>(v: &nalgebra::Vector2<T>) -> nalgebra::Vector2<T>
22where
23 T: nalgebra::RealField + Copy,
24{
25 nalgebra::Vector2::<T>::new(-v[1], v[0])
26}
27
28pub fn norm_squared<T>(v: &nalgebra::Vector2<T>) -> T
29where
30 T: std::ops::Mul<Output = T> + std::ops::Add<Output = T> + Copy,
31{
32 v[0] * v[0] + v[1] * v[1]
33}
34
35pub fn basis<T>(i_dim: usize, eps: T) -> nalgebra::Vector2<T>
36where
37 T: nalgebra::RealField,
38{
39 let mut b = nalgebra::Vector2::<T>::zeros();
40 b[i_dim] = eps;
41 b
42}