@fi4f/hg 0.0.0 → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/matrix2.ts CHANGED
@@ -1,215 +1,215 @@
1
- import { Vector2 } from "./vector2.js";
2
- import { ADD, SUB, MUL, DIV, MOD } from "./math.js";
3
-
4
- export type Matrix2 = [
5
- number, number,
6
- number, number,
7
- ]
8
-
9
- export const XX = 0 as const;
10
- export const XY = 1 as const;
11
- export const YX = 2 as const;
12
- export const YY = 3 as const;
13
-
14
- export const __get__ = {
15
- xx(a: Matrix2) { return a[XX] },
16
- xy(a: Matrix2) { return a[XY] },
17
- yx(a: Matrix2) { return a[YX] },
18
- yy(a: Matrix2) { return a[YY] },
19
-
20
- r0(a: Matrix2) { return [ a[XX], a[XY] ] satisfies Vector2 },
21
- r1(a: Matrix2) { return [ a[YX], a[YY] ] satisfies Vector2 },
22
-
23
- c0(a: Matrix2) { return [ a[XX], a[YX] ] satisfies Vector2 },
24
- c1(a: Matrix2) { return [ a[XY], a[YY] ] satisfies Vector2 },
25
-
26
- row(a: Matrix2, i: 0 | 1) { switch (i) {
27
- case 0: return __get__.r0(a)
28
- case 1: return __get__.r1(a)
29
- }},
30
-
31
- col(a: Matrix2, j: 0 | 1) { switch (j) {
32
- case 0: return __get__.c0(a)
33
- case 1: return __get__.c1(a)
34
- }},
35
- }
36
-
37
- export const __set__ = {
38
- xx(a: Matrix2, xx: number) { return a[XX] = xx },
39
- xy(a: Matrix2, xy: number) { return a[XY] = xy },
40
- yx(a: Matrix2, yx: number) { return a[YX] = yx },
41
- yy(a: Matrix2, yy: number) { return a[YY] = yy },
42
-
43
- r0(a: Matrix2, r0: number | Vector2) {
44
- const [x, y] = Vector2.from(r0)
45
- __set__.xx(a, x)
46
- __set__.xy(a, y)
47
- return [x, y] satisfies Vector2
48
- },
49
-
50
- r1(a: Matrix2, r1: number | Vector2) {
51
- const [x, y] = Vector2.from(r1)
52
- __set__.yx(a, x)
53
- __set__.yy(a, y)
54
- return [x, y] satisfies Vector2
55
- },
56
-
57
- c0(a: Matrix2, c0: number | Vector2) {
58
- const [x, y] = Vector2.from(c0)
59
- __set__.xx(a, x)
60
- __set__.yx(a, y)
61
- return [x, y] satisfies Vector2
62
- },
63
-
64
- c1(a: Matrix2, c1: number | Vector2) {
65
- const [x, y] = Vector2.from(c1)
66
- __set__.xy(a, x)
67
- __set__.yy(a, y)
68
- return [x, y] satisfies Vector2
69
- },
70
-
71
- row(a: Matrix2, i: 0 | 1, ri: number | Vector2) {
72
- switch (i) {
73
- case 0: return __set__.r0(a, ri)
74
- case 1: return __set__.r1(a, ri)
75
- }
76
- },
77
-
78
- col(a: Matrix2, j: 0 | 1, cj: number | Vector2) {
79
- switch (j) {
80
- case 0: return __set__.c0(a, cj)
81
- case 1: return __set__.c1(a, cj)
82
- }
83
- },
84
- }
85
-
86
- export function xx(a: Matrix2, xx ?: number) {
87
- return xx === undefined ? __get__.xx(a) : __set__.xx(a, xx)
88
- }
89
-
90
- export function xy(a: Matrix2, xy ?: number) {
91
- return xy === undefined ? __get__.xy(a) : __set__.xy(a, xy)
92
- }
93
-
94
- export function yx(a: Matrix2, yx ?: number) {
95
- return yx === undefined ? __get__.yx(a) : __set__.yx(a, yx)
96
- }
97
-
98
- export function yy(a: Matrix2, yy ?: number) {
99
- return yy === undefined ? __get__.yy(a) : __set__.yy(a, yy)
100
- }
101
-
102
- export function r0(a: Matrix2, r0 ?: number | Vector2) {
103
- return r0 === undefined ? __get__.r0(a) : __set__.r0(a, r0)
104
- }
105
-
106
- export function r1(a: Matrix2, r1 ?: number | Vector2) {
107
- return r1 === undefined ? __get__.r1(a) : __set__.r1(a, r1)
108
- }
109
-
110
- export function c0(a: Matrix2, c0 ?: number | Vector2) {
111
- return c0 === undefined ? __get__.c0(a) : __set__.c0(a, c0)
112
- }
113
-
114
- export function c1(a: Matrix2, c1 ?: number | Vector2) {
115
- return c1 === undefined ? __get__.c1(a) : __set__.c1(a, c1)
116
- }
117
-
118
- export function row(a: Matrix2, i: 0 | 1, ri ?: number | Vector2) {
119
- return ri === undefined ? __get__.row(a, i) : __set__.row(a, i, ri)
120
- }
121
-
122
- export function col(a: Matrix2, j: 0 | 1, cj ?: number | Vector2) {
123
- return cj === undefined ? __get__.col(a, j) : __set__.col(a, j, cj)
124
- }
125
-
126
- export const Matrix2 = {
127
- XX, XY, YX, YY,
128
- __get__,
129
- __set__,
130
- xx, xy, yx, yy,
131
-
132
- id(a: number = 1) {
133
- return [
134
- a, 0,
135
- 0, a
136
- ] satisfies Matrix2
137
- },
138
-
139
- new(...a: Array<number>) {
140
- if (a.length === 1) return [
141
- a[XX]!, a[XX]!,
142
- a[XX]!, a[XX]!
143
- ] satisfies Matrix2
144
- else return [
145
- a[XX] ?? 0, a[XY] ?? 0,
146
- a[YX] ?? 0, a[YY] ?? 0
147
- ] satisfies Matrix2
148
- },
149
-
150
- from(a: number | Array<number>) {
151
- if (typeof a === "number") return [
152
- a, a,
153
- a, a
154
- ] satisfies Matrix2
155
- else return [
156
- a[XX] ?? 0, a[XY] ?? 0,
157
- a[YX] ?? 0, a[YY] ?? 0
158
- ] satisfies Matrix2
159
- },
160
-
161
- el(op: (a: number, b: number) => number, a: number | Matrix2, b: number | Matrix2, out: Matrix2 = Matrix2.new()) {
162
- const [ xxa, xya, yxa, yya ] = Matrix2.from(a)
163
- const [ xxb, xyb, yxb, yyb ] = Matrix2.from(b)
164
- __set__.xx(out, op(xxa, xxb))
165
- __set__.xy(out, op(xya, xyb))
166
- __set__.yx(out, op(yxa, yxb))
167
- __set__.yy(out, op(yya, yyb))
168
- return out
169
- },
170
-
171
- add(a: number | Matrix2, b: number | Matrix2, out: Matrix2 = Matrix2.new()) {
172
- return Matrix2.el(ADD, a, b, out)
173
- },
174
-
175
- sub(a: number | Matrix2, b: number | Matrix2, out: Matrix2 = Matrix2.new()) {
176
- return Matrix2.el(SUB, a, b, out)
177
- },
178
-
179
- hmul(a: number | Matrix2, b: number | Matrix2, out: Matrix2 = Matrix2.new()) {
180
- return Matrix2.el(MUL, a, b, out)
181
- },
182
-
183
- hdiv(a: number | Matrix2, b: number | Matrix2, out: Matrix2 = Matrix2.new()) {
184
- return Matrix2.el(DIV, a, b, out)
185
- },
186
-
187
- hmod(a: number | Matrix2, b: number | Matrix2, out: Matrix2 = Matrix2.new()) {
188
- return Matrix2.el(MOD, a, b, out)
189
- },
190
-
191
- mul(a: number | Matrix2, b: number | Matrix2, out: Matrix2 = Matrix2.new()) {
192
- const A = Matrix2.from(a)
193
- const B = Matrix2.from(b)
194
- const r0 = __get__.r0(A)
195
- const r1 = __get__.r1(A)
196
- const c0 = __get__.c0(B)
197
- const c1 = __get__.c1(B)
198
-
199
- __set__.xx(out, Vector2.dot(r0, c0))
200
- __set__.xy(out, Vector2.dot(r0, c1))
201
- __set__.yx(out, Vector2.dot(r1, c0))
202
- __set__.yy(out, Vector2.dot(r1, c1))
203
-
204
- return out
205
- },
206
-
207
-
208
- toString(a: number | Matrix2) {
209
- const [
210
- xx, xy,
211
- yx, yy
212
- ] = Matrix2.from(a)
213
- return `mat2<${xx}, ${xy}, ${yx}, ${yy}>`
214
- }
1
+ import { Vector2 } from "./vector2.js";
2
+ import { ADD, SUB, MUL, DIV, MOD } from "./math.js";
3
+
4
+ export type Matrix2 = [
5
+ number, number,
6
+ number, number,
7
+ ]
8
+
9
+ export const XX = 0 as const;
10
+ export const XY = 1 as const;
11
+ export const YX = 2 as const;
12
+ export const YY = 3 as const;
13
+
14
+ export const __get__ = {
15
+ xx(a: Matrix2) { return a[XX] },
16
+ xy(a: Matrix2) { return a[XY] },
17
+ yx(a: Matrix2) { return a[YX] },
18
+ yy(a: Matrix2) { return a[YY] },
19
+
20
+ r0(a: Matrix2) { return [ a[XX], a[XY] ] satisfies Vector2 },
21
+ r1(a: Matrix2) { return [ a[YX], a[YY] ] satisfies Vector2 },
22
+
23
+ c0(a: Matrix2) { return [ a[XX], a[YX] ] satisfies Vector2 },
24
+ c1(a: Matrix2) { return [ a[XY], a[YY] ] satisfies Vector2 },
25
+
26
+ row(a: Matrix2, i: 0 | 1) { switch (i) {
27
+ case 0: return __get__.r0(a)
28
+ case 1: return __get__.r1(a)
29
+ }},
30
+
31
+ col(a: Matrix2, j: 0 | 1) { switch (j) {
32
+ case 0: return __get__.c0(a)
33
+ case 1: return __get__.c1(a)
34
+ }},
35
+ }
36
+
37
+ export const __set__ = {
38
+ xx(a: Matrix2, xx: number) { return a[XX] = xx },
39
+ xy(a: Matrix2, xy: number) { return a[XY] = xy },
40
+ yx(a: Matrix2, yx: number) { return a[YX] = yx },
41
+ yy(a: Matrix2, yy: number) { return a[YY] = yy },
42
+
43
+ r0(a: Matrix2, r0: number | Vector2) {
44
+ const [x, y] = Vector2.from(r0)
45
+ __set__.xx(a, x)
46
+ __set__.xy(a, y)
47
+ return [x, y] satisfies Vector2
48
+ },
49
+
50
+ r1(a: Matrix2, r1: number | Vector2) {
51
+ const [x, y] = Vector2.from(r1)
52
+ __set__.yx(a, x)
53
+ __set__.yy(a, y)
54
+ return [x, y] satisfies Vector2
55
+ },
56
+
57
+ c0(a: Matrix2, c0: number | Vector2) {
58
+ const [x, y] = Vector2.from(c0)
59
+ __set__.xx(a, x)
60
+ __set__.yx(a, y)
61
+ return [x, y] satisfies Vector2
62
+ },
63
+
64
+ c1(a: Matrix2, c1: number | Vector2) {
65
+ const [x, y] = Vector2.from(c1)
66
+ __set__.xy(a, x)
67
+ __set__.yy(a, y)
68
+ return [x, y] satisfies Vector2
69
+ },
70
+
71
+ row(a: Matrix2, i: 0 | 1, ri: number | Vector2) {
72
+ switch (i) {
73
+ case 0: return __set__.r0(a, ri)
74
+ case 1: return __set__.r1(a, ri)
75
+ }
76
+ },
77
+
78
+ col(a: Matrix2, j: 0 | 1, cj: number | Vector2) {
79
+ switch (j) {
80
+ case 0: return __set__.c0(a, cj)
81
+ case 1: return __set__.c1(a, cj)
82
+ }
83
+ },
84
+ }
85
+
86
+ export function xx(a: Matrix2, xx ?: number) {
87
+ return xx === undefined ? __get__.xx(a) : __set__.xx(a, xx)
88
+ }
89
+
90
+ export function xy(a: Matrix2, xy ?: number) {
91
+ return xy === undefined ? __get__.xy(a) : __set__.xy(a, xy)
92
+ }
93
+
94
+ export function yx(a: Matrix2, yx ?: number) {
95
+ return yx === undefined ? __get__.yx(a) : __set__.yx(a, yx)
96
+ }
97
+
98
+ export function yy(a: Matrix2, yy ?: number) {
99
+ return yy === undefined ? __get__.yy(a) : __set__.yy(a, yy)
100
+ }
101
+
102
+ export function r0(a: Matrix2, r0 ?: number | Vector2) {
103
+ return r0 === undefined ? __get__.r0(a) : __set__.r0(a, r0)
104
+ }
105
+
106
+ export function r1(a: Matrix2, r1 ?: number | Vector2) {
107
+ return r1 === undefined ? __get__.r1(a) : __set__.r1(a, r1)
108
+ }
109
+
110
+ export function c0(a: Matrix2, c0 ?: number | Vector2) {
111
+ return c0 === undefined ? __get__.c0(a) : __set__.c0(a, c0)
112
+ }
113
+
114
+ export function c1(a: Matrix2, c1 ?: number | Vector2) {
115
+ return c1 === undefined ? __get__.c1(a) : __set__.c1(a, c1)
116
+ }
117
+
118
+ export function row(a: Matrix2, i: 0 | 1, ri ?: number | Vector2) {
119
+ return ri === undefined ? __get__.row(a, i) : __set__.row(a, i, ri)
120
+ }
121
+
122
+ export function col(a: Matrix2, j: 0 | 1, cj ?: number | Vector2) {
123
+ return cj === undefined ? __get__.col(a, j) : __set__.col(a, j, cj)
124
+ }
125
+
126
+ export const Matrix2 = {
127
+ XX, XY, YX, YY,
128
+ __get__,
129
+ __set__,
130
+ xx, xy, yx, yy,
131
+
132
+ id(a: number = 1) {
133
+ return [
134
+ a, 0,
135
+ 0, a
136
+ ] satisfies Matrix2
137
+ },
138
+
139
+ new(...a: Array<number>) {
140
+ if (a.length === 1) return [
141
+ a[XX]!, a[XX]!,
142
+ a[XX]!, a[XX]!
143
+ ] satisfies Matrix2
144
+ else return [
145
+ a[XX] ?? 0, a[XY] ?? 0,
146
+ a[YX] ?? 0, a[YY] ?? 0
147
+ ] satisfies Matrix2
148
+ },
149
+
150
+ from(a: number | Array<number>) {
151
+ if (typeof a === "number") return [
152
+ a, a,
153
+ a, a
154
+ ] satisfies Matrix2
155
+ else return [
156
+ a[XX] ?? 0, a[XY] ?? 0,
157
+ a[YX] ?? 0, a[YY] ?? 0
158
+ ] satisfies Matrix2
159
+ },
160
+
161
+ el(op: (a: number, b: number) => number, a: number | Matrix2, b: number | Matrix2, out: Matrix2 = Matrix2.new()) {
162
+ const [ xxa, xya, yxa, yya ] = Matrix2.from(a)
163
+ const [ xxb, xyb, yxb, yyb ] = Matrix2.from(b)
164
+ __set__.xx(out, op(xxa, xxb))
165
+ __set__.xy(out, op(xya, xyb))
166
+ __set__.yx(out, op(yxa, yxb))
167
+ __set__.yy(out, op(yya, yyb))
168
+ return out
169
+ },
170
+
171
+ add(a: number | Matrix2, b: number | Matrix2, out: Matrix2 = Matrix2.new()) {
172
+ return Matrix2.el(ADD, a, b, out)
173
+ },
174
+
175
+ sub(a: number | Matrix2, b: number | Matrix2, out: Matrix2 = Matrix2.new()) {
176
+ return Matrix2.el(SUB, a, b, out)
177
+ },
178
+
179
+ hmul(a: number | Matrix2, b: number | Matrix2, out: Matrix2 = Matrix2.new()) {
180
+ return Matrix2.el(MUL, a, b, out)
181
+ },
182
+
183
+ hdiv(a: number | Matrix2, b: number | Matrix2, out: Matrix2 = Matrix2.new()) {
184
+ return Matrix2.el(DIV, a, b, out)
185
+ },
186
+
187
+ hmod(a: number | Matrix2, b: number | Matrix2, out: Matrix2 = Matrix2.new()) {
188
+ return Matrix2.el(MOD, a, b, out)
189
+ },
190
+
191
+ mul(a: number | Matrix2, b: number | Matrix2, out: Matrix2 = Matrix2.new()) {
192
+ const A = Matrix2.from(a)
193
+ const B = Matrix2.from(b)
194
+ const r0 = __get__.r0(A)
195
+ const r1 = __get__.r1(A)
196
+ const c0 = __get__.c0(B)
197
+ const c1 = __get__.c1(B)
198
+
199
+ __set__.xx(out, Vector2.dot(r0, c0))
200
+ __set__.xy(out, Vector2.dot(r0, c1))
201
+ __set__.yx(out, Vector2.dot(r1, c0))
202
+ __set__.yy(out, Vector2.dot(r1, c1))
203
+
204
+ return out
205
+ },
206
+
207
+
208
+ toString(a: number | Matrix2) {
209
+ const [
210
+ xx, xy,
211
+ yx, yy
212
+ ] = Matrix2.from(a)
213
+ return `mat2<${xx}, ${xy}, ${yx}, ${yy}>`
214
+ }
215
215
  }