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