2022-12-07 18:51:22 +01:00
|
|
|
import math
|
|
|
|
import strformat
|
|
|
|
|
|
|
|
type
|
|
|
|
Vector* = object
|
|
|
|
x*: float
|
|
|
|
y*: float
|
2023-04-05 10:57:56 +02:00
|
|
|
z*: float
|
2022-12-07 18:51:22 +01:00
|
|
|
|
2023-04-05 10:57:56 +02:00
|
|
|
func vector*(x, y, z: float): Vector =
|
|
|
|
Vector(x: x, y: y, z: z)
|
|
|
|
|
|
|
|
func vector0*: Vector =
|
|
|
|
vector(0.0, 0.0, 0.0)
|
2022-12-07 18:51:22 +01:00
|
|
|
|
|
|
|
func `+`*(a, b: Vector): Vector =
|
2023-04-05 10:57:56 +02:00
|
|
|
Vector(x: a.x + b.x, y: a.y + b.y, z: a.z + b.z)
|
2022-12-07 18:51:22 +01:00
|
|
|
|
|
|
|
func `-`*(a: Vector): Vector =
|
2023-04-05 10:57:56 +02:00
|
|
|
Vector(x: -a.x, y: -a.y, z: -a.z)
|
2022-12-07 18:51:22 +01:00
|
|
|
|
|
|
|
func `-`*(a, b: Vector): Vector =
|
|
|
|
a + (-b)
|
|
|
|
|
|
|
|
func `*`*(a: Vector, f: float): Vector =
|
2023-04-05 10:57:56 +02:00
|
|
|
Vector(x: a.x * f, y: a.y * f, z: a.z * f)
|
2022-12-07 18:51:22 +01:00
|
|
|
|
|
|
|
func `*`*(f: float, a: Vector): Vector =
|
|
|
|
a * f
|
|
|
|
|
|
|
|
func dot*(a, b: Vector): float =
|
2023-04-05 10:57:56 +02:00
|
|
|
a.x * b.x + a.y * b.y + a.z * b.z
|
2022-12-07 18:51:22 +01:00
|
|
|
|
|
|
|
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 =
|
2023-04-05 10:57:56 +02:00
|
|
|
&"{a.x} {a.y} {a.z}"
|