56 lines
1.6 KiB
Nim
56 lines
1.6 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 xlate*(p: P2d) : X2d =
|
|
result = identity[3,float32]()
|
|
result[2,0] = p.x
|
|
result[2,1] = p.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)
|
|
|
|
|
|
|