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