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
use std::cmp::{Eq, Ordering};
use std::hash::{Hash, Hasher};
use std::ops::{Mul, Neg};
use prelude::*;
use distances_2d::*;
use utils::hash_f64;
#[derive (Debug, PartialEq, PartialOrd, Clone)]
pub struct Norm2D {
x: f64,
y: f64
}
impl Eq for Norm2D {}
impl Ord for Norm2D {
fn cmp(&self, other: &Self) -> Ordering {
let origin = Point2D::default();
sqr_dist_2d(&origin, self).partial_cmp(&sqr_dist_2d(&origin, other)).unwrap_or(Ordering::Equal)
}
}
impl Hash for Norm2D {
fn hash<H: Hasher>(&self, state: &mut H) {
hash_f64(self.x, state);
hash_f64(self.y, state);
}
}
impl Mul<f64> for Norm2D {
type Output = Point2D;
fn mul(self, other: f64) -> Point2D {
Point2D{x: other * self.x, y: other * self.y}
}
}
impl Neg for Norm2D {
type Output = Norm2D;
fn neg(self) -> Norm2D {
Norm2D { x: -self.x, y: -self.y }
}
}
impl IsND for Norm2D {
fn n_dimensions() -> usize {
2
}
fn get_position(&self, dimension: usize) -> Result<f64> {
match dimension {
0 => Ok(self.x),
1 => Ok(self.y),
_ => Err(ErrorKind::IncorrectDimension)
}
}
}
impl Is2D for Norm2D {
fn x(&self) -> f64 {
self.x
}
fn y(&self) -> f64 {
self.y
}
}
impl IsNormalized2D for Norm2D {
fn new<P>(p: P) -> Result<Self> where
P: Is2D {
let l = p.abs().get();
if l == 0.0 {
return Err(ErrorKind::NormalizeVecWithoutLength);
}
let f = 1.0 / l;
Ok(Norm2D { x: f * p.x() , y: f * p.y() })
}
fn norm_x() -> Self {
Norm2D {
x: 1.0,
y: 0.0
}
}
fn norm_y() -> Self {
Norm2D {
x: 0.0,
y: 1.0
}
}
}