utils.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. /**
  2. * User: CHT
  3. * Date: 2020/5/8
  4. * Time: 14:03
  5. */
  6. export function uuid(before = '', after = '') {
  7. const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
  8. const charsLen = chars.length
  9. let uuid = []
  10. const len = 16
  11. for (let i = 0; i < len; i++) {
  12. uuid[i] = chars[0 | Math.random() * charsLen]
  13. }
  14. return before + uuid.join('') + after
  15. }
  16. export function getOffset(evt, target = null) {
  17. const {
  18. clientX,
  19. clientY,
  20. currentTarget
  21. } = evt
  22. const current = target || currentTarget
  23. const {
  24. left,
  25. top
  26. } = current.getBoundingClientRect()
  27. return [clientX - left, clientY - top]
  28. }
  29. export function isIntersect({clientX, clientY}, target) {
  30. const {
  31. top,
  32. right,
  33. bottom,
  34. left
  35. } = target.getBoundingClientRect()
  36. return top < clientY
  37. && right > clientX
  38. && bottom > clientY
  39. && left < clientX
  40. }
  41. // 向量相加
  42. export function addVector(vectorA, vectorB) {
  43. return [vectorA[0] + vectorB[0], vectorA[1] + vectorB[1]]
  44. }
  45. // 向量乘以常量系数
  46. export function multiply(vector, k) {
  47. return [vector[0] * k, vector[1] * k]
  48. }
  49. export function differ(pointA, pointB) {
  50. return [pointB[0] - pointA[0], pointB[1] - pointA[1]]
  51. }
  52. export function minus(pointA, pointB) {
  53. return [(pointA[0] || 0) - (pointB[0] || 0), (pointA[1] || 0) - (pointB[1] || 0)]
  54. }
  55. // 向量点积
  56. export function dotProduct(vectorA, vectorB) {
  57. return vectorA[0] * vectorB[0] + vectorA[1] * vectorB[1]
  58. }
  59. // 向量叉乘
  60. export function cross(vectorA, vectorB) {
  61. return vectorA[0] * vectorB[1] - vectorA[1] * vectorB[0]
  62. }
  63. // 向量的单位向量
  64. export function unitVector(vector) {
  65. const m = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1])
  66. return [vector[0] / m, vector[1] / m]
  67. }
  68. // 判断向量 x,y 坐标相等
  69. export function equals(vector, target) {
  70. return vector[0] === target[0] && vector[1] === target[1]
  71. }
  72. // 向量夹角
  73. export function angle(vector) {
  74. return Math.round(180 / Math.PI * Math.atan2(vector[1], vector[0])) + 180
  75. }
  76. // 判断向量是否平行
  77. export function parallel(vectorA, vectorB) {
  78. return vectorA[0] * vectorB[1] - vectorA[1] * vectorB[0] === 0
  79. }
  80. // 判断 y 轴相等
  81. export function yAxisEqual(vectorA, vectorB) {
  82. return vectorA[1] === vectorB[1]
  83. }
  84. // 判断 x 轴相等
  85. export function xAxisEqual(vectorA, vectorB) {
  86. return vectorA[0] === vectorB[0]
  87. }
  88. //
  89. export function vector(result) {
  90. const handler = {
  91. add: addVector,
  92. multiply,
  93. differ,
  94. minus,
  95. dotProduct,
  96. cross,
  97. unitVector,
  98. equals,
  99. angle,
  100. parallel
  101. }
  102. const proxyHandler = {}
  103. Object.keys(handler).forEach(key => {
  104. Object.defineProperty(proxyHandler, key, {
  105. get() {
  106. return function (val) {
  107. result = handler[key](result, val)
  108. return proxyHandler
  109. }
  110. }
  111. })
  112. })
  113. Object.defineProperty(proxyHandler, 'end', {
  114. get() {
  115. return result
  116. }
  117. })
  118. return proxyHandler
  119. }
  120. export function toRawType(val) {
  121. return Object.prototype.toString.call(val).slice(8, -1).toLocaleLowerCase()
  122. }
  123. export function isFun(val) {
  124. return toRawType(val) === 'function'
  125. }
  126. export function isBool(val) {
  127. return toRawType(val) === 'boolean'
  128. }
  129. export function isUndef(val) {
  130. return toRawType(val) === 'undefined'
  131. }
  132. export function isString(val) {
  133. return toRawType(val) === 'string'
  134. }
  135. export function isObject(val) {
  136. return toRawType(val) === 'object'
  137. }
  138. export function arrayReplace(arr1, arr2) {
  139. arr1.splice(0, arr1.length, ...arr2)
  140. }
  141. export function debounce(fn, timestamp) {
  142. let timeout = null
  143. return function () {
  144. if (timeout)
  145. clearTimeout(timeout)
  146. timeout = setTimeout(fn, timestamp)
  147. }
  148. }