Showing
3 changed files
with
152 additions
and
9 deletions
... | ... | @@ -23,13 +23,8 @@ use std::num::TryFromIntError; |
23 | 23 | use std::f64::consts::PI as FPI; |
24 | 24 | |
25 | 25 | use fractional::fractional::{Fractional, from_vector, Continuous}; |
26 | -use fractional::trigonometry::{sin, cos, PI}; | |
27 | - | |
28 | -struct Vector { | |
29 | - x: Fractional, | |
30 | - y: Fractional, | |
31 | - z: Fractional, | |
32 | -} | |
26 | +use fractional::trigonometry::{sin, cos, tan, PI}; | |
27 | +use fractional::vector::{Vector}; | |
33 | 28 | |
34 | 29 | fn mean(v: &Vec<i64>) -> Result<Fractional, TryFromIntError> { |
35 | 30 | let r = v.iter().fold(0, |acc, x| acc + x); |
... | ... | @@ -98,7 +93,8 @@ fn pi() { |
98 | 93 | } |
99 | 94 | |
100 | 95 | fn _sin() { |
101 | - for d in [9, 17, 31, 45, 73, 123, 213, 312, 876].iter() { | |
96 | + for d in [ 0, 45, 90, 135, 180, 225, 270, 315 | |
97 | + , 9, 17, 31, 73, 89, 123, 213, 312, 876 ].iter() { | |
102 | 98 | let s = sin(*d as i32); |
103 | 99 | let sr :f64 = s.try_into().unwrap(); |
104 | 100 | let _s = f64::sin(*d as f64 * FPI / 180.0); |
... | ... | @@ -107,8 +103,20 @@ fn _sin() { |
107 | 103 | } |
108 | 104 | } |
109 | 105 | |
106 | +fn _tan() { | |
107 | + for d in [ 0, 45, 90, 135, 180, 225, 270, 315 | |
108 | + , 9, 17, 31, 73, 89, 123, 213, 312, 876 ].iter() { | |
109 | + let s = tan(*d as i32); | |
110 | + let sr :f64 = s.try_into().unwrap(); | |
111 | + let _s = f64::tan(*d as f64 * FPI / 180.0); | |
112 | + | |
113 | + println!("{:>14} : {} {} / {}", format!("tan {}", d), s, sr, _s); | |
114 | + } | |
115 | +} | |
116 | + | |
110 | 117 | fn _cos() { |
111 | - for d in [9, 17, 31, 45, 73, 123, 213, 312, 876].iter() { | |
118 | + for d in [ 0, 45, 90, 135, 180, 225, 270, 315 | |
119 | + , 9, 17, 31, 73, 89, 123, 213, 312, 876 ].iter() { | |
112 | 120 | let s = cos(*d as i32); |
113 | 121 | let sr :f64 = s.try_into().unwrap(); |
114 | 122 | let _s = f64::cos(*d as f64 * FPI / 180.0); |
... | ... | @@ -117,6 +125,29 @@ fn _cos() { |
117 | 125 | } |
118 | 126 | } |
119 | 127 | |
128 | +fn _vector() { | |
129 | + let v1 = Vector(1.into(), 2.into(), 3.into()); | |
130 | + let v2 = Vector(2.into(), 2.into(), 3.into()); | |
131 | + let s :Fractional = 3.into(); | |
132 | + | |
133 | + println!("{:>14} : {:?}", "Vector v1", v1); | |
134 | + println!("{:>14} : {:?}", "Vector v2", v2); | |
135 | + println!("{:>14} : {}" , "abs v1", v1.abs()); | |
136 | + println!("{:>14} : {:?}", "-v1", -v1); | |
137 | + println!("{:>14} : {:?}", "v1 + v1", v1 + v1); | |
138 | + println!("{:>14} : {:?}", "v1 - v1", v1 - v1); | |
139 | + println!("{:>14} : {:?}", "v2 - v1", v2 - v1); | |
140 | + println!("{:>14} : {:?}", format!("v1 * {}", s), v1.mul(&s)); | |
141 | + println!("{:>14} : {:?}", "norm v1", v1.norm()); | |
142 | + println!("{:>14} : {}" , "abs norm v1", v1.norm().abs()); | |
143 | + println!("{:>14} : {}" , "distance v1 v2", v1.distance(v2)); | |
144 | + println!("{:>14} : {}" , "distance v2 v1", v2.distance(v1)); | |
145 | + println!("{:>14} : {}" , "v1 dot v2", v1.dot(v2)); | |
146 | + println!("{:>14} : {}" , "v2 dot v1", v2.dot(v1)); | |
147 | + println!("{:>14} : {:?}", "v1 * v2", v1 * v2); | |
148 | + println!("{:>14} : {:?}", "v2 * v1", v2 * v1); | |
149 | +} | |
150 | + | |
120 | 151 | fn main() { |
121 | 152 | common_fractional(); |
122 | 153 | println!(); |
... | ... | @@ -129,4 +160,8 @@ fn main() { |
129 | 160 | _sin(); |
130 | 161 | println!(); |
131 | 162 | _cos(); |
163 | + println!(); | |
164 | + _tan(); | |
165 | + println!(); | |
166 | + _vector(); | |
132 | 167 | } | ... | ... |
fractional/src/vector.rs
0 → 100644
1 | +// | |
2 | +// Stuff for manipulating 3 dimensional vectors. | |
3 | +// | |
4 | +// Georg Hopp <georg@steffers.org> | |
5 | +// | |
6 | +// Copyright © 2019 Georg Hopp | |
7 | +// | |
8 | +// This program is free software: you can redistribute it and/or modify | |
9 | +// it under the terms of the GNU General Public License as published by | |
10 | +// the Free Software Foundation, either version 3 of the License, or | |
11 | +// (at your option) any later version. | |
12 | +// | |
13 | +// This program is distributed in the hope that it will be useful, | |
14 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | +// GNU General Public License for more details. | |
17 | +// | |
18 | +// You should have received a copy of the GNU General Public License | |
19 | +// along with this program. If not, see <http://www.gnu.org/licenses/>. | |
20 | +// | |
21 | +use std::ops::{Add, Sub, Neg, Mul}; | |
22 | +use crate::{Fractional}; | |
23 | + | |
24 | +#[derive(Debug, Eq, Clone, Copy)] | |
25 | +pub struct Vector(pub Fractional, pub Fractional, pub Fractional); | |
26 | + | |
27 | +impl Vector { | |
28 | + pub fn x(self) -> Fractional { self.0 } | |
29 | + pub fn y(self) -> Fractional { self.1 } | |
30 | + pub fn z(self) -> Fractional { self.2 } | |
31 | + | |
32 | + pub fn abs(self) -> Fractional { | |
33 | + let Vector(x, y, z) = self; | |
34 | + (x * x + y * y + z * z).sqrt().unwrap() | |
35 | + } | |
36 | + | |
37 | + pub fn mul(self, s :&Fractional) -> Self { | |
38 | + let Vector(x, y, z) = self; | |
39 | + Vector(x * *s, y * *s, z * *s) | |
40 | + } | |
41 | + | |
42 | + pub fn dot(self, other :Self) -> Fractional { | |
43 | + let Vector(x1, y1, z1) = self; | |
44 | + let Vector(x2, y2, z2) = other; | |
45 | + | |
46 | + x1 * x2 + y1 * y2 + z1 * z2 | |
47 | + } | |
48 | + | |
49 | + pub fn norm(self) -> Self { | |
50 | + let Fractional(n, d) = self.abs(); | |
51 | + // TODO This can result in 0 or inf Vectors… | |
52 | + // Maybe we need to handle zero and inf abs here… | |
53 | + self.mul(&Fractional(d, n)) | |
54 | + } | |
55 | + | |
56 | + pub fn distance(self, other :Self) -> Fractional { | |
57 | + (self - other).abs() | |
58 | + } | |
59 | +} | |
60 | + | |
61 | +impl PartialEq for Vector { | |
62 | + fn eq(&self, other :&Self) -> bool { | |
63 | + let Vector(x1, y1, z1) = self; | |
64 | + let Vector(x2, y2, z2) = other; | |
65 | + x1 == x2 && y1 == y2 && z1 == z2 | |
66 | + } | |
67 | +} | |
68 | + | |
69 | +impl Add for Vector { | |
70 | + type Output = Self; | |
71 | + | |
72 | + fn add(self, other :Self) -> Self { | |
73 | + let Vector(x1, y1, z1) = self; | |
74 | + let Vector(x2, y2, z2) = other; | |
75 | + Vector(x1 + x2, y1 + y2, z1 + z2) | |
76 | + } | |
77 | +} | |
78 | + | |
79 | +impl Sub for Vector { | |
80 | + type Output = Self; | |
81 | + | |
82 | + fn sub(self, other :Self) -> Self { | |
83 | + self + -other | |
84 | + } | |
85 | +} | |
86 | + | |
87 | +impl Neg for Vector { | |
88 | + type Output = Self; | |
89 | + | |
90 | + fn neg(self) -> Self { | |
91 | + let Vector(x, y, z) = self; | |
92 | + Self(-x, -y, -z) | |
93 | + } | |
94 | +} | |
95 | + | |
96 | +impl Mul for Vector { | |
97 | + type Output = Self; | |
98 | + | |
99 | + fn mul(self, other :Self) -> Self { | |
100 | + let Vector(ax, ay, az) = self; | |
101 | + let Vector(bx, by, bz) = other; | |
102 | + | |
103 | + Vector( ay * bz - az * by | |
104 | + , az * bx - ax * bz | |
105 | + , ax * by - ay * bx ) | |
106 | + } | |
107 | +} | ... | ... |
Please
register
or
login
to post a comment