ext.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /**
  2. * @description 扩展方法,提供 gl-matrix 为提供的方法
  3. * */
  4. import { mat3, vec2 } from 'gl-matrix';
  5. export function leftTranslate(out, a, v) {
  6. var transMat = [0, 0, 0, 0, 0, 0, 0, 0, 0];
  7. mat3.fromTranslation(transMat, v);
  8. return mat3.multiply(out, transMat, a);
  9. }
  10. export function leftRotate(out, a, rad) {
  11. var rotateMat = [0, 0, 0, 0, 0, 0, 0, 0, 0];
  12. mat3.fromRotation(rotateMat, rad);
  13. return mat3.multiply(out, rotateMat, a);
  14. }
  15. export function leftScale(out, a, v) {
  16. var scaleMat = [0, 0, 0, 0, 0, 0, 0, 0, 0];
  17. mat3.fromScaling(scaleMat, v);
  18. return mat3.multiply(out, scaleMat, a);
  19. }
  20. function leftMultiply(out, a, a1) {
  21. return mat3.multiply(out, a1, a);
  22. }
  23. /**
  24. * 根据 actions 来做 transform
  25. * @param m
  26. * @param actions
  27. */
  28. export function transform(m, actions) {
  29. var matrix = m ? [].concat(m) : [1, 0, 0, 0, 1, 0, 0, 0, 1];
  30. for (var i = 0, len = actions.length; i < len; i++) {
  31. var action = actions[i];
  32. switch (action[0]) {
  33. case 't':
  34. leftTranslate(matrix, matrix, [action[1], action[2]]);
  35. break;
  36. case 's':
  37. leftScale(matrix, matrix, [action[1], action[2]]);
  38. break;
  39. case 'r':
  40. leftRotate(matrix, matrix, action[1]);
  41. break;
  42. case 'm':
  43. leftMultiply(matrix, matrix, action[1]);
  44. break;
  45. default:
  46. break;
  47. }
  48. }
  49. return matrix;
  50. }
  51. /**
  52. * 向量 v1 到 向量 v2 夹角的方向
  53. * @param {Array} v1 向量
  54. * @param {Array} v2 向量
  55. * @return {Boolean} >= 0 顺时针 < 0 逆时针
  56. */
  57. export function direction(v1, v2) {
  58. return v1[0] * v2[1] - v2[0] * v1[1];
  59. }
  60. /**
  61. * 二维向量 v1 到 v2 的夹角
  62. * @param v1
  63. * @param v2
  64. * @param direct
  65. */
  66. export function angleTo(v1, v2, direct) {
  67. var ang = vec2.angle(v1, v2);
  68. var angleLargeThanPI = direction(v1, v2) >= 0;
  69. if (direct) {
  70. if (angleLargeThanPI) {
  71. return Math.PI * 2 - ang;
  72. }
  73. return ang;
  74. }
  75. if (angleLargeThanPI) {
  76. return ang;
  77. }
  78. return Math.PI * 2 - ang;
  79. }
  80. /**
  81. * 计算二维向量的垂直向量
  82. * @param out
  83. * @param v
  84. * @param flag
  85. */
  86. export function vertical(out, v, flag) {
  87. if (flag) {
  88. out[0] = v[1];
  89. out[1] = -1 * v[0];
  90. }
  91. else {
  92. out[0] = -1 * v[1];
  93. out[1] = v[0];
  94. }
  95. return out;
  96. }
  97. //# sourceMappingURL=ext.js.map