56 lines
1.4 KiB
Fennel
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
|
|
}
|