-
-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathutils.js
69 lines (63 loc) · 2.17 KB
/
utils.js
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
import tinycolor from 'tinycolor2'
import { PanResponder } from 'react-native'
/**
* Converts color to hsv representation.
* @param {string} color any color represenation - name, hexa, rgb
* @return {object} { h: number, s: number, v: number } object literal
*/
export function toHsv(color) {
return tinycolor(color).toHsv()
}
/**
* Converts hsv object to hexa color string.
* @param {object} hsv { h: number, s: number, v: number } object literal
* @return {string} color in hexa representation
*/
export function fromHsv(hsv) {
return tinycolor(hsv).toHexString()
}
const fn = () => true
/**
* Simplified pan responder wrapper.
*/
export function createPanResponder({ onStart = fn, onMove = fn, onEnd = fn }) {
return PanResponder.create({
onStartShouldSetPanResponder: fn,
onStartShouldSetPanResponderCapture: fn,
onMoveShouldSetPanResponder: fn,
onMoveShouldSetPanResponderCapture: fn,
onPanResponderTerminationRequest: fn,
onPanResponderGrant: (evt, state) => {
return onStart({ x: evt.nativeEvent.pageX, y: evt.nativeEvent.pageY }, evt, state, 'start')
},
onPanResponderMove: (evt, state) => {
return onMove({ x: evt.nativeEvent.pageX, y: evt.nativeEvent.pageY }, evt, state, 'move')
},
onPanResponderRelease: (evt, state) => {
return onEnd({ x: evt.nativeEvent.pageX, y: evt.nativeEvent.pageY }, evt, state, 'end')
},
})
}
/**
* Rotates point around given center in 2d.
* Point is object literal { x: number, y: number }
* @param {point} point to be rotated
* @param {number} angle in radians
* @param {point} center to be rotated around
* @return {point} rotated point
*/
export function rotatePoint(point, angle, center = { x: 0, y: 0 }) {
// translation to origin
const transOriginX = point.x - center.x
const transOriginY = point.y - center.y
// rotation around origin
const rotatedX = transOriginX * Math.cos(angle) - transOriginY * Math.sin(angle)
const rotatedY = transOriginY * Math.cos(angle) + transOriginX * Math.sin(angle)
// translate back from origin
const normalizedX = rotatedX + center.x
const normalizedY = rotatedY + center.y
return {
x: normalizedX,
y: normalizedY,
}
}