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
use std::cmp::{Eq, Ordering};
use std::hash::{Hash, Hasher};
use std::ops::{Mul};
use prelude::*;
use distances_2d::*;
#[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) {
(self.x as u64).hash(state);
(self.y as u64).hash(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 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();
if l.get() <= 0.0 {
return Err(ErrorKind::NormalizeVecWithoutLength);
}
Ok(Norm2D { x: p.x() / l.get(), y: p.y() / l.get() })
}
fn norm_x() -> Self {
Norm2D {
x: 1.0,
y: 0.0
}
}
fn norm_y() -> Self {
Norm2D {
x: 0.0,
y: 1.0
}
}
}