-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutils.js
More file actions
122 lines (103 loc) · 3.09 KB
/
utils.js
File metadata and controls
122 lines (103 loc) · 3.09 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
var utils = {
norm: function (value, min, max) {
return (value - min) / (max - min);
},
//linear interpolation
//min 1 , max 10
//norm 0.1 = 1
//norm 0.5 = 5
lerp: function (norm, min, max) {
return (max - min) * norm + min;
},
map: function (value, sourceMin, sourceMax, destMin, destMax) {
return utils.lerp(
utils.norm(value, sourceMin, sourceMax),
destMin,
destMax
);
},
clamp: function (value, min, max) {
return Math.min(Math.max(value, Math.min(min, max)), Math.max(min, max));
},
distance: function (p0, p1) {
var dx = p1.x - p0.x,
dy = p1.y - p0.y;
return Math.sqrt(dx * dx + dy * dy);
},
distanceXY: function (x0, y0, x1, y1) {
var dx = x1 - x0,
dy = y1 - y0;
return Math.sqrt(dx * dx + dy * dy);
},
circleCollision: function (c0, c1) {
return utils.distance(c0, c1) <= c0.radius + c1.radius;
},
circlePointCollision: function (x, y, circle) {
return utils.distanceXY(x, y, circle.x, circle.y) < circle.radius;
},
pointInRect: function (x, y, rect) {
return (
utils.inRange(x, rect.x, rect.x + rect.width) &&
utils.inRange(y, rect.y, rect.y + rect.height)
);
},
inRange: function (value, min, max) {
return value >= Math.min(min, max) && value <= Math.max(min, max);
},
rangeIntersect: function (min0, max0, min1, max1) {
return (
Math.max(min0, max0) >= Math.min(min1, max1) &&
Math.min(min0, max0) <= Math.max(min1, max1)
);
},
rectIntersect: function (r0, r1) {
return (
utils.rangeIntersect(r0.x, r0.x + r0.width, r1.x, r1.x + r1.width) &&
utils.rangeIntersect(r0.y, r0.y + r0.height, r1.y, r1.y + r1.height)
);
},
degreesToRads: function (degrees) {
return (degrees / 180) * Math.PI;
},
radsToDegrees: function (radians) {
return (radians * 180) / Math.PI;
},
randomRange: function (min, max) {
return min + Math.random() * (max - min);
},
randomInt: function (min, max) {
return Math.floor(min + Math.random() * (max - min + 1));
},
roundToPlaces: function (value, places) {
var mult = Math.pow(10, places);
return Math.round(value * mult) / mult;
},
roundNearest: function (value, nearest) {
return Math.round(value / nearest) * nearest;
},
//three control points
//pfinal is an optional parameter a small optimization to avoid initializing an object every time
quadraticBezier: function (p0, p1, p2, t, pFinal) {
pFinal = pFinal || {};
pFinal.x =
Math.pow(1 - t, 2) * p0.x + (1 - t) * 2 * t * p1.x + t * t * p2.x;
pFinal.y =
Math.pow(1 - t, 2) * p0.y + (1 - t) * 2 * t * p1.y + t * t * p2.y;
return pFinal;
},
//four control points
cubicBezier: function (p0, p1, p2, p3, t, pFinal) {
pFinal = pFinal || {};
pFinal.x =
Math.pow(1 - t, 3) * p0.x +
Math.pow(1 - t, 2) * 3 * t * p1.x +
(1 - t) * 3 * t * t * p2.x +
t * t * t * p3.x;
pFinal.y =
Math.pow(1 - t, 3) * p0.y +
Math.pow(1 - t, 2) * 3 * t * p1.y +
(1 - t) * 3 * t * t * p2.y +
t * t * t * p3.y;
return pFinal;
},
};