github.com/xxf098/lite-proxy@v0.15.1-0.20230422081941-12c69f323218/web/render/matrix.go (about) 1 package render 2 3 import "math" 4 5 type Matrix struct { 6 XX, YX, XY, YY, X0, Y0 float64 7 } 8 9 func Identity() Matrix { 10 return Matrix{ 11 1, 0, 12 0, 1, 13 0, 0, 14 } 15 } 16 17 func Translate(x, y float64) Matrix { 18 return Matrix{ 19 1, 0, 20 0, 1, 21 x, y, 22 } 23 } 24 25 func Scale(x, y float64) Matrix { 26 return Matrix{ 27 x, 0, 28 0, y, 29 0, 0, 30 } 31 } 32 33 func Rotate(angle float64) Matrix { 34 c := math.Cos(angle) 35 s := math.Sin(angle) 36 return Matrix{ 37 c, s, 38 -s, c, 39 0, 0, 40 } 41 } 42 43 func Shear(x, y float64) Matrix { 44 return Matrix{ 45 1, y, 46 x, 1, 47 0, 0, 48 } 49 } 50 51 func (a Matrix) Multiply(b Matrix) Matrix { 52 return Matrix{ 53 a.XX*b.XX + a.YX*b.XY, 54 a.XX*b.YX + a.YX*b.YY, 55 a.XY*b.XX + a.YY*b.XY, 56 a.XY*b.YX + a.YY*b.YY, 57 a.X0*b.XX + a.Y0*b.XY + b.X0, 58 a.X0*b.YX + a.Y0*b.YY + b.Y0, 59 } 60 } 61 62 func (a Matrix) TransformVector(x, y float64) (tx, ty float64) { 63 tx = a.XX*x + a.XY*y 64 ty = a.YX*x + a.YY*y 65 return 66 } 67 68 func (a Matrix) TransformPoint(x, y float64) (tx, ty float64) { 69 tx = a.XX*x + a.XY*y + a.X0 70 ty = a.YX*x + a.YY*y + a.Y0 71 return 72 } 73 74 func (a Matrix) Translate(x, y float64) Matrix { 75 return Translate(x, y).Multiply(a) 76 } 77 78 func (a Matrix) Scale(x, y float64) Matrix { 79 return Scale(x, y).Multiply(a) 80 } 81 82 func (a Matrix) Rotate(angle float64) Matrix { 83 return Rotate(angle).Multiply(a) 84 } 85 86 func (a Matrix) Shear(x, y float64) Matrix { 87 return Shear(x, y).Multiply(a) 88 }