a984e230fa6ad74570e8c5f4cd1c073d5db836acc4e08471bb042713f6b3ef3d21d26f8c0c8e4a066edc688d6177457803f933a14cd39e2ca5d9008c0a275d 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /**
  2. * 3x2矩阵操作类
  3. * @exports zrender/tool/matrix
  4. */
  5. /* global Float32Array */
  6. import {VectorArray} from './vector';
  7. export type MatrixArray = number[]
  8. /**
  9. * Create a identity matrix.
  10. */
  11. export function create(): MatrixArray {
  12. return [1, 0, 0, 1, 0, 0];
  13. }
  14. /**
  15. * 设置矩阵为单位矩阵
  16. */
  17. export function identity(out: MatrixArray): MatrixArray {
  18. out[0] = 1;
  19. out[1] = 0;
  20. out[2] = 0;
  21. out[3] = 1;
  22. out[4] = 0;
  23. out[5] = 0;
  24. return out;
  25. }
  26. /**
  27. * 复制矩阵
  28. */
  29. export function copy(out: MatrixArray, m: MatrixArray): MatrixArray {
  30. out[0] = m[0];
  31. out[1] = m[1];
  32. out[2] = m[2];
  33. out[3] = m[3];
  34. out[4] = m[4];
  35. out[5] = m[5];
  36. return out;
  37. }
  38. /**
  39. * 矩阵相乘
  40. */
  41. export function mul(out: MatrixArray, m1: MatrixArray, m2: MatrixArray): MatrixArray {
  42. // Consider matrix.mul(m, m2, m);
  43. // where out is the same as m2.
  44. // So use temp constiable to escape error.
  45. const out0 = m1[0] * m2[0] + m1[2] * m2[1];
  46. const out1 = m1[1] * m2[0] + m1[3] * m2[1];
  47. const out2 = m1[0] * m2[2] + m1[2] * m2[3];
  48. const out3 = m1[1] * m2[2] + m1[3] * m2[3];
  49. const out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4];
  50. const out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5];
  51. out[0] = out0;
  52. out[1] = out1;
  53. out[2] = out2;
  54. out[3] = out3;
  55. out[4] = out4;
  56. out[5] = out5;
  57. return out;
  58. }
  59. /**
  60. * 平移变换
  61. */
  62. export function translate(out: MatrixArray, a: MatrixArray, v: VectorArray): MatrixArray {
  63. out[0] = a[0];
  64. out[1] = a[1];
  65. out[2] = a[2];
  66. out[3] = a[3];
  67. out[4] = a[4] + v[0];
  68. out[5] = a[5] + v[1];
  69. return out;
  70. }
  71. /**
  72. * 旋转变换
  73. */
  74. export function rotate(out: MatrixArray, a: MatrixArray, rad: number): MatrixArray {
  75. const aa = a[0];
  76. const ac = a[2];
  77. const atx = a[4];
  78. const ab = a[1];
  79. const ad = a[3];
  80. const aty = a[5];
  81. const st = Math.sin(rad);
  82. const ct = Math.cos(rad);
  83. out[0] = aa * ct + ab * st;
  84. out[1] = -aa * st + ab * ct;
  85. out[2] = ac * ct + ad * st;
  86. out[3] = -ac * st + ct * ad;
  87. out[4] = ct * atx + st * aty;
  88. out[5] = ct * aty - st * atx;
  89. return out;
  90. }
  91. /**
  92. * 缩放变换
  93. */
  94. export function scale(out: MatrixArray, a: MatrixArray, v: VectorArray): MatrixArray {
  95. const vx = v[0];
  96. const vy = v[1];
  97. out[0] = a[0] * vx;
  98. out[1] = a[1] * vy;
  99. out[2] = a[2] * vx;
  100. out[3] = a[3] * vy;
  101. out[4] = a[4] * vx;
  102. out[5] = a[5] * vy;
  103. return out;
  104. }
  105. /**
  106. * 求逆矩阵
  107. */
  108. export function invert(out: MatrixArray, a: MatrixArray): MatrixArray | null {
  109. const aa = a[0];
  110. const ac = a[2];
  111. const atx = a[4];
  112. const ab = a[1];
  113. const ad = a[3];
  114. const aty = a[5];
  115. let det = aa * ad - ab * ac;
  116. if (!det) {
  117. return null;
  118. }
  119. det = 1.0 / det;
  120. out[0] = ad * det;
  121. out[1] = -ab * det;
  122. out[2] = -ac * det;
  123. out[3] = aa * det;
  124. out[4] = (ac * aty - ad * atx) * det;
  125. out[5] = (ab * atx - aa * aty) * det;
  126. return out;
  127. }
  128. /**
  129. * Clone a new matrix.
  130. */
  131. export function clone(a: MatrixArray): MatrixArray {
  132. const b = create();
  133. copy(b, a);
  134. return b;
  135. }