import math import strformat type Vector* = object x*: float y*: float z*: float func vector*(x, y, z: float): Vector = Vector(x: x, y: y, z: z) func vector0*: Vector = vector(0.0, 0.0, 0.0) func `+`*(a, b: Vector): Vector = Vector(x: a.x + b.x, y: a.y + b.y, z: a.z + b.z) func `-`*(a: Vector): Vector = Vector(x: -a.x, y: -a.y, z: -a.z) func `-`*(a, b: Vector): Vector = a + (-b) func `*`*(a: Vector, f: float): Vector = Vector(x: a.x * f, y: a.y * f, z: a.z * f) func `*`*(f: float, a: Vector): Vector = a * f func dot*(a, b: Vector): float = a.x * b.x + a.y * b.y + a.z * b.z func len*(a: Vector): float = sqrt(dot(a, a)) func `/`*(a: Vector, f: float): Vector = a * (1/f) func normalize*(a: Vector): Vector = a / a.len func `+=`*(a: var Vector, b: Vector) = a = a + b func `-=`*(a: var Vector, b: Vector) = a = a - b func `$`*(a: Vector): string = &"{a.x} {a.y} {a.z}"