-
Notifications
You must be signed in to change notification settings - Fork 0
/
xy.js
114 lines (90 loc) · 2.27 KB
/
xy.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
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
export const XY = (function(){
function isNum(Z) {
return (typeof Z == 'number' && Number.isFinite(Z))
}
function isNums(a,b) {
return (isNum(a) && isNum(b) ? [a,b] : undefined)
}
function distTo(xy1, xy2) {
return (minus(xy1, xy2).sqr.sum)**0.5
}
function powr(xy1, xy2) {
return XY(xy1[0]**xy2[0], xy1[1]**xy2[1])
}
function divd(xy1, xy2) {
return XY(xy1[0]/ xy2[0], xy1[1]/ xy2[1])
}
function minus(xy1, xy2) {
return XY(xy1[0]- xy2[0], xy1[1]- xy2[1])
}
function min(xy1, xy2) {
return XY(Math.min(xy1[0], xy2[0]), Math.min(xy1[1], xy2[1]))
}
function max(xy1, xy2) {
return XY(Math.max(xy1[0], xy2[0]), Math.max(xy1[1], xy2[1]))
}
const xyProto = {
toString() {
return `${this.x}, ${this.y}`
},
toArr() {
return [...this]
},
get x() {
return this.xy[0]
},
get y() {
return this.xy[1]
},
get sum() {
return this.xy[0] + this.xy[1]
},
get sqr() {
return powr(this.xy, readXY(2) )
},
distTo(x,y) {
return distTo(this.xy, readXY(x,y))
},
powr(x,y) {
return powr(this.xy, readXY(x,y))
},
minus(x,y) {
return minus(this.xy, readXY(x,y))
},
divd(x,y) {
return divd(this.xy, readXY(x,y))
},
min(x,y) {
return min(this.xy, readXY(x,y))
},
max(x,y) {
return max(this.xy, readXY(x,y))
},
* [Symbol.iterator]() {
yield this.xy[0]
yield this.xy[1]
return
}
}
function readXY(a,b){
return (
isNums(a,b)
?? isNums(a,a)
?? isNums(a.x,a.y)
?? isNums(a.offsetWidth, a.offsetHeight)
?? isNums(a.width, a.height)
?? isNums(a[0],a[1])
?? ( [(a ?? NaN), (b ?? NaN)] )
)
}
return function(x,y) {
return Object.defineProperty(
Object.create(xyProto),
'xy',
{
enumerable: true,
value: Object.seal(readXY(x,y))
}
)
}
})()