eufon/matrix.fnl

56 lines
1.4 KiB
Fennel

;; homogeneous matrix operations for 2d graphics
(local identity
[
1 0 0
0 1 0
0 0 1
])
(fn multiply-matrix [a b]
[
(+ (* (. a 1) (. b 1)) (* (. a 2) (. b 4)) (* (. a 3) (. b 7)))
(+ (* (. a 1) (. b 2)) (* (. a 2) (. b 5)) (* (. a 3) (. b 8)))
(+ (* (. a 1) (. b 3)) (* (. a 2) (. b 6)) (* (. a 3) (. b 9)))
(+ (* (. a 4) (. b 1)) (* (. a 5) (. b 4)) (* (. a 6) (. b 7)))
(+ (* (. a 4) (. b 2)) (* (. a 5) (. b 5)) (* (. a 6) (. b 8)))
(+ (* (. a 4) (. b 3)) (* (. a 5) (. b 6)) (* (. a 6) (. b 9)))
(+ (* (. a 7) (. b 1)) (* (. a 8) (. b 4)) (* (. a 9) (. b 7)))
(+ (* (. a 7) (. b 2)) (* (. a 8) (. b 5)) (* (. a 9) (. b 8)))
(+ (* (. a 7) (. b 3)) (* (. a 8) (. b 6)) (* (. a 9) (. b 9)))
])
(fn scale [matrix x y]
(let [scale [
x 0 0
0 y 0
0 0 1]]
(multiply-matrix matrix scale)))
(fn translate [matrix x y]
(let [translation [
1 0 x
0 1 y
0 0 1]]
(multiply-matrix matrix translation)))
(fn rotate [matrix rad]
(let [sin (math.sin rad)
cos (math.cos rad)
rotation [
cos (- sin) 0
sin cos 0
0 0 1
]]
(multiply-matrix matrix rotation)))
{
: identity
: scale
: translate
: rotate
}