Files
sdlife/geo2d.nim
Walter Oggioni d853f9f14c initial commit
2019-01-03 17:39:40 +01:00

51 lines
1.5 KiB
Nim

import mmath/smatrix
import mmath/svector
from nwo/utils import `...`
from math import sin, cos
type
X2d* = SquareSMatrix[3, float32]
P2d* = SVector[3, float32]
Rect2d* = object
tl*, br* : P2d
proc newP2d*(x, y : float32) : P2d =
P2d(buildSVector[3, float32](x,y,1f32))
proc x*(p : P2d) : float32 = p[0]
proc y*(p : P2d) : float32 = p[1]
proc newRect2d*(x, y, width, height : float32) : Rect2d = Rect2d(tl: newP2d(x,y), br: newP2d(x + width, y + height))
proc top*(rect : Rect2d) : float32 = rect.tl.y
proc bottom*(rect : Rect2d) : float32 = rect.br.y
proc left*(rect : Rect2d) : float32 = rect.tl.x
proc right*(rect : Rect2d) : float32 = rect.br.x
proc width*(rect : Rect2d) : float32 = rect.br.x - rect.tl.x
proc height*(rect : Rect2d) : float32 = rect.br.y - rect.tl.y
proc `*`*(rect : Rect2d, xform : X2d) : Rect2d = Rect2d(tl: rect.tl * xform, br: rect.br * xform)
proc rot*(alpha: float32) : X2d =
result = identity[3,float32]()
let ca = cos(alpha)
let sa = sin(alpha)
result[0,0] = ca
result[1,1] = ca
result[0,1] = sa
result[1,0] = -sa
proc scale*(x, y: float32) : X2d =
result = identity[3,float32]()
result[0,0] = x
result[1,1] = y
proc xlate*(x, y: float32) : X2d =
result = identity[3,float32]()
result[2,0] = x
result[2,1] = y
proc scale*(center : P2d, x, y : float32) : X2d = xlate(-center.x, -center.y) * scale(x,y) * xlate(center.x, center.y)
proc rot*(center : P2d, angle : float32) : X2d = xlate(-center.x, -center.y) * rot(angle) * xlate(center.x, center.y)