| 1 | module sim |
| 2 | |
| 3 | import math |
| 4 | |
| 5 | // Vector3D is a 3D vector |
| 6 | pub struct Vector3D { |
| 7 | pub: |
| 8 | x f64 |
| 9 | y f64 |
| 10 | z f64 |
| 11 | } |
| 12 | |
| 13 | // vector creates a Vector3D passing x,y,z as parameters |
| 14 | pub fn vector(data Vector3D) Vector3D { |
| 15 | return Vector3D{ |
| 16 | ...data |
| 17 | } |
| 18 | } |
| 19 | |
| 20 | // addition |
| 21 | pub fn (v Vector3D) + (v2 Vector3D) Vector3D { |
| 22 | return Vector3D{ |
| 23 | x: v.x + v2.x |
| 24 | y: v.y + v2.y |
| 25 | z: v.z + v2.z |
| 26 | } |
| 27 | } |
| 28 | |
| 29 | // dot product |
| 30 | pub fn (v Vector3D) * (v2 Vector3D) f64 { |
| 31 | return (v.x * v2.x) + (v.y * v2.y) + (v.z * v2.z) |
| 32 | } |
| 33 | |
| 34 | // scale gets a scaled vector |
| 35 | pub fn (v Vector3D) scale(scalar f64) Vector3D { |
| 36 | return Vector3D{ |
| 37 | x: v.x * scalar |
| 38 | y: v.y * scalar |
| 39 | z: v.z * scalar |
| 40 | } |
| 41 | } |
| 42 | |
| 43 | // norm_squared returns the square of the norm of the vector |
| 44 | pub fn (v Vector3D) norm_squared() f64 { |
| 45 | return v * v |
| 46 | } |
| 47 | |
| 48 | // norm returns the norm of the vector |
| 49 | pub fn (v Vector3D) norm() f64 { |
| 50 | return math.sqrt(v.norm_squared()) |
| 51 | } |
| 52 | |