@@ -21,11 +21,28 @@ func IdentityMatrix() Matrix {
2121 return NewMatrix (1 , 0 , 0 , 1 , 0 , 0 )
2222}
2323
24- // TranslationMatrix returns a matrix that translates by `tx`, `ty`.
24+ // TranslationMatrix returns a matrix that translates by `tx`,`ty`.
2525func TranslationMatrix (tx , ty float64 ) Matrix {
2626 return NewMatrix (1 , 0 , 0 , 1 , tx , ty )
2727}
2828
29+ // ScaleMatrix returns a matrix that scales by `x`,`y`.
30+ func ScaleMatrix (x , y float64 ) Matrix {
31+ return NewMatrix (x , 0 , 0 , y , 0 , 0 )
32+ }
33+
34+ // RotationMatrix returns a matrix that rotates by angle `angle`, specified in radians.
35+ func RotationMatrix (angle float64 ) Matrix {
36+ c := math .Cos (angle )
37+ s := math .Sin (angle )
38+ return NewMatrix (c , s , - s , c , 0 , 0 )
39+ }
40+
41+ // ShearMatrix returns a matrix that shears `x`,`y`.
42+ func ShearMatrix (x , y float64 ) Matrix {
43+ return NewMatrix (1 , y , x , 1 , 0 , 0 )
44+ }
45+
2946// NewMatrix returns an affine transform matrix laid out in homogenous coordinates as
3047// a b 0
3148// c d 0
@@ -74,19 +91,37 @@ func (m Matrix) Mult(b Matrix) Matrix {
7491 return m
7592}
7693
77- // Translate appends a translation of `dx `,`dy ` to `m`.
94+ // Translate appends a translation of `x `,`y ` to `m`.
7895// m.Translate(dx, dy) is equivalent to m.Concat(NewMatrix(1, 0, 0, 1, dx, dy))
79- func (m * Matrix ) Translate (dx , dy float64 ) {
80- m [6 ] += dx
81- m [7 ] += dy
82- m .clampRange ()
96+ func (m * Matrix ) Translate (x , y float64 ) {
97+ m .Concat (TranslationMatrix (x , y ))
8398}
8499
85100// Translation returns the translation part of `m`.
86101func (m * Matrix ) Translation () (float64 , float64 ) {
87102 return m [6 ], m [7 ]
88103}
89104
105+ // Scale scales the current matrix by `x`,`y`.
106+ func (m * Matrix ) Scale (x , y float64 ) {
107+ m .Concat (ScaleMatrix (x , y ))
108+ }
109+
110+ // Rotate rotates the current matrix by angle `angle`, specified in radians.
111+ func (m * Matrix ) Rotate (angle float64 ) {
112+ m .Concat (RotationMatrix (angle ))
113+ }
114+
115+ // Shear shears the current matrix by `x',`y`.
116+ func (m * Matrix ) Shear (x , y float64 ) {
117+ m .Concat (ShearMatrix (x , y ))
118+ }
119+
120+ // Clone returns a copy of the current matrix.
121+ func (m * Matrix ) Clone () Matrix {
122+ return NewMatrix (m [0 ], m [1 ], m [3 ], m [4 ], m [6 ], m [7 ])
123+ }
124+
90125// Transform returns coordinates `x`,`y` transformed by `m`.
91126func (m * Matrix ) Transform (x , y float64 ) (float64 , float64 ) {
92127 xp := x * m [0 ] + y * m [1 ] + m [6 ]
0 commit comments