39 lines
922 B
Nim
39 lines
922 B
Nim
import strformat
|
|
|
|
type Vec2[T: SomeNumber] = tuple[x, y: T]
|
|
|
|
proc initVec2[T](x, y: T): Vec2[T] = (x, y)
|
|
|
|
func`+`[T](a, b: Vec2[T]): Vec2[T] = (a.x + b.x, a.y + b.y)
|
|
|
|
func `-`[T](a, b: Vec2[T]): Vec2[T] = (a.x - b.x, a.y - b.y)
|
|
|
|
func `*`[T](a: Vec2[T]; m: T): Vec2[T] = (a.x * m, a.y * m)
|
|
|
|
func `/`[T](a: Vec2[T]; d: T): Vec2[T] =
|
|
if d == 0:
|
|
raise newException(DivByZeroDefect, "division of vector by 0")
|
|
when T is SomeInteger:
|
|
(a.x div d, a.y div d)
|
|
else:
|
|
(a.x / d, a.y / d)
|
|
|
|
func `$`[T](a: Vec2[T]): string =
|
|
&"({a.x}, {a.y})"
|
|
|
|
# Three ways to initialize a vector.
|
|
let v1 = initVec2(2, 3)
|
|
let v2: Vec2[int] = (-1, 2)
|
|
let v3 = (x: 4, y: -2)
|
|
|
|
echo &"{v1} + {v2} = {v1 + v2}"
|
|
echo &"{v3} - {v2} = {v3 - v2}"
|
|
|
|
# Float vectors.
|
|
let v4 = initVec2(2.0, 3.0)
|
|
let v5 = (x: 3.0, y: 2.0)
|
|
|
|
echo &"{v4} * 2 = {v4 * 2}"
|
|
echo &"{v3} / 2 = {v3 / 2}" # Int division.
|
|
echo &"{v5} / 2 = {v5 / 2}" # Float division.
|