initial commit
This commit is contained in:
50
geo2d.nim
Normal file
50
geo2d.nim
Normal file
@@ -0,0 +1,50 @@
|
||||
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)
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user