@zushah/chalkboard 1.5.0 → 1.7.0
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/CHANGELOG.md +71 -15
- package/LICENSE.md +1 -1
- package/README.md +41 -30
- package/docs/README.md +1 -1
- package/examples/README.md +1 -1
- package/examples/fluid.js +1 -1
- package/examples/hyperbolics.js +4 -4
- package/examples/mandelbrot.js +1 -1
- package/examples/matr-donut.js +3 -5
- package/examples/newton.js +4 -4
- package/examples/quat-donut.js +2 -2
- package/package.json +5 -2
- package/src/Chalkboard.js +1563 -533
- package/src/ChalkboardProcessing.js +1433 -410
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/*
|
|
2
2
|
The Chalkboard Library
|
|
3
|
-
Version 1.
|
|
3
|
+
Version 1.7.0 Descartes released 01/01/2024
|
|
4
4
|
Authored by Zushah ===> https://www.github.com/Zushah
|
|
5
5
|
Available under the MIT License ===> https://www.opensource.org/license/mit/
|
|
6
6
|
|
|
7
7
|
The Chalkboard library is a JavaScript namespace that provides a plethora of both practical and abstract mathematical functionalities for its user.
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
Repository ===> https://www.github.com/Zushah/Chalkboard
|
|
10
|
+
Website ===> https://zushah.github.io/Chalkboard/home.html
|
|
11
11
|
*/
|
|
12
12
|
var Chalkboard = {
|
|
13
13
|
README: function() {
|
|
14
|
-
console.log("The Chalkboard Library\nVersion 1.
|
|
14
|
+
console.log("The Chalkboard Library\nVersion 1.7.0 Descartes released 01/01/2024\nAuthored by Zushah ===> https://www.github.com/Zushah\nAvailable under the MIT License ===> https://www.opensource.org/license/mit/\n\nThe Chalkboard library is a JavaScript namespace that provides a plethora of both practical and abstract mathematical functionalities for its user.\n\nRepository ===> https://www.github.com/Zushah/Chalkboard\nWebsite ===> https://zushah.github.io/Chalkboard/home.html");
|
|
15
15
|
},
|
|
16
16
|
LOGO: function(x, y, s) {
|
|
17
17
|
x = x || width / 2;
|
|
@@ -45,11 +45,49 @@ var Chalkboard = {
|
|
|
45
45
|
exponent = exponent || 1;
|
|
46
46
|
return Math.pow(Math.pow(10, 1 / Math.log(10)), exponent);
|
|
47
47
|
},
|
|
48
|
+
CONTEXT: "ctx",
|
|
49
|
+
PARSEPREFIX: "",
|
|
48
50
|
numb: {
|
|
49
51
|
random: function(inf, sup) {
|
|
50
|
-
inf
|
|
51
|
-
|
|
52
|
-
|
|
52
|
+
if(inf === undefined) {
|
|
53
|
+
inf = 0;
|
|
54
|
+
}
|
|
55
|
+
if(sup === undefined) {
|
|
56
|
+
sup = 1;
|
|
57
|
+
}
|
|
58
|
+
return inf + (sup - inf) * Math.random();
|
|
59
|
+
},
|
|
60
|
+
exponential: function(l) {
|
|
61
|
+
if(l === undefined) {
|
|
62
|
+
l = 1;
|
|
63
|
+
}
|
|
64
|
+
return l <= 0 ? 0 : -Math.log(Math.random()) / l;
|
|
65
|
+
},
|
|
66
|
+
Gaussian: function(height, mean, deviation) {
|
|
67
|
+
var u1 = Math.random(), u2 = Math.random();
|
|
68
|
+
var random = Chalkboard.real.sqrt(-2 * Chalkboard.real.ln(u1)) * Chalkboard.trig.cos(Chalkboard.PI(2) * u2);
|
|
69
|
+
return random * height * Chalkboard.real.sqrt(deviation) + mean;
|
|
70
|
+
},
|
|
71
|
+
Bernoullian: function(p) {
|
|
72
|
+
if(p === undefined) {
|
|
73
|
+
p = 0.5;
|
|
74
|
+
}
|
|
75
|
+
return Math.random() < p ? 1 : 0;
|
|
76
|
+
},
|
|
77
|
+
Poissonian: function(l) {
|
|
78
|
+
if(l === undefined) {
|
|
79
|
+
l = 1;
|
|
80
|
+
}
|
|
81
|
+
if(l > 0) {
|
|
82
|
+
var L = Chalkboard.E(-l);
|
|
83
|
+
var p = 1, k = 0;
|
|
84
|
+
for(; p > L; ++k) {
|
|
85
|
+
p *= Math.random();
|
|
86
|
+
}
|
|
87
|
+
return k - 1;
|
|
88
|
+
} else {
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
53
91
|
},
|
|
54
92
|
factorial: function(num) {
|
|
55
93
|
if(num >= 0) {
|
|
@@ -223,11 +261,23 @@ var Chalkboard = {
|
|
|
223
261
|
}
|
|
224
262
|
},
|
|
225
263
|
binomial: function(n, k) {
|
|
264
|
+
if(k < 0 || k > n) {
|
|
265
|
+
return 0;
|
|
266
|
+
}
|
|
226
267
|
if(k === 0 || k === n) {
|
|
227
268
|
return 1;
|
|
228
|
-
} else {
|
|
229
|
-
return Chalkboard.numb.binomial(n - 1, k - 1) + Chalkboard.numb.binomial(n - 1, k);
|
|
230
269
|
}
|
|
270
|
+
if(k === 1 || k === n - 1) {
|
|
271
|
+
return n;
|
|
272
|
+
}
|
|
273
|
+
if(n - k < k) {
|
|
274
|
+
k = n - k;
|
|
275
|
+
}
|
|
276
|
+
var result = n;
|
|
277
|
+
for(var i = 2; i <= k; i++) {
|
|
278
|
+
result *= (n - i + 1) / i;
|
|
279
|
+
}
|
|
280
|
+
return Math.round(result);
|
|
231
281
|
},
|
|
232
282
|
Fibonacci: function(num) {
|
|
233
283
|
var sequence = [0, 1];
|
|
@@ -236,18 +286,39 @@ var Chalkboard = {
|
|
|
236
286
|
}
|
|
237
287
|
return sequence[num];
|
|
238
288
|
},
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
289
|
+
Goldbach: function(num) {
|
|
290
|
+
if(num % 2 === 0) {
|
|
291
|
+
if(num !== 4) {
|
|
292
|
+
var a = num / 2, b = num / 2;
|
|
293
|
+
if(a % 2 === 0) {
|
|
294
|
+
a--;
|
|
295
|
+
b++;
|
|
296
|
+
}
|
|
297
|
+
while(a >= 3) {
|
|
298
|
+
if(Chalkboard.numb.isPrime(a) && Chalkboard.numb.isPrime(b)) {
|
|
299
|
+
return [a, b];
|
|
300
|
+
}
|
|
301
|
+
a -= 2;
|
|
302
|
+
b += 2;
|
|
303
|
+
}
|
|
304
|
+
return undefined;
|
|
305
|
+
} else {
|
|
306
|
+
return [2, 2];
|
|
247
307
|
}
|
|
308
|
+
} else {
|
|
309
|
+
return undefined;
|
|
310
|
+
}
|
|
311
|
+
},
|
|
312
|
+
Euler: function(num) {
|
|
313
|
+
if(num > 0) {
|
|
314
|
+
var factors = Chalkboard.numb.factors(num);
|
|
315
|
+
for(var i = 0; i < factors.length; i++) {
|
|
316
|
+
num *= (factors[i] - 1) / factors[i];
|
|
317
|
+
}
|
|
318
|
+
return num;
|
|
319
|
+
} else {
|
|
320
|
+
return undefined;
|
|
248
321
|
}
|
|
249
|
-
var z = u * Chalkboard.real.sqrt(-2 * Chalkboard.real.ln(s) / s);
|
|
250
|
-
return z * height * deviation + mean;
|
|
251
322
|
}
|
|
252
323
|
},
|
|
253
324
|
real: {
|
|
@@ -255,7 +326,9 @@ var Chalkboard = {
|
|
|
255
326
|
type = type || "expl";
|
|
256
327
|
if(type === "expl") {
|
|
257
328
|
return {definition: definition, type: type};
|
|
258
|
-
}
|
|
329
|
+
} else if(type === "inve") {
|
|
330
|
+
return {definition: definition, type: type};
|
|
331
|
+
} else if(type === "pola") {
|
|
259
332
|
return {definition: definition, type: type};
|
|
260
333
|
} else if(type === "curv") {
|
|
261
334
|
return definition.length === 2 ? {definition: [definition[0], definition[1]], type: type} : {definition: [definition[0], definition[1], definition[2]], type: type};
|
|
@@ -264,17 +337,19 @@ var Chalkboard = {
|
|
|
264
337
|
} else if(type === "mult") {
|
|
265
338
|
return {definition: definition, type: type};
|
|
266
339
|
} else {
|
|
267
|
-
return "TypeError: Parameter \"type\" must be either \"expl\", \"pola\", \"curv\", \"surf\", or \"mult\".";
|
|
340
|
+
return "TypeError: Parameter \"type\" must be either \"expl\", \"inve\", \"pola\", \"curv\", \"surf\", or \"mult\".";
|
|
268
341
|
}
|
|
269
342
|
},
|
|
270
|
-
parse: function(str
|
|
271
|
-
|
|
272
|
-
return Function('"use strict"; ' + init + ' return (' + str + ')')();
|
|
343
|
+
parse: function(str) {
|
|
344
|
+
return Function('"use strict"; ' + Chalkboard.PARSEPREFIX + ' return (' + str + ')')();
|
|
273
345
|
},
|
|
274
346
|
val: function(func, val) {
|
|
275
347
|
if(func.type === "expl") {
|
|
276
348
|
var f = Chalkboard.real.parse("x => " + func.definition);
|
|
277
349
|
return f(val);
|
|
350
|
+
} else if(func.type === "inve") {
|
|
351
|
+
var f = Chalkboard.real.parse("y => " + func.definition);
|
|
352
|
+
return f(val);
|
|
278
353
|
} else if(func.type === "pola") {
|
|
279
354
|
var r = Chalkboard.real.parse("O => " + func.definition);
|
|
280
355
|
return r(val);
|
|
@@ -310,7 +385,11 @@ var Chalkboard = {
|
|
|
310
385
|
}
|
|
311
386
|
},
|
|
312
387
|
pow: function(base, num) {
|
|
313
|
-
|
|
388
|
+
if(base === 0 && num === 0) {
|
|
389
|
+
return 1;
|
|
390
|
+
} else {
|
|
391
|
+
return Math.exp(num * Math.log(base));
|
|
392
|
+
}
|
|
314
393
|
},
|
|
315
394
|
log: function(base, num) {
|
|
316
395
|
return Chalkboard.real.ln(num) / Chalkboard.real.ln(base);
|
|
@@ -328,7 +407,8 @@ var Chalkboard = {
|
|
|
328
407
|
return undefined;
|
|
329
408
|
}
|
|
330
409
|
},
|
|
331
|
-
|
|
410
|
+
root: function(num, index) {
|
|
411
|
+
index = index || 3;
|
|
332
412
|
return Math.exp(Math.log(num) / index);
|
|
333
413
|
},
|
|
334
414
|
tetration: function(base, num) {
|
|
@@ -443,14 +523,20 @@ var Chalkboard = {
|
|
|
443
523
|
},
|
|
444
524
|
comp: {
|
|
445
525
|
new: function(a, b) {
|
|
446
|
-
|
|
526
|
+
if(b === undefined) {
|
|
527
|
+
return {a: a, b: 0, type: "comp"};
|
|
528
|
+
} else {
|
|
529
|
+
return {a: a, b: b, type: "comp"};
|
|
530
|
+
}
|
|
531
|
+
},
|
|
532
|
+
copy: function(comp) {
|
|
533
|
+
return Object.create(Object.getPrototypeOf(comp), Object.getOwnPropertyDescriptors(comp));
|
|
447
534
|
},
|
|
448
535
|
function: function(realDefinition, imagDefinition) {
|
|
449
536
|
return {definition: [realDefinition, imagDefinition], type: "comp"};
|
|
450
537
|
},
|
|
451
|
-
parse: function(str
|
|
452
|
-
|
|
453
|
-
return Function('"use strict"; ' + init + ' return (' + str + ')')();
|
|
538
|
+
parse: function(str) {
|
|
539
|
+
return Function('"use strict"; ' + Chalkboard.PARSEPREFIX + ' return (' + str + ')')();
|
|
454
540
|
},
|
|
455
541
|
val: function(func, comp) {
|
|
456
542
|
if(func.type === "comp") {
|
|
@@ -529,6 +615,18 @@ var Chalkboard = {
|
|
|
529
615
|
sqrt: function(comp) {
|
|
530
616
|
return Chalkboard.comp.new(Chalkboard.real.sqrt((comp.a + Chalkboard.real.sqrt((comp.a * comp.a) + (comp.b * comp.b))) / 2), Chalkboard.numb.sgn(comp.b) * Chalkboard.real.sqrt((-comp.a + Chalkboard.real.sqrt((comp.a * comp.a) + (comp.b * comp.b))) / 2));
|
|
531
617
|
},
|
|
618
|
+
root: function(comp, index) {
|
|
619
|
+
index = index || 3;
|
|
620
|
+
if(Number.isInteger(index) && index > 0) {
|
|
621
|
+
var result = [];
|
|
622
|
+
var r = Chalkboard.comp.mag(comp);
|
|
623
|
+
var t = Chalkboard.comp.arg(comp);
|
|
624
|
+
for(var i = 0; i < index; i++) {
|
|
625
|
+
result.push(Chalkboard.comp.new(Chalkboard.real.root(r, index) * Chalkboard.trig.cos((t + Chalkboard.PI(2 * i)) / index), Chalkboard.real.root(r, index) * Chalkboard.trig.sin((t + Chalkboard.PI(2 * i)) / index)));
|
|
626
|
+
}
|
|
627
|
+
return result;
|
|
628
|
+
}
|
|
629
|
+
},
|
|
532
630
|
rotate: function(comp, rad) {
|
|
533
631
|
return Chalkboard.comp.new(Chalkboard.comp.mag(comp) * Chalkboard.trig.cos(Chalkboard.comp.arg(comp) + rad), Chalkboard.comp.mag(comp) * Chalkboard.trig.sin(Chalkboard.comp.arg(comp) + rad));
|
|
534
632
|
},
|
|
@@ -538,21 +636,22 @@ var Chalkboard = {
|
|
|
538
636
|
conjugate: function(comp) {
|
|
539
637
|
return Chalkboard.comp.new(comp.a, -comp.b);
|
|
540
638
|
},
|
|
541
|
-
root: function(comp, n) {
|
|
542
|
-
if(Number.isInteger(n) && n > 0) {
|
|
543
|
-
var result = [];
|
|
544
|
-
var r = Chalkboard.comp.mag(comp);
|
|
545
|
-
var t = Chalkboard.comp.arg(comp);
|
|
546
|
-
for(var i = 0; i < n; i++) {
|
|
547
|
-
result.push(Chalkboard.comp.new(Chalkboard.real.nrt(r, n) * Chalkboard.trig.cos((t + Chalkboard.PI(2 * i)) / n), Chalkboard.real.nrt(r, n) * Chalkboard.trig.sin((t + Chalkboard.PI(2 * i)) / n)));
|
|
548
|
-
}
|
|
549
|
-
return result;
|
|
550
|
-
}
|
|
551
|
-
},
|
|
552
639
|
dist: function(comp_1, comp_2) {
|
|
640
|
+
if(typeof comp_1 === "number") {
|
|
641
|
+
comp_1 = Chalkboard.comp.new(comp_1, 0);
|
|
642
|
+
}
|
|
643
|
+
if(typeof comp_2 === "number") {
|
|
644
|
+
comp_2 = Chalkboard.comp.new(comp_2, 0);
|
|
645
|
+
}
|
|
553
646
|
return Chalkboard.real.sqrt(((comp_2.a - comp_1.a) * (comp_2.a - comp_1.a)) + ((comp_2.b - comp_1.b) * (comp_2.b - comp_1.b)));
|
|
554
647
|
},
|
|
555
648
|
distsq: function(comp_1, comp_2) {
|
|
649
|
+
if(typeof comp_1 === "number") {
|
|
650
|
+
comp_1 = Chalkboard.comp.new(comp_1, 0);
|
|
651
|
+
}
|
|
652
|
+
if(typeof comp_2 === "number") {
|
|
653
|
+
comp_2 = Chalkboard.comp.new(comp_2, 0);
|
|
654
|
+
}
|
|
556
655
|
return ((comp_2.a - comp_1.a) * (comp_2.a - comp_1.a)) + ((comp_2.b - comp_1.b) * (comp_2.b - comp_1.b));
|
|
557
656
|
},
|
|
558
657
|
scl: function(comp, num) {
|
|
@@ -562,15 +661,39 @@ var Chalkboard = {
|
|
|
562
661
|
return Chalkboard.comp.new(Chalkboard.numb.constrain(comp.a, range), Chalkboard.numb.constrain(comp.b, range));
|
|
563
662
|
},
|
|
564
663
|
add: function(comp_1, comp_2) {
|
|
664
|
+
if(typeof comp_1 === "number") {
|
|
665
|
+
comp_1 = Chalkboard.comp.new(comp_1, 0);
|
|
666
|
+
}
|
|
667
|
+
if(typeof comp_2 === "number") {
|
|
668
|
+
comp_2 = Chalkboard.comp.new(comp_2, 0);
|
|
669
|
+
}
|
|
565
670
|
return Chalkboard.comp.new(comp_1.a + comp_2.a, comp_1.b + comp_2.b);
|
|
566
671
|
},
|
|
567
672
|
sub: function(comp_1, comp_2) {
|
|
673
|
+
if(typeof comp_1 === "number") {
|
|
674
|
+
comp_1 = Chalkboard.comp.new(comp_1, 0);
|
|
675
|
+
}
|
|
676
|
+
if(typeof comp_2 === "number") {
|
|
677
|
+
comp_2 = Chalkboard.comp.new(comp_2, 0);
|
|
678
|
+
}
|
|
568
679
|
return Chalkboard.comp.new(comp_1.a - comp_2.a, comp_1.b - comp_2.b);
|
|
569
680
|
},
|
|
570
681
|
mul: function(comp_1, comp_2) {
|
|
682
|
+
if(typeof comp_1 === "number") {
|
|
683
|
+
comp_1 = Chalkboard.comp.new(comp_1, 0);
|
|
684
|
+
}
|
|
685
|
+
if(typeof comp_2 === "number") {
|
|
686
|
+
comp_2 = Chalkboard.comp.new(comp_2, 0);
|
|
687
|
+
}
|
|
571
688
|
return Chalkboard.comp.new((comp_1.a * comp_2.a) - (comp_1.b * comp_2.b), (comp_1.a * comp_2.b) + (comp_1.b * comp_2.a));
|
|
572
689
|
},
|
|
573
690
|
div: function(comp_1, comp_2) {
|
|
691
|
+
if(typeof comp_1 === "number") {
|
|
692
|
+
comp_1 = Chalkboard.comp.new(comp_1, 0);
|
|
693
|
+
}
|
|
694
|
+
if(typeof comp_2 === "number") {
|
|
695
|
+
comp_2 = Chalkboard.comp.new(comp_2, 0);
|
|
696
|
+
}
|
|
574
697
|
return Chalkboard.comp.new(((comp_1.a * comp_2.a) - (comp_1.b * comp_2.b)) / Chalkboard.comp.magsq(comp_2), ((comp_1.a * comp_2.b) + (comp_1.b * comp_2.a)) / Chalkboard.comp.magsq(comp_2));
|
|
575
698
|
},
|
|
576
699
|
toVector: function(comp) {
|
|
@@ -592,7 +715,14 @@ var Chalkboard = {
|
|
|
592
715
|
},
|
|
593
716
|
quat: {
|
|
594
717
|
new: function(a, b, c, d) {
|
|
595
|
-
|
|
718
|
+
if(b === undefined && c === undefined && d === undefined) {
|
|
719
|
+
return {a: a, b: 0, c: 0, d: 0, type: "quat"};
|
|
720
|
+
} else {
|
|
721
|
+
return {a: a, b: b, c: c, d: d, type: "quat"};
|
|
722
|
+
}
|
|
723
|
+
},
|
|
724
|
+
copy: function(quat) {
|
|
725
|
+
return Object.create(Object.getPrototypeOf(quat), Object.getOwnPropertyDescriptors(quat));
|
|
596
726
|
},
|
|
597
727
|
random: function(inf, sup) {
|
|
598
728
|
return Chalkboard.quat.new(Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup));
|
|
@@ -634,9 +764,21 @@ var Chalkboard = {
|
|
|
634
764
|
return Chalkboard.quat.new(quat.a, -quat.b, -quat.c, -quat.d);
|
|
635
765
|
},
|
|
636
766
|
dist: function(quat_1, quat_2) {
|
|
767
|
+
if(typeof quat_1 === "number") {
|
|
768
|
+
quat_1 = Chalkboard.quat.new(quat_1, 0, 0, 0);
|
|
769
|
+
}
|
|
770
|
+
if(typeof quat_2 === "number") {
|
|
771
|
+
quat_2 = Chalkboard.quat.new(quat_2, 0, 0, 0);
|
|
772
|
+
}
|
|
637
773
|
return Chalkboard.real.sqrt(((quat_2.a - quat_1.a) * (quat_2.a - quat_1.a)) + ((quat_2.b - quat_1.b) * (quat_2.b - quat_1.b)) + ((quat_2.c - quat_1.c) * (quat_2.c - quat_1.c)) + ((quat_2.d - quat_1.d) * (quat_2.d - quat_1.d)));
|
|
638
774
|
},
|
|
639
775
|
distsq: function(quat_1, quat_2) {
|
|
776
|
+
if(typeof quat_1 === "number") {
|
|
777
|
+
quat_1 = Chalkboard.quat.new(quat_1, 0, 0, 0);
|
|
778
|
+
}
|
|
779
|
+
if(typeof quat_2 === "number") {
|
|
780
|
+
quat_2 = Chalkboard.quat.new(quat_2, 0, 0, 0);
|
|
781
|
+
}
|
|
640
782
|
return ((quat_2.a - quat_1.a) * (quat_2.a - quat_1.a)) + ((quat_2.b - quat_1.b) * (quat_2.b - quat_1.b)) + ((quat_2.c - quat_1.c) * (quat_2.c - quat_1.c)) + ((quat_2.d - quat_1.d) * (quat_2.d - quat_1.d));
|
|
641
783
|
},
|
|
642
784
|
scl: function(quat, num) {
|
|
@@ -646,14 +788,41 @@ var Chalkboard = {
|
|
|
646
788
|
return Chalkboard.quat.new(Chalkboard.numb.constrain(quat.a, range), Chalkboard.numb.constrain(quat.b, range), Chalkboard.numb.constrain(quat.c, range), Chalkboard.numb.constrain(quat.d, range));
|
|
647
789
|
},
|
|
648
790
|
add: function(quat_1, quat_2) {
|
|
791
|
+
if(typeof quat_1 === "number") {
|
|
792
|
+
quat_1 = Chalkboard.quat.new(quat_1, 0, 0, 0);
|
|
793
|
+
}
|
|
794
|
+
if(typeof quat_2 === "number") {
|
|
795
|
+
quat_2 = Chalkboard.quat.new(quat_2, 0, 0, 0);
|
|
796
|
+
}
|
|
649
797
|
return Chalkboard.quat.new(quat_1.a + quat_2.a, quat_1.b + quat_2.b, quat_1.c + quat_2.c, quat_1.d + quat_2.d);
|
|
650
798
|
},
|
|
651
799
|
sub: function(quat_1, quat_2) {
|
|
800
|
+
if(typeof quat_1 === "number") {
|
|
801
|
+
quat_1 = Chalkboard.quat.new(quat_1, 0, 0, 0);
|
|
802
|
+
}
|
|
803
|
+
if(typeof quat_2 === "number") {
|
|
804
|
+
quat_2 = Chalkboard.quat.new(quat_2, 0, 0, 0);
|
|
805
|
+
}
|
|
652
806
|
return Chalkboard.quat.new(quat_1.a - quat_2.a, quat_1.b - quat_2.b, quat_1.c - quat_2.c, quat_1.d - quat_2.d);
|
|
653
807
|
},
|
|
654
808
|
mul: function(quat_1, quat_2) {
|
|
809
|
+
if(typeof quat_1 === "number") {
|
|
810
|
+
quat_1 = Chalkboard.quat.new(quat_1, 0, 0, 0);
|
|
811
|
+
}
|
|
812
|
+
if(typeof quat_2 === "number") {
|
|
813
|
+
quat_2 = Chalkboard.quat.new(quat_2, 0, 0, 0);
|
|
814
|
+
}
|
|
655
815
|
return Chalkboard.quat.new((quat_1.a * quat_2.a) - (quat_1.b * quat_2.b) - (quat_1.c * quat_2.c) - (quat_1.d * quat_2.d), (quat_1.a * quat_2.b) + (quat_1.b * quat_2.a) + (quat_1.c * quat_2.d) - (quat_1.d * quat_2.c), (quat_1.a * quat_2.c) - (quat_1.b * quat_2.d) + (quat_1.c * quat_2.a) + (quat_1.d * quat_2.b), (quat_1.a * quat_2.d) + (quat_1.b * quat_2.c) - (quat_1.c * quat_2.b) + (quat_1.d * quat_2.a));
|
|
656
816
|
},
|
|
817
|
+
div: function(quat_1, quat_2) {
|
|
818
|
+
if(typeof quat_1 === "number") {
|
|
819
|
+
quat_1 = Chalkboard.quat.new(quat_1, 0, 0, 0);
|
|
820
|
+
}
|
|
821
|
+
if(typeof quat_2 === "number") {
|
|
822
|
+
quat_2 = Chalkboard.quat.new(quat_2, 0, 0, 0);
|
|
823
|
+
}
|
|
824
|
+
return Chalkboard.quat.new((quat_1.a * quat_2.a + quat_1.b * quat_2.b + quat_1.c * quat_2.c + quat_1.d * quat_2.d) / Chalkboard.quat.magsq(quat_2), (quat_1.b * quat_2.a - quat_1.a * quat_2.b - quat_1.d * quat_2.c + quat_1.c * quat_2.d) / Chalkboard.quat.magsq(quat_2), (quat_1.c * quat_2.a + quat_1.d * quat_2.b - quat_1.a * quat_2.c - quat_1.b * quat_2.d) / Chalkboard.quat.magsq(quat_2), (quat_1.d * quat_2.a - quat_1.c * quat_2.b + quat_1.b * quat_2.c - quat_1.a * quat_2.d) / Chalkboard.quat.magsq(quat_2));
|
|
825
|
+
},
|
|
657
826
|
fromAxis: function(vec3, rad) {
|
|
658
827
|
return Chalkboard.quat.new(Chalkboard.trig.cos(rad / 2), vec3.x * Chalkboard.trig.sin(rad / 2), vec3.y * Chalkboard.trig.sin(rad / 2), vec3.z * Chalkboard.trig.sin(rad / 2));
|
|
659
828
|
},
|
|
@@ -698,85 +867,97 @@ var Chalkboard = {
|
|
|
698
867
|
}
|
|
699
868
|
},
|
|
700
869
|
plot: {
|
|
701
|
-
xyplane: function(
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
870
|
+
xyplane: function(config) {
|
|
871
|
+
(config = {
|
|
872
|
+
x: (config = config || {}).x || width / 2,
|
|
873
|
+
y: config.y || height / 2,
|
|
874
|
+
size: config.size || 1,
|
|
875
|
+
stroke: config.stroke || color(0),
|
|
876
|
+
strokeWeight: config.strokeWeight || 2
|
|
877
|
+
}).size /= 100;
|
|
707
878
|
pushMatrix();
|
|
708
|
-
translate(
|
|
709
|
-
stroke(
|
|
710
|
-
strokeWeight(
|
|
711
|
-
for(var i = Math.floor(-
|
|
712
|
-
line(i /
|
|
713
|
-
}
|
|
714
|
-
for(var i = Math.floor(-
|
|
715
|
-
line(-
|
|
716
|
-
}
|
|
717
|
-
strokeWeight(
|
|
718
|
-
line(-
|
|
719
|
-
line(0, -
|
|
879
|
+
translate(config.x, config.y);
|
|
880
|
+
stroke(config.stroke);
|
|
881
|
+
strokeWeight(config.strokeWeight / 4);
|
|
882
|
+
for(var i = Math.floor(-config.x / config.size); i <= (width - config.x) / config.size; i++) {
|
|
883
|
+
line(i / config.size, -config.y, i / config.size, width - config.y);
|
|
884
|
+
}
|
|
885
|
+
for(var i = Math.floor(-config.y / config.size); i <= (width - config.y) / config.size; i++) {
|
|
886
|
+
line(-config.x, i / config.size, width - config.x, i / config.size);
|
|
887
|
+
}
|
|
888
|
+
strokeWeight(config.strokeWeight);
|
|
889
|
+
line(-config.x, 0, width - config.x, 0);
|
|
890
|
+
line(0, -config.y, 0, width - config.y);
|
|
720
891
|
popMatrix();
|
|
721
892
|
},
|
|
722
|
-
rOplane: function(
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
893
|
+
rOplane: function(config) {
|
|
894
|
+
(config = {
|
|
895
|
+
x: (config = config || {}).x || width / 2,
|
|
896
|
+
y: config.y || height / 2,
|
|
897
|
+
size: config.size || 1,
|
|
898
|
+
stroke: config.stroke || color(0),
|
|
899
|
+
strokeWeight: config.strokeWeight || 2
|
|
900
|
+
}).size /= 100;
|
|
728
901
|
pushMatrix();
|
|
729
|
-
translate(
|
|
902
|
+
translate(config.x, config.y);
|
|
730
903
|
noFill();
|
|
731
|
-
stroke(
|
|
732
|
-
strokeWeight(
|
|
733
|
-
for(var i = 0; i <=
|
|
734
|
-
ellipse(0, 0, 2 * i /
|
|
735
|
-
}
|
|
736
|
-
strokeWeight(
|
|
737
|
-
line(-
|
|
738
|
-
line(0, -
|
|
904
|
+
stroke(config.stroke);
|
|
905
|
+
strokeWeight(config.strokeWeight / 4);
|
|
906
|
+
for(var i = 0; i <= config.size * width / 2; i++) {
|
|
907
|
+
ellipse(0, 0, 2 * i / config.size, 2 * i / config.size);
|
|
908
|
+
}
|
|
909
|
+
strokeWeight(config.strokeWeight);
|
|
910
|
+
line(-config.x, 0, width - config.x, 0);
|
|
911
|
+
line(0, -config.y, 0, width - config.y);
|
|
739
912
|
popMatrix();
|
|
740
913
|
},
|
|
741
|
-
function: function(func,
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
914
|
+
function: function(func, config) {
|
|
915
|
+
(config = {
|
|
916
|
+
x: (config = config || {}).x || width / 2,
|
|
917
|
+
y: config.y || height / 2,
|
|
918
|
+
size: config.size || 1,
|
|
919
|
+
stroke: config.stroke || color(0),
|
|
920
|
+
strokeWeight: config.strokeWeight || 2,
|
|
921
|
+
domain: config.domain || (func.type === "comp" ? [[-10, 10], [-10, 10]] : [-10, 10])
|
|
922
|
+
}).size /= 100;
|
|
748
923
|
var data = [];
|
|
749
924
|
pushMatrix();
|
|
750
|
-
translate(
|
|
925
|
+
translate(config.x, config.y);
|
|
751
926
|
noFill();
|
|
752
|
-
strokeWeight(
|
|
753
|
-
stroke(
|
|
927
|
+
strokeWeight(config.strokeWeight);
|
|
928
|
+
stroke(config.stroke);
|
|
754
929
|
beginShape();
|
|
755
930
|
if(func.type === "expl") {
|
|
756
931
|
var f = Chalkboard.real.parse("x => " + func.definition);
|
|
757
|
-
for(var i = domain[0] /
|
|
758
|
-
vertex(i, -f(i *
|
|
932
|
+
for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i++) {
|
|
933
|
+
vertex(i, -f(i * config.size) / config.size);
|
|
759
934
|
data.push([i, f(i)]);
|
|
760
935
|
}
|
|
936
|
+
} else if(func.type === "inve") {
|
|
937
|
+
var f = Chalkboard.real.parse("y => " + func.definition);
|
|
938
|
+
for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i++) {
|
|
939
|
+
vertex(f(i * config.size) / config.size, -i);
|
|
940
|
+
data.push([f(i), i]);
|
|
941
|
+
}
|
|
761
942
|
} else if(func.type === "pola") {
|
|
762
943
|
var r = Chalkboard.real.parse("O => " + func.definition);
|
|
763
|
-
for(var i = domain[0] /
|
|
764
|
-
vertex(r(i *
|
|
944
|
+
for(var i = config.domain[0] / config.size; i < config.domain[1] / config.size; i++) {
|
|
945
|
+
vertex(r(i * config.size) / config.size * Chalkboard.trig.cos(i * config.size), -r(i * config.size) / config.size * Chalkboard.trig.sin(i * config.size));
|
|
765
946
|
data.push([i, r(i)]);
|
|
766
947
|
}
|
|
767
948
|
} else if(func.type === "curv") {
|
|
768
949
|
var x = Chalkboard.real.parse("t => " + func.definition[0]),
|
|
769
950
|
y = Chalkboard.real.parse("t => " + func.definition[1]);
|
|
770
|
-
for(var i = domain[0] /
|
|
771
|
-
vertex(x(i *
|
|
951
|
+
for(var i = config.domain[0] / config.size; i < config.domain[1] / config.size; i++) {
|
|
952
|
+
vertex(x(i * config.size) / config.size, -y(i * config.size) / config.size);
|
|
772
953
|
data.push([x(i), y(i)]);
|
|
773
954
|
}
|
|
774
955
|
} else if(func.type === "comp") {
|
|
775
956
|
var u = Chalkboard.comp.parse("(a, b) => " + func.definition[0]),
|
|
776
957
|
v = Chalkboard.comp.parse("(a, b) => " + func.definition[1]);
|
|
777
|
-
for(var i = domain[0][0] /
|
|
778
|
-
for(var j = domain[1][0] /
|
|
779
|
-
var z = Chalkboard.comp.new(u(i *
|
|
958
|
+
for(var i = config.domain[0][0] / config.size; i <= config.domain[0][1] / config.size; i += 5) {
|
|
959
|
+
for(var j = config.domain[1][0] / config.size; j <= config.domain[1][1] / config.size; j += 5) {
|
|
960
|
+
var z = Chalkboard.comp.new(u(i * config.size, j * config.size) / config.size, v(i * config.size, j * config.size) / config.size);
|
|
780
961
|
noStroke();
|
|
781
962
|
if(z.a === 0 && z.b === 0) {
|
|
782
963
|
fill(0, 0, 0);
|
|
@@ -792,23 +973,26 @@ var Chalkboard = {
|
|
|
792
973
|
}
|
|
793
974
|
}
|
|
794
975
|
} else {
|
|
795
|
-
return "TypeError: Property \"type\" of parameter \"func\" must be either \"expl\", \"pola\", \"curv\", or \"comp\".";
|
|
976
|
+
return "TypeError: Property \"type\" of parameter \"func\" must be either \"expl\", \"inve\", \"pola\", \"curv\", or \"comp\".";
|
|
796
977
|
}
|
|
797
978
|
endShape();
|
|
798
979
|
popMatrix();
|
|
799
980
|
return data;
|
|
800
981
|
},
|
|
801
|
-
barplot: function(arr, bins,
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
982
|
+
barplot: function(arr, bins, config) {
|
|
983
|
+
(config = {
|
|
984
|
+
x: (config = config || {}).x || width / 2,
|
|
985
|
+
y: config.y || height / 2,
|
|
986
|
+
size: config.size || 1,
|
|
987
|
+
fill: config.fill || color(255),
|
|
988
|
+
stroke: config.stroke || color(0),
|
|
989
|
+
strokeWeight: config.strokeWeight || 2
|
|
990
|
+
}).size /= 100;
|
|
807
991
|
pushMatrix();
|
|
808
|
-
translate(
|
|
809
|
-
strokeWeight(
|
|
810
|
-
stroke(
|
|
811
|
-
fill(
|
|
992
|
+
translate(config.x, config.y);
|
|
993
|
+
strokeWeight(config.strokeWeight);
|
|
994
|
+
stroke(config.stroke);
|
|
995
|
+
fill(config.fill);
|
|
812
996
|
var bars = [];
|
|
813
997
|
for(var i = 0; i < bins.length; i++) {
|
|
814
998
|
if(i === 0) {
|
|
@@ -823,25 +1007,27 @@ var Chalkboard = {
|
|
|
823
1007
|
for(var i = 0; i < bars.length; i++) {
|
|
824
1008
|
counts.push(bars[i].length);
|
|
825
1009
|
}
|
|
826
|
-
var x = 0, width = counts.length / (2 *
|
|
1010
|
+
var x = 0, width = counts.length / (2 * config.size);
|
|
827
1011
|
for(var i = 0; i < counts.length; i++) {
|
|
828
|
-
rect(x - width, 0, 1 /
|
|
829
|
-
x += 1 /
|
|
1012
|
+
rect(x - width, 0, 1 / config.size, -counts[i] / config.size);
|
|
1013
|
+
x += 1 / config.size;
|
|
830
1014
|
}
|
|
831
1015
|
popMatrix();
|
|
832
1016
|
return bars;
|
|
833
1017
|
},
|
|
834
|
-
lineplot: function(arr, bins,
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
1018
|
+
lineplot: function(arr, bins, config) {
|
|
1019
|
+
(config = {
|
|
1020
|
+
x: (config = config || {}).x || width / 2,
|
|
1021
|
+
y: config.y || height / 2,
|
|
1022
|
+
size: config.size || 1,
|
|
1023
|
+
stroke: config.stroke || color(0),
|
|
1024
|
+
strokeWeight: config.strokeWeight || 2
|
|
1025
|
+
}).size /= 100;
|
|
840
1026
|
pushMatrix();
|
|
841
|
-
translate(
|
|
1027
|
+
translate(config.x, config.y);
|
|
842
1028
|
noFill();
|
|
843
|
-
strokeWeight(
|
|
844
|
-
stroke(
|
|
1029
|
+
strokeWeight(config.strokeWeight);
|
|
1030
|
+
stroke(config.stroke);
|
|
845
1031
|
var verts = [];
|
|
846
1032
|
for(var i = 0; i < bins.length; i++) {
|
|
847
1033
|
if(i === 0) {
|
|
@@ -858,77 +1044,85 @@ var Chalkboard = {
|
|
|
858
1044
|
}
|
|
859
1045
|
beginShape();
|
|
860
1046
|
for(var i = 0; i < counts.length; i++) {
|
|
861
|
-
vertex(i /
|
|
1047
|
+
vertex(i / config.size, -counts[i] / config.size);
|
|
862
1048
|
}
|
|
863
1049
|
endShape();
|
|
864
1050
|
popMatrix();
|
|
865
1051
|
return verts;
|
|
866
1052
|
},
|
|
867
|
-
scatterplot: function(arr1, arr2,
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
1053
|
+
scatterplot: function(arr1, arr2, config) {
|
|
1054
|
+
(config = {
|
|
1055
|
+
x: (config = config || {}).x || width / 2,
|
|
1056
|
+
y: config.y || height / 2,
|
|
1057
|
+
size: config.size || 1,
|
|
1058
|
+
stroke: config.stroke || color(0),
|
|
1059
|
+
strokeWeight: config.strokeWeight || 5
|
|
1060
|
+
}).size /= 100;
|
|
873
1061
|
var data = [];
|
|
874
1062
|
pushMatrix();
|
|
875
|
-
translate(
|
|
876
|
-
strokeWeight(
|
|
877
|
-
stroke(
|
|
1063
|
+
translate(config.x, config.y);
|
|
1064
|
+
strokeWeight(config.strokeWeight);
|
|
1065
|
+
stroke(config.stroke);
|
|
878
1066
|
if(arr1.length === arr2.length) {
|
|
879
1067
|
for(var i = 0; i < arr1.length; i++) {
|
|
880
|
-
point(arr1[i] /
|
|
1068
|
+
point(arr1[i] / config.size - arr1.length / (2 * config.size), -arr2[i] / config.size + arr1.length / (2 * config.size));
|
|
881
1069
|
data.push([arr1[i], arr2[i]]);
|
|
882
1070
|
}
|
|
883
1071
|
}
|
|
884
1072
|
popMatrix();
|
|
885
1073
|
return data;
|
|
886
1074
|
},
|
|
887
|
-
comp: function(comp,
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
1075
|
+
comp: function(comp, config) {
|
|
1076
|
+
(config = {
|
|
1077
|
+
x: (config = config || {}).x || width / 2,
|
|
1078
|
+
y: config.y || height / 2,
|
|
1079
|
+
size: config.size || 1,
|
|
1080
|
+
stroke: config.stroke || color(0),
|
|
1081
|
+
strokeWeight: config.strokeWeight || 5
|
|
1082
|
+
}).size /= 100;
|
|
1083
|
+
stroke(config.stroke);
|
|
1084
|
+
strokeWeight(config.strokeWeight);
|
|
895
1085
|
pushMatrix();
|
|
896
|
-
translate(
|
|
897
|
-
point(comp.a /
|
|
1086
|
+
translate(config.x, config.y);
|
|
1087
|
+
point(comp.a / config.size, -comp.b / config.size);
|
|
898
1088
|
popMatrix();
|
|
899
1089
|
noStroke();
|
|
900
1090
|
noFill();
|
|
901
1091
|
return [[comp.a], [comp.b]];
|
|
902
1092
|
},
|
|
903
|
-
vec2: function(vec2,
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
1093
|
+
vec2: function(vec2, config) {
|
|
1094
|
+
(config = {
|
|
1095
|
+
x: (config = config || {}).x || width / 2,
|
|
1096
|
+
y: config.y || height / 2,
|
|
1097
|
+
size: config.size || 1,
|
|
1098
|
+
stroke: config.stroke || color(0),
|
|
1099
|
+
strokeWeight: config.strokeWeight || 5
|
|
1100
|
+
}).size /= 100;
|
|
1101
|
+
stroke(config.stroke);
|
|
1102
|
+
strokeWeight(config.strokeWeight);
|
|
911
1103
|
pushMatrix();
|
|
912
|
-
translate(
|
|
913
|
-
line(0, 0, vec2.x /
|
|
1104
|
+
translate(config.x, config.y);
|
|
1105
|
+
line(0, 0, vec2.x / config.size, -vec2.y / config.size);
|
|
914
1106
|
popMatrix();
|
|
915
1107
|
return [[vec2.x], [vec2.y]];
|
|
916
1108
|
},
|
|
917
|
-
field: function(vec2field,
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
1109
|
+
field: function(vec2field, config) {
|
|
1110
|
+
(config = {
|
|
1111
|
+
x: (config = config || {}).x || width / 2,
|
|
1112
|
+
y: config.y || height / 2,
|
|
1113
|
+
size: config.size || 1,
|
|
1114
|
+
stroke: config.stroke || color(0),
|
|
1115
|
+
strokeWeight: config.strokeWeight || 5,
|
|
1116
|
+
domain: config.domain || [[-10, 10], [-10, 10]],
|
|
1117
|
+
res: config.res || 25
|
|
1118
|
+
}).size /= 100;
|
|
925
1119
|
var data = [];
|
|
926
|
-
stroke(
|
|
927
|
-
strokeWeight(
|
|
1120
|
+
stroke(config.stroke);
|
|
1121
|
+
strokeWeight(config.strokeWeight);
|
|
928
1122
|
pushMatrix();
|
|
929
|
-
translate(
|
|
930
|
-
for(var i = domain[0][0] /
|
|
931
|
-
for(var j = domain[1][0] /
|
|
1123
|
+
translate(config.x, config.y);
|
|
1124
|
+
for(var i = config.domain[0][0] / config.size; i <= config.domain[0][1] / config.size; i += config.res) {
|
|
1125
|
+
for(var j = config.domain[1][0] / config.size; j <= config.domain[1][1] / config.size; j += config.res) {
|
|
932
1126
|
var v = Chalkboard.vec2.fromField(vec2field, Chalkboard.vec2.new(i, j));
|
|
933
1127
|
line(i, j, i + v.x, j + v.y);
|
|
934
1128
|
data.push([i + v.x, j + v.y]);
|
|
@@ -937,230 +1131,258 @@ var Chalkboard = {
|
|
|
937
1131
|
popMatrix();
|
|
938
1132
|
return data;
|
|
939
1133
|
},
|
|
940
|
-
vec3: function(vec3,
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
1134
|
+
vec3: function(vec3, config) {
|
|
1135
|
+
(config = {
|
|
1136
|
+
x: (config = config || {}).x || width / 2,
|
|
1137
|
+
y: config.y || height / 2,
|
|
1138
|
+
size: config.size || 1,
|
|
1139
|
+
stroke: config.stroke || color(0),
|
|
1140
|
+
strokeWeight: config.strokeWeight || 5
|
|
1141
|
+
}).size /= 100;
|
|
1142
|
+
stroke(config.stroke);
|
|
1143
|
+
strokeWeight(config.strokeWeight);
|
|
948
1144
|
pushMatrix();
|
|
949
|
-
translate(
|
|
950
|
-
line(0, 0, (vec3.x /
|
|
1145
|
+
translate(config.x, config.y);
|
|
1146
|
+
line(0, 0, (vec3.x / config.size) / (vec3.z * 0.25 + 1), (-vec3.y / config.size) / (vec3.z * 0.25 + 1));
|
|
951
1147
|
popMatrix();
|
|
952
1148
|
return [[vec3.x], [vec3.y], [vec3.z]];
|
|
953
1149
|
},
|
|
954
|
-
matr: function(matr,
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
var
|
|
964
|
-
|
|
965
|
-
Chalkboard.vec2.
|
|
966
|
-
Chalkboard.vec2.
|
|
967
|
-
Chalkboard.vec2.
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
var plotnegaxisy = Chalkboard.vec2.new(-matr[0][1], -matr[1][1]);
|
|
974
|
-
Chalkboard.vec2.plot(plotposaxisx, scl, rgba, origin, weight);
|
|
975
|
-
Chalkboard.vec2.plot(plotnegaxisx, scl, rgba, origin, weight);
|
|
976
|
-
Chalkboard.vec2.plot(plotposaxisy, scl, rgba, origin, weight);
|
|
977
|
-
Chalkboard.vec2.plot(plotnegaxisy, scl, rgba, origin, weight);
|
|
1150
|
+
matr: function(matr, config) {
|
|
1151
|
+
(config = {
|
|
1152
|
+
x: (config = config || {}).x || width / 2,
|
|
1153
|
+
y: config.y || height / 2,
|
|
1154
|
+
size: config.size || 1,
|
|
1155
|
+
stroke: config.stroke || color(0),
|
|
1156
|
+
strokeWeight: config.strokeWeight || 2,
|
|
1157
|
+
domain: config.domain || [-10, 10]
|
|
1158
|
+
}).size /= 100;
|
|
1159
|
+
for(var i = config.domain[0]; i <= config.domain[1]; i++) {
|
|
1160
|
+
Chalkboard.plot.vec2(Chalkboard.vec2.new(matr[0][0], matr[1][0]), {x: config.x, y: config.y + (i / config.size) * matr[1][1], size: config.size, stroke: config.stroke, strokeWeight: config.strokeWeight / 4});
|
|
1161
|
+
Chalkboard.plot.vec2(Chalkboard.vec2.new(-matr[0][0], -matr[1][0]), {x: config.x, y: config.y + (i / config.size) * matr[1][1], size: config.size, stroke: config.stroke, strokeWeight: config.strokeWeight / 4});
|
|
1162
|
+
Chalkboard.plot.vec2(Chalkboard.vec2.new(matr[0][1], matr[1][1]), {x: config.x + (i / config.size) * matr[0][0], y: config.y, size: config.size, stroke: config.stroke, strokeWeight: config.strokeWeight / 4});
|
|
1163
|
+
Chalkboard.plot.vec2(Chalkboard.vec2.new(-matr[0][1], -matr[1][1]), {x: config.x + (i / config.size) * matr[0][0], y: config.y, size: config.size, stroke: config.stroke, strokeWeight: config.strokeWeight / 4});
|
|
1164
|
+
}
|
|
1165
|
+
Chalkboard.plot.vec2(Chalkboard.vec2.new(matr[0][0], matr[1][0]), config);
|
|
1166
|
+
Chalkboard.plot.vec2(Chalkboard.vec2.new(-matr[0][0], -matr[1][0]), config);
|
|
1167
|
+
Chalkboard.plot.vec2(Chalkboard.vec2.new(matr[0][1], matr[1][1]), config);
|
|
1168
|
+
Chalkboard.plot.vec2(Chalkboard.vec2.new(-matr[0][1], -matr[1][1]), config);
|
|
978
1169
|
return matr;
|
|
979
1170
|
},
|
|
980
|
-
dfdx: function(func,
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
1171
|
+
dfdx: function(func, config) {
|
|
1172
|
+
(config = {
|
|
1173
|
+
x: (config = config || {}).x || width / 2,
|
|
1174
|
+
y: config.y || height / 2,
|
|
1175
|
+
size: config.size || 1,
|
|
1176
|
+
stroke: config.stroke || color(0),
|
|
1177
|
+
strokeWeight: config.strokeWeight || 2,
|
|
1178
|
+
domain: config.domain || [-10, 10],
|
|
1179
|
+
res: config.res || 25
|
|
1180
|
+
}).size /= 100;
|
|
988
1181
|
var data = [];
|
|
989
1182
|
pushMatrix();
|
|
990
|
-
translate(
|
|
1183
|
+
translate(config.x, config.y);
|
|
991
1184
|
noFill();
|
|
992
|
-
strokeWeight(
|
|
993
|
-
stroke(
|
|
1185
|
+
strokeWeight(config.strokeWeight);
|
|
1186
|
+
stroke(config.stroke);
|
|
994
1187
|
beginShape();
|
|
995
|
-
for(var i = domain[0] /
|
|
996
|
-
|
|
997
|
-
|
|
1188
|
+
for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i += config.res) {
|
|
1189
|
+
if(func.type === "expl") {
|
|
1190
|
+
vertex(i, -Chalkboard.calc.dfdx(func, i * config.size) / config.size);
|
|
1191
|
+
data.push([i, Chalkboard.calc.dfdx(func, i)]);
|
|
1192
|
+
} else if(func.type === "inve") {
|
|
1193
|
+
vertex(Chalkboard.calc.dfdx(func, i * config.size) / config.size, -i);
|
|
1194
|
+
data.push([Chalkboard.calc.dfdx(func, i), i]);
|
|
1195
|
+
}
|
|
998
1196
|
}
|
|
999
1197
|
endShape();
|
|
1000
1198
|
popMatrix();
|
|
1001
1199
|
return data;
|
|
1002
1200
|
},
|
|
1003
|
-
d2fdx2: function(func,
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1201
|
+
d2fdx2: function(func, config) {
|
|
1202
|
+
(config = {
|
|
1203
|
+
x: (config = config || {}).x || width / 2,
|
|
1204
|
+
y: config.y || height / 2,
|
|
1205
|
+
size: config.size || 1,
|
|
1206
|
+
stroke: config.stroke || color(0),
|
|
1207
|
+
strokeWeight: config.strokeWeight || 2,
|
|
1208
|
+
domain: config.domain || [-10, 10],
|
|
1209
|
+
res: config.res || 25
|
|
1210
|
+
}).size /= 100;
|
|
1011
1211
|
var data = [];
|
|
1012
1212
|
pushMatrix();
|
|
1013
|
-
translate(
|
|
1213
|
+
translate(config.x, config.y);
|
|
1014
1214
|
noFill();
|
|
1015
|
-
strokeWeight(
|
|
1016
|
-
stroke(
|
|
1215
|
+
strokeWeight(config.strokeWeight);
|
|
1216
|
+
stroke(config.stroke);
|
|
1017
1217
|
beginShape();
|
|
1018
|
-
for(var i = domain[0] /
|
|
1019
|
-
|
|
1020
|
-
|
|
1218
|
+
for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i += config.res) {
|
|
1219
|
+
if(func.type === "expl") {
|
|
1220
|
+
vertex(i, -Chalkboard.calc.d2fdx2(func, i * config.size) / config.size);
|
|
1221
|
+
data.push([i, Chalkboard.calc.d2fdx2(func, i)]);
|
|
1222
|
+
} else if(func.type === "inve") {
|
|
1223
|
+
vertex(Chalkboard.calc.d2fdx2(func, i * config.size) / config.size, -i);
|
|
1224
|
+
data.push([Chalkboard.calc.d2fdx2(func, i), i]);
|
|
1225
|
+
}
|
|
1021
1226
|
}
|
|
1022
1227
|
endShape();
|
|
1023
1228
|
popMatrix();
|
|
1024
1229
|
return data;
|
|
1025
1230
|
},
|
|
1026
|
-
fxdx: function(func,
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1231
|
+
fxdx: function(func, config) {
|
|
1232
|
+
(config = {
|
|
1233
|
+
x: (config = config || {}).x || width / 2,
|
|
1234
|
+
y: config.y || height / 2,
|
|
1235
|
+
size: config.size || 1,
|
|
1236
|
+
stroke: config.stroke || color(0),
|
|
1237
|
+
strokeWeight: config.strokeWeight || 2,
|
|
1238
|
+
domain: config.domain || [-10, 10],
|
|
1239
|
+
res: config.res || 25
|
|
1240
|
+
}).size /= 100;
|
|
1034
1241
|
var data = [];
|
|
1035
1242
|
pushMatrix();
|
|
1036
|
-
translate(
|
|
1243
|
+
translate(config.x, config.y);
|
|
1037
1244
|
noFill();
|
|
1038
|
-
strokeWeight(
|
|
1039
|
-
stroke(
|
|
1245
|
+
strokeWeight(config.strokeWeight);
|
|
1246
|
+
stroke(config.stroke);
|
|
1040
1247
|
beginShape();
|
|
1041
|
-
for(var i = domain[0] /
|
|
1042
|
-
|
|
1043
|
-
|
|
1248
|
+
for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i += config.res) {
|
|
1249
|
+
if(func.type === "expl") {
|
|
1250
|
+
vertex(i, -Chalkboard.calc.fxdx(func, 0, i * config.size) / config.size);
|
|
1251
|
+
data.push([i, Chalkboard.calc.fxdx(func, 0, i)]);
|
|
1252
|
+
} else if(func.type === "inve") {
|
|
1253
|
+
vertex(Chalkboard.calc.fxdx(func, 0, i * config.size) / config.size, -i);
|
|
1254
|
+
data.push([Chalkboard.calc.fxdx(func, 0, i), i]);
|
|
1255
|
+
}
|
|
1044
1256
|
}
|
|
1045
1257
|
endShape();
|
|
1046
1258
|
popMatrix();
|
|
1047
1259
|
return data;
|
|
1048
1260
|
},
|
|
1049
|
-
convolution: function(func_1, func_2,
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1261
|
+
convolution: function(func_1, func_2, config) {
|
|
1262
|
+
(config = {
|
|
1263
|
+
x: (config = config || {}).x || width / 2,
|
|
1264
|
+
y: config.y || height / 2,
|
|
1265
|
+
size: config.size || 1,
|
|
1266
|
+
stroke: config.stroke || color(0),
|
|
1267
|
+
strokeWeight: config.strokeWeight || 2,
|
|
1268
|
+
domain: config.domain || [-10, 10],
|
|
1269
|
+
res: config.res || 25
|
|
1270
|
+
}).size /= 100;
|
|
1057
1271
|
var data = [];
|
|
1058
1272
|
pushMatrix();
|
|
1059
|
-
translate(
|
|
1273
|
+
translate(config.x, config.y);
|
|
1060
1274
|
noFill();
|
|
1061
|
-
strokeWeight(
|
|
1062
|
-
stroke(
|
|
1275
|
+
strokeWeight(config.strokeWeight);
|
|
1276
|
+
stroke(config.stroke);
|
|
1063
1277
|
beginShape();
|
|
1064
|
-
for(var i = domain[0] /
|
|
1065
|
-
vertex(i, -Chalkboard.calc.convolution(func_1, func_2, i *
|
|
1278
|
+
for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i += config.res) {
|
|
1279
|
+
vertex(i, -Chalkboard.calc.convolution(func_1, func_2, i * config.size) / config.size);
|
|
1066
1280
|
data.push([i, Chalkboard.calc.convolution(func_1, func_2, i)]);
|
|
1067
1281
|
}
|
|
1068
1282
|
endShape();
|
|
1069
1283
|
popMatrix();
|
|
1070
1284
|
return data;
|
|
1071
1285
|
},
|
|
1072
|
-
correlation: function(func_1, func_2,
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1286
|
+
correlation: function(func_1, func_2, config) {
|
|
1287
|
+
(config = {
|
|
1288
|
+
x: (config = config || {}).x || width / 2,
|
|
1289
|
+
y: config.y || height / 2,
|
|
1290
|
+
size: config.size || 1,
|
|
1291
|
+
stroke: config.stroke || color(0),
|
|
1292
|
+
strokeWeight: config.strokeWeight || 2,
|
|
1293
|
+
domain: config.domain || [-10, 10],
|
|
1294
|
+
res: config.res || 25
|
|
1295
|
+
}).size /= 100;
|
|
1080
1296
|
var data = [];
|
|
1081
1297
|
pushMatrix();
|
|
1082
|
-
translate(
|
|
1298
|
+
translate(config.x, config.y);
|
|
1083
1299
|
noFill();
|
|
1084
|
-
strokeWeight(
|
|
1085
|
-
stroke(
|
|
1300
|
+
strokeWeight(config.strokeWeight);
|
|
1301
|
+
stroke(config.stroke);
|
|
1086
1302
|
beginShape();
|
|
1087
|
-
for(var i = domain[0] /
|
|
1088
|
-
vertex(i, -Chalkboard.calc.correlation(func_1, func_2, i *
|
|
1303
|
+
for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i += config.res) {
|
|
1304
|
+
vertex(i, -Chalkboard.calc.correlation(func_1, func_2, i * config.size) / config.size);
|
|
1089
1305
|
data.push([i, Chalkboard.calc.correlation(func_1, func_2, i)]);
|
|
1090
1306
|
}
|
|
1091
1307
|
endShape();
|
|
1092
1308
|
popMatrix();
|
|
1093
1309
|
return data;
|
|
1094
1310
|
},
|
|
1095
|
-
autocorrelation: function(func,
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1311
|
+
autocorrelation: function(func, config) {
|
|
1312
|
+
(config = {
|
|
1313
|
+
x: (config = config || {}).x || width / 2,
|
|
1314
|
+
y: config.y || height / 2,
|
|
1315
|
+
size: config.size || 1,
|
|
1316
|
+
stroke: config.stroke || color(0),
|
|
1317
|
+
strokeWeight: config.strokeWeight || 2,
|
|
1318
|
+
domain: config.domain || [-10, 10],
|
|
1319
|
+
res: config.res || 25
|
|
1320
|
+
}).size /= 100;
|
|
1103
1321
|
var data = [];
|
|
1104
1322
|
pushMatrix();
|
|
1105
|
-
translate(
|
|
1323
|
+
translate(config.x, config.y);
|
|
1106
1324
|
noFill();
|
|
1107
|
-
strokeWeight(
|
|
1108
|
-
stroke(
|
|
1325
|
+
strokeWeight(config.strokeWeight);
|
|
1326
|
+
stroke(config.stroke);
|
|
1109
1327
|
beginShape();
|
|
1110
|
-
for(var i = domain[0] /
|
|
1111
|
-
vertex(i, -Chalkboard.calc.autocorrelation(func, i *
|
|
1328
|
+
for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i += config.res) {
|
|
1329
|
+
vertex(i, -Chalkboard.calc.autocorrelation(func, i * config.size) / config.size);
|
|
1112
1330
|
data.push([i, Chalkboard.calc.autocorrelation(func, i)]);
|
|
1113
1331
|
}
|
|
1114
1332
|
endShape();
|
|
1115
1333
|
popMatrix();
|
|
1116
1334
|
return data;
|
|
1117
1335
|
},
|
|
1118
|
-
Taylor: function(func, n, a,
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1336
|
+
Taylor: function(func, n, a, config) {
|
|
1337
|
+
(config = {
|
|
1338
|
+
x: (config = config || {}).x || width / 2,
|
|
1339
|
+
y: config.y || height / 2,
|
|
1340
|
+
size: config.size || 1,
|
|
1341
|
+
stroke: config.stroke || color(0),
|
|
1342
|
+
strokeWeight: config.strokeWeight || 2,
|
|
1343
|
+
domain: config.domain || [-10, 10],
|
|
1344
|
+
res: config.res || 25
|
|
1345
|
+
}).size /= 100;
|
|
1126
1346
|
var data = [];
|
|
1127
1347
|
pushMatrix();
|
|
1128
|
-
translate(
|
|
1348
|
+
translate(config.x, config.y);
|
|
1129
1349
|
noFill();
|
|
1130
|
-
strokeWeight(
|
|
1131
|
-
stroke(
|
|
1350
|
+
strokeWeight(config.strokeWeight);
|
|
1351
|
+
stroke(config.stroke);
|
|
1132
1352
|
beginShape();
|
|
1133
|
-
for(var i = domain[0] /
|
|
1134
|
-
vertex(i, -Chalkboard.calc.Taylor(func, i *
|
|
1353
|
+
for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i += config.res) {
|
|
1354
|
+
vertex(i, -Chalkboard.calc.Taylor(func, i * config.size, n, a) / config.size);
|
|
1135
1355
|
data.push([i, Chalkboard.calc.Taylor(func, i, n, a)]);
|
|
1136
1356
|
}
|
|
1137
1357
|
endShape();
|
|
1138
1358
|
popMatrix();
|
|
1139
1359
|
return data;
|
|
1140
1360
|
},
|
|
1141
|
-
Laplace: function(func,
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1361
|
+
Laplace: function(func, config) {
|
|
1362
|
+
(config = {
|
|
1363
|
+
x: (config = config || {}).x || width / 2,
|
|
1364
|
+
y: config.y || height / 2,
|
|
1365
|
+
size: config.size || 1,
|
|
1366
|
+
stroke: config.stroke || color(0),
|
|
1367
|
+
strokeWeight: config.strokeWeight || 2,
|
|
1368
|
+
domain: config.domain || [-10, 10],
|
|
1369
|
+
res: config.res || 25
|
|
1370
|
+
}).size /= 100;
|
|
1149
1371
|
var data = [];
|
|
1150
1372
|
pushMatrix();
|
|
1151
|
-
translate(
|
|
1373
|
+
translate(config.x, config.y);
|
|
1152
1374
|
noFill();
|
|
1153
|
-
strokeWeight(
|
|
1154
|
-
stroke(
|
|
1375
|
+
strokeWeight(config.strokeWeight);
|
|
1376
|
+
stroke(config.stroke);
|
|
1155
1377
|
beginShape();
|
|
1156
|
-
if(domain[0] >= 0) {
|
|
1157
|
-
for(var i = domain[0] /
|
|
1158
|
-
vertex(i, -Chalkboard.calc.Laplace(func, i *
|
|
1378
|
+
if(config.domain[0] >= 0) {
|
|
1379
|
+
for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i += config.res) {
|
|
1380
|
+
vertex(i, -Chalkboard.calc.Laplace(func, i * config.size) / config.size);
|
|
1159
1381
|
data.push([i, Chalkboard.calc.Laplace(func, i)]);
|
|
1160
1382
|
}
|
|
1161
1383
|
} else {
|
|
1162
|
-
for(var i = 0; i <= domain[1] /
|
|
1163
|
-
vertex(i, -Chalkboard.calc.Laplace(func, i *
|
|
1384
|
+
for(var i = 0; i <= config.domain[1] / config.size; i += config.res) {
|
|
1385
|
+
vertex(i, -Chalkboard.calc.Laplace(func, i * config.size) / config.size);
|
|
1164
1386
|
data.push([i, Chalkboard.calc.Laplace(func, i)]);
|
|
1165
1387
|
}
|
|
1166
1388
|
}
|
|
@@ -1168,23 +1390,25 @@ var Chalkboard = {
|
|
|
1168
1390
|
popMatrix();
|
|
1169
1391
|
return data;
|
|
1170
1392
|
},
|
|
1171
|
-
Fourier: function(func,
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1393
|
+
Fourier: function(func, config) {
|
|
1394
|
+
(config = {
|
|
1395
|
+
x: (config = config || {}).x || width / 2,
|
|
1396
|
+
y: config.y || height / 2,
|
|
1397
|
+
size: config.size || 1,
|
|
1398
|
+
stroke: config.stroke || color(0),
|
|
1399
|
+
strokeWeight: config.strokeWeight || 2,
|
|
1400
|
+
domain: config.domain || [-10, 10],
|
|
1401
|
+
res: config.res || 25
|
|
1402
|
+
}).size /= 100;
|
|
1179
1403
|
var data = [];
|
|
1180
1404
|
pushMatrix();
|
|
1181
|
-
translate(
|
|
1405
|
+
translate(config.x, config.y);
|
|
1182
1406
|
noFill();
|
|
1183
|
-
strokeWeight(
|
|
1184
|
-
stroke(
|
|
1407
|
+
strokeWeight(config.strokeWeight);
|
|
1408
|
+
stroke(config.stroke);
|
|
1185
1409
|
beginShape();
|
|
1186
|
-
for(var i = domain[0] /
|
|
1187
|
-
vertex(i, -Chalkboard.calc.Fourier(func, i *
|
|
1410
|
+
for(var i = config.domain[0] / config.size; i <= config.domain[1] / config.size; i += config.res) {
|
|
1411
|
+
vertex(i, -Chalkboard.calc.Fourier(func, i * config.size) / config.size);
|
|
1188
1412
|
data.push([i, Chalkboard.calc.Fourier(func, i)]);
|
|
1189
1413
|
}
|
|
1190
1414
|
endShape();
|
|
@@ -1516,6 +1740,16 @@ var Chalkboard = {
|
|
|
1516
1740
|
}
|
|
1517
1741
|
return result;
|
|
1518
1742
|
},
|
|
1743
|
+
shuffle: function(arr) {
|
|
1744
|
+
var index, temp, rindex;
|
|
1745
|
+
for(index = arr.length - 1; index > 0; index--) {
|
|
1746
|
+
rindex = Math.floor(Chalkboard.numb.random(0, index + 1));
|
|
1747
|
+
temp = arr[index];
|
|
1748
|
+
arr[index] = arr[rindex];
|
|
1749
|
+
arr[rindex] = temp;
|
|
1750
|
+
}
|
|
1751
|
+
return arr;
|
|
1752
|
+
},
|
|
1519
1753
|
norm: function(arr, type) {
|
|
1520
1754
|
type = type || "L2";
|
|
1521
1755
|
var result = 0;
|
|
@@ -1589,7 +1823,7 @@ var Chalkboard = {
|
|
|
1589
1823
|
},
|
|
1590
1824
|
eq: function(arr, arrORnum) {
|
|
1591
1825
|
var result = [];
|
|
1592
|
-
if(arrORnum
|
|
1826
|
+
if(Array.isArray(arrORnum)) {
|
|
1593
1827
|
if(arr.length === arrORnum.length) {
|
|
1594
1828
|
for(var i = 0; i < arr.length; i++) {
|
|
1595
1829
|
if(arr[i] === arrORnum[i]) {
|
|
@@ -1610,7 +1844,7 @@ var Chalkboard = {
|
|
|
1610
1844
|
includeInf = includeInf || false;
|
|
1611
1845
|
includeSup = includeSup || false;
|
|
1612
1846
|
var result = [];
|
|
1613
|
-
if(inf
|
|
1847
|
+
if(Array.isArray(inf) && Array.isArray(sup)) {
|
|
1614
1848
|
if(arr.length === inf.length && arr.length === sup.length) {
|
|
1615
1849
|
for(var i = 0; i < arr.length; i++) {
|
|
1616
1850
|
if(includeInf) {
|
|
@@ -1666,7 +1900,7 @@ var Chalkboard = {
|
|
|
1666
1900
|
lt: function(arr, arrORnum, includeEnd) {
|
|
1667
1901
|
includeEnd = includeEnd || false;
|
|
1668
1902
|
var result = [];
|
|
1669
|
-
if(arrORnum
|
|
1903
|
+
if(Array.isArray(arrORnum)) {
|
|
1670
1904
|
if(arr.length === arrORnum.length) {
|
|
1671
1905
|
for(var i = 0; i < arr.length; i++) {
|
|
1672
1906
|
if(includeEnd) {
|
|
@@ -1698,7 +1932,7 @@ var Chalkboard = {
|
|
|
1698
1932
|
gt: function(arr, arrORnum, includeEnd) {
|
|
1699
1933
|
includeEnd = includeEnd || false;
|
|
1700
1934
|
var result = [];
|
|
1701
|
-
if(arrORnum
|
|
1935
|
+
if(Array.isArray(arrORnum)) {
|
|
1702
1936
|
if(arr.length === arrORnum.length) {
|
|
1703
1937
|
for(var i = 0; i < arr.length; i++) {
|
|
1704
1938
|
if(includeEnd) {
|
|
@@ -1727,6 +1961,23 @@ var Chalkboard = {
|
|
|
1727
1961
|
}
|
|
1728
1962
|
return result;
|
|
1729
1963
|
},
|
|
1964
|
+
subsets: function(arr) {
|
|
1965
|
+
var result = [[]];
|
|
1966
|
+
arr.sort();
|
|
1967
|
+
for(var i = 0; i < arr.length; i++) {
|
|
1968
|
+
if(i === 0 || arr[i] !== arr[i - 1]) {
|
|
1969
|
+
var curr = arr[i];
|
|
1970
|
+
var subsetsWithCurr = [];
|
|
1971
|
+
for(var j = 0; j < result.length; j++) {
|
|
1972
|
+
var subset = result[j].slice();
|
|
1973
|
+
subset.push(curr);
|
|
1974
|
+
subsetsWithCurr.push(subset);
|
|
1975
|
+
}
|
|
1976
|
+
result = result.concat(subsetsWithCurr);
|
|
1977
|
+
}
|
|
1978
|
+
}
|
|
1979
|
+
return result;
|
|
1980
|
+
},
|
|
1730
1981
|
max: function(arr) {
|
|
1731
1982
|
var max = arr[0];
|
|
1732
1983
|
for(var i = 0; i < arr.length; i++) {
|
|
@@ -1760,7 +2011,7 @@ var Chalkboard = {
|
|
|
1760
2011
|
for(var i = 0; i < arr.length; i++) {
|
|
1761
2012
|
result *= arr[i];
|
|
1762
2013
|
}
|
|
1763
|
-
return Chalkboard.real.
|
|
2014
|
+
return Chalkboard.real.root(Math.abs(result), arr.length);
|
|
1764
2015
|
} else if(type === "harmonic") {
|
|
1765
2016
|
for(var i = 0; i < arr.length; i++) {
|
|
1766
2017
|
result += 1 / arr[i];
|
|
@@ -1925,13 +2176,93 @@ var Chalkboard = {
|
|
|
1925
2176
|
Gaussian: function(height, mean, deviation) {
|
|
1926
2177
|
return Chalkboard.real.function(height.toString() + " * Math.exp(-((x - " + mean.toString() + ") * (x - " + mean.toString() + ")) / (2 * " + deviation.toString() + " * " + deviation.toString() + "))");
|
|
1927
2178
|
},
|
|
1928
|
-
|
|
2179
|
+
regression: function(data, type, degree) {
|
|
2180
|
+
type = type || "linear";
|
|
2181
|
+
degree = degree || 2;
|
|
2182
|
+
if(type === "linear") {
|
|
2183
|
+
var x = 0, y = 0;
|
|
2184
|
+
var xx = 0, xy = 0;
|
|
2185
|
+
for(var i = 0; i < data.length; i++) {
|
|
2186
|
+
x += data[i][0];
|
|
2187
|
+
y += data[i][1];
|
|
2188
|
+
xx += data[i][0] * data[i][0];
|
|
2189
|
+
xy += data[i][0] * data[i][1];
|
|
2190
|
+
}
|
|
2191
|
+
var a = (data.length * xy - x * y) / (data.length * xx - x * x),
|
|
2192
|
+
b = (y / data.length) - (a * x) / data.length;
|
|
2193
|
+
return Chalkboard.real.function(a + " * x + " + b);
|
|
2194
|
+
} else if(type === "polynomial") {
|
|
2195
|
+
var A = Chalkboard.matr.new();
|
|
2196
|
+
for(var i = 0; i < data.length; i++) {
|
|
2197
|
+
A.push([]);
|
|
2198
|
+
for(var j = 0; j <= degree; j++) {
|
|
2199
|
+
A[i].push(Chalkboard.real.pow(data[i][0], j));
|
|
2200
|
+
}
|
|
2201
|
+
}
|
|
2202
|
+
var AT = Chalkboard.matr.transpose(A);
|
|
2203
|
+
var B = Chalkboard.matr.new();
|
|
2204
|
+
for(var i = 0; i < data.length; i++) {
|
|
2205
|
+
B.push([data[i][1]]);
|
|
2206
|
+
}
|
|
2207
|
+
var ATA = Chalkboard.matr.mul(AT, A);
|
|
2208
|
+
var ATAI = Chalkboard.matr.invert(ATA);
|
|
2209
|
+
var x = Chalkboard.matr.mul(Chalkboard.matr.mul(ATAI, AT), B);
|
|
2210
|
+
var coeff = [];
|
|
2211
|
+
for(var i = 0; i < x.length; i++) {
|
|
2212
|
+
coeff.push(x[i][0]);
|
|
2213
|
+
}
|
|
2214
|
+
var f = coeff[0].toString() + " + " + coeff[1].toString() + " * x";
|
|
2215
|
+
for(var i = 2; i <= degree; i++) {
|
|
2216
|
+
f += " + " + coeff[i].toString() + " * Math.pow(x, " + i + ")";
|
|
2217
|
+
}
|
|
2218
|
+
return Chalkboard.real.function(f);
|
|
2219
|
+
} else if(type === "power") {
|
|
2220
|
+
var arr = [0, 0, 0, 0];
|
|
2221
|
+
for(var i = 0; i < data.length; i++) {
|
|
2222
|
+
arr[0] += Chalkboard.real.ln(data[i][0]);
|
|
2223
|
+
arr[1] += data[i][1] * Chalkboard.real.ln(data[i][0]);
|
|
2224
|
+
arr[2] += data[i][1];
|
|
2225
|
+
arr[3] += Chalkboard.real.ln(data[i][0]) * Chalkboard.real.ln(data[i][0]);
|
|
2226
|
+
}
|
|
2227
|
+
var a = Chalkboard.E((arr[2] - ((data.length * arr[1] - arr[2] * arr[0]) / (data.length * arr[3] - arr[0] * arr[0])) * arr[0]) / data.length),
|
|
2228
|
+
b = (data.length * arr[1] - arr[2] * arr[0]) / (data.length * arr[3] - arr[0] * arr[0]);
|
|
2229
|
+
return Chalkboard.real.function(a + " * Math.pow(x, " + b + ")");
|
|
2230
|
+
} else if(type === "exponential") {
|
|
2231
|
+
var arr = [0, 0, 0, 0, 0, 0];
|
|
2232
|
+
for(var i = 0; i < data.length; i++) {
|
|
2233
|
+
arr[0] += data[i][0];
|
|
2234
|
+
arr[1] += data[i][1];
|
|
2235
|
+
arr[2] += data[i][0] * data[i][0] * data[i][1];
|
|
2236
|
+
arr[3] += data[i][1] * Chalkboard.real.ln(data[i][1]);
|
|
2237
|
+
arr[4] += data[i][0] & data[i][1] * Chalkboard.real.ln(data[i][1]);
|
|
2238
|
+
arr[5] += data[i][0] * data[i][1];
|
|
2239
|
+
}
|
|
2240
|
+
var a = Chalkboard.E((arr[2] * arr[3] - arr[5] * arr[4]) / (arr[1] * arr[2] - arr[5] * arr[5])),
|
|
2241
|
+
b = (arr[1] * arr[4] - arr[5] * arr[3]) / (arr[1] * arr[2] - arr[5] * arr[5]);
|
|
2242
|
+
return Chalkboard.real.function(a + "* Math.exp(" + b + " * x)");
|
|
2243
|
+
} else if(type === "logarithmic") {
|
|
2244
|
+
var arr = [0, 0, 0, 0];
|
|
2245
|
+
for(var i = 0; i < data.length; i++) {
|
|
2246
|
+
arr[0] += Chalkboard.real.ln(data[i][0]);
|
|
2247
|
+
arr[1] += data[i][1] * Chalkboard.real.ln(data[i][0]);
|
|
2248
|
+
arr[2] += data[i][1];
|
|
2249
|
+
arr[3] += Chalkboard.real.ln(data[i][0]) * Chalkboard.real.ln(data[i][0]);
|
|
2250
|
+
}
|
|
2251
|
+
var a = (arr[2] - ((data.length * arr[1] - arr[2] * arr[0]) / (data.length * arr[3] - arr[0] * arr[0])) * arr[0]) / data.length,
|
|
2252
|
+
b = (data.length * arr[1] - arr[2] * arr[0]) / (data.length * arr[3] - arr[0] * arr[0]);
|
|
2253
|
+
return Chalkboard.real.function(a + " + " + b + " * Math.log(x)");
|
|
2254
|
+
} else {
|
|
2255
|
+
return "TypeError: Parameter \"type\" must be either \"linear\", \"polynomial\", \"power\", \"exponential\", or \"logarithmic\".";
|
|
2256
|
+
}
|
|
2257
|
+
},
|
|
2258
|
+
toVector: function(arr, type, index) {
|
|
2259
|
+
if(index === undefined) { index = 0; }
|
|
1929
2260
|
if(type === "vec2") {
|
|
1930
|
-
return Chalkboard.vec2.new(arr[
|
|
2261
|
+
return Chalkboard.vec2.new(arr[index], arr[index + 1]);
|
|
1931
2262
|
} else if(type === "vec3") {
|
|
1932
|
-
return Chalkboard.vec3.new(arr[
|
|
2263
|
+
return Chalkboard.vec3.new(arr[index], arr[index + 1], arr[index + 2]);
|
|
1933
2264
|
} else if(type === "vec4") {
|
|
1934
|
-
return Chalkboard.vec4.new(arr[
|
|
2265
|
+
return Chalkboard.vec4.new(arr[index], arr[index + 1], arr[index + 2], arr[index + 3]);
|
|
1935
2266
|
} else {
|
|
1936
2267
|
return "TypeError: Parameter \"type\" should be \"vec2\", \"vec3\", or \"vec4\".";
|
|
1937
2268
|
}
|
|
@@ -1952,6 +2283,12 @@ var Chalkboard = {
|
|
|
1952
2283
|
}
|
|
1953
2284
|
return result;
|
|
1954
2285
|
},
|
|
2286
|
+
toTensor: function(arr, size) {
|
|
2287
|
+
if(!Array.isArray(size)) {
|
|
2288
|
+
size = Array.from(arguments).slice(1);
|
|
2289
|
+
}
|
|
2290
|
+
return Chalkboard.tens.resize(arr, size);
|
|
2291
|
+
},
|
|
1955
2292
|
toObject: function(arr) {
|
|
1956
2293
|
var result = {};
|
|
1957
2294
|
for(var i = 0; i < arr.length; i++) {
|
|
@@ -1974,6 +2311,9 @@ var Chalkboard = {
|
|
|
1974
2311
|
return {x: x, y: y, type: "vec2"};
|
|
1975
2312
|
}
|
|
1976
2313
|
},
|
|
2314
|
+
copy: function(vec2) {
|
|
2315
|
+
return Object.create(Object.getPrototypeOf(vec2), Object.getOwnPropertyDescriptors(vec2));
|
|
2316
|
+
},
|
|
1977
2317
|
random: function(inf, sup) {
|
|
1978
2318
|
return Chalkboard.vec2.new(Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup));
|
|
1979
2319
|
},
|
|
@@ -2118,6 +2458,9 @@ var Chalkboard = {
|
|
|
2118
2458
|
return {x: x, y: y, z: z, type: "vec3"};
|
|
2119
2459
|
}
|
|
2120
2460
|
},
|
|
2461
|
+
copy: function(vec3) {
|
|
2462
|
+
return Object.create(Object.getPrototypeOf(vec3), Object.getOwnPropertyDescriptors(vec3));
|
|
2463
|
+
},
|
|
2121
2464
|
random: function(inf, sup) {
|
|
2122
2465
|
return Chalkboard.vec3.new(Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup));
|
|
2123
2466
|
},
|
|
@@ -2269,6 +2612,9 @@ var Chalkboard = {
|
|
|
2269
2612
|
return {x: x, y: y, z: z, w: w, type: "vec4"};
|
|
2270
2613
|
}
|
|
2271
2614
|
},
|
|
2615
|
+
copy: function(vec4) {
|
|
2616
|
+
return Object.create(Object.getPrototypeOf(vec4), Object.getOwnPropertyDescriptors(vec4));
|
|
2617
|
+
},
|
|
2272
2618
|
random: function(inf, sup) {
|
|
2273
2619
|
return Chalkboard.vec4.new(Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup));
|
|
2274
2620
|
},
|
|
@@ -2403,7 +2749,23 @@ var Chalkboard = {
|
|
|
2403
2749
|
},
|
|
2404
2750
|
matr: {
|
|
2405
2751
|
new: function(matrix) {
|
|
2406
|
-
|
|
2752
|
+
if(arguments.length === 0) {
|
|
2753
|
+
return [];
|
|
2754
|
+
} else if(Array.isArray(matrix) && Array.isArray(matrix[0])) {
|
|
2755
|
+
return matrix;
|
|
2756
|
+
} else {
|
|
2757
|
+
return Array.from(arguments);
|
|
2758
|
+
}
|
|
2759
|
+
},
|
|
2760
|
+
copy: function(matr) {
|
|
2761
|
+
var result = Chalkboard.matr.new();
|
|
2762
|
+
for(var i = 0; i < Chalkboard.matr.rows(matr); i++) {
|
|
2763
|
+
result.push([]);
|
|
2764
|
+
for(var j = 0; j < Chalkboard.matr.cols(matr); j++) {
|
|
2765
|
+
result[i].push(matr[i][j]);
|
|
2766
|
+
}
|
|
2767
|
+
}
|
|
2768
|
+
return result;
|
|
2407
2769
|
},
|
|
2408
2770
|
rows: function(matr) {
|
|
2409
2771
|
return matr.length;
|
|
@@ -2411,12 +2773,75 @@ var Chalkboard = {
|
|
|
2411
2773
|
cols: function(matr) {
|
|
2412
2774
|
return matr[0].length;
|
|
2413
2775
|
},
|
|
2414
|
-
|
|
2415
|
-
if(
|
|
2776
|
+
resize: function(matr, rows, cols) {
|
|
2777
|
+
if(cols === undefined) {
|
|
2778
|
+
cols = rows;
|
|
2779
|
+
}
|
|
2780
|
+
var result = Chalkboard.matr.new();
|
|
2781
|
+
var flat = Chalkboard.matr.toArray(matr);
|
|
2782
|
+
var index = 0;
|
|
2783
|
+
for(var i = 0; i < rows; i++) {
|
|
2784
|
+
result.push([]);
|
|
2785
|
+
for(var j = 0; j < cols; j++) {
|
|
2786
|
+
result[i].push(index < flat.length ? flat[index++] : 0);
|
|
2787
|
+
}
|
|
2788
|
+
}
|
|
2789
|
+
return result;
|
|
2790
|
+
},
|
|
2791
|
+
push: function(matr, type, rowORcol, elements) {
|
|
2792
|
+
rowORcol -= 1;
|
|
2793
|
+
if(type === "row") {
|
|
2794
|
+
matr.splice(rowORcol, 0, elements);
|
|
2795
|
+
return matr;
|
|
2796
|
+
} else if(type === "col") {
|
|
2797
|
+
for(var i = 0; i < Chalkboard.matr.rows(matr); i++) {
|
|
2798
|
+
matr[i].splice(rowORcol, 0, elements[i]);
|
|
2799
|
+
}
|
|
2800
|
+
return matr;
|
|
2801
|
+
} else {
|
|
2802
|
+
return "TypeError: Parameter \"type\" must be either \"row\" or \"col\".";
|
|
2803
|
+
}
|
|
2804
|
+
},
|
|
2805
|
+
pull: function(matr, type, rowORcol) {
|
|
2806
|
+
rowORcol -= 1;
|
|
2807
|
+
if(type === "row") {
|
|
2808
|
+
matr.splice(rowORcol, 1);
|
|
2809
|
+
return matr;
|
|
2810
|
+
} else if(type === "col") {
|
|
2811
|
+
for(var i = 0; i < Chalkboard.matr.rows(matr); i++) {
|
|
2812
|
+
matr[i].splice(rowORcol, 1);
|
|
2813
|
+
}
|
|
2814
|
+
return matr;
|
|
2815
|
+
} else {
|
|
2816
|
+
return "TypeError: Parameter \"type\" must be either \"row\" or \"col\".";
|
|
2817
|
+
}
|
|
2818
|
+
},
|
|
2819
|
+
fill: function(element, rows, cols) {
|
|
2820
|
+
if(cols === undefined) {
|
|
2821
|
+
cols = rows;
|
|
2822
|
+
}
|
|
2823
|
+
if(Number.isInteger(rows) && Number.isInteger(cols) && rows > 0 && cols > 0) {
|
|
2416
2824
|
var result = Chalkboard.matr.new();
|
|
2417
|
-
for(var i = 0; i <
|
|
2825
|
+
for(var i = 0; i < rows; i++) {
|
|
2418
2826
|
result.push([]);
|
|
2419
|
-
for(var j = 0; j <
|
|
2827
|
+
for(var j = 0; j < cols; j++) {
|
|
2828
|
+
result[i].push(element);
|
|
2829
|
+
}
|
|
2830
|
+
}
|
|
2831
|
+
return result;
|
|
2832
|
+
} else {
|
|
2833
|
+
return undefined;
|
|
2834
|
+
}
|
|
2835
|
+
},
|
|
2836
|
+
empty: function(rows, cols) {
|
|
2837
|
+
if(cols === undefined) {
|
|
2838
|
+
cols = rows;
|
|
2839
|
+
}
|
|
2840
|
+
if(Number.isInteger(rows) && Number.isInteger(cols) && rows > 0 && cols > 0) {
|
|
2841
|
+
var result = Chalkboard.matr.new();
|
|
2842
|
+
for(var i = 0; i < rows; i++) {
|
|
2843
|
+
result.push([]);
|
|
2844
|
+
for(var j = 0; j < cols; j++) {
|
|
2420
2845
|
result[i].push(null);
|
|
2421
2846
|
}
|
|
2422
2847
|
}
|
|
@@ -2425,11 +2850,11 @@ var Chalkboard = {
|
|
|
2425
2850
|
return undefined;
|
|
2426
2851
|
}
|
|
2427
2852
|
},
|
|
2428
|
-
identity: function(
|
|
2429
|
-
if(Number.isInteger(
|
|
2853
|
+
identity: function(size) {
|
|
2854
|
+
if(Number.isInteger(size) && size > 0) {
|
|
2430
2855
|
var result = Chalkboard.matr.new();
|
|
2431
|
-
for(var i = 0; i <
|
|
2432
|
-
result.push(Array(
|
|
2856
|
+
for(var i = 0; i < size; i++) {
|
|
2857
|
+
result.push(Array(size).fill(0));
|
|
2433
2858
|
result[i][i] = 1;
|
|
2434
2859
|
}
|
|
2435
2860
|
return result;
|
|
@@ -2437,14 +2862,30 @@ var Chalkboard = {
|
|
|
2437
2862
|
return undefined;
|
|
2438
2863
|
}
|
|
2439
2864
|
},
|
|
2440
|
-
|
|
2441
|
-
if(Number.isInteger(
|
|
2442
|
-
|
|
2443
|
-
|
|
2865
|
+
exchange: function(size) {
|
|
2866
|
+
if(Number.isInteger(size) && size > 0) {
|
|
2867
|
+
var result = Chalkboard.matr.fill(0, size, size);
|
|
2868
|
+
for(var i = 0; i < size; i++) {
|
|
2869
|
+
for(var j = 0; j < size; j++) {
|
|
2870
|
+
if(i + j === size - 1) {
|
|
2871
|
+
result[i][j] = 1;
|
|
2872
|
+
}
|
|
2873
|
+
}
|
|
2874
|
+
}
|
|
2875
|
+
return result;
|
|
2876
|
+
} else {
|
|
2877
|
+
return undefined;
|
|
2878
|
+
}
|
|
2879
|
+
},
|
|
2880
|
+
random: function(inf, sup, rows, cols) {
|
|
2881
|
+
if(cols === undefined) {
|
|
2882
|
+
cols = rows;
|
|
2883
|
+
}
|
|
2884
|
+
if(Number.isInteger(rows) && Number.isInteger(cols) && rows > 0 && cols > 0) {
|
|
2444
2885
|
var result = Chalkboard.matr.new();
|
|
2445
|
-
for(var i = 0; i <
|
|
2886
|
+
for(var i = 0; i < rows; i++) {
|
|
2446
2887
|
result.push([]);
|
|
2447
|
-
for(var j = 0; j <
|
|
2888
|
+
for(var j = 0; j < cols; j++) {
|
|
2448
2889
|
result[i].push(Chalkboard.numb.random(inf, sup));
|
|
2449
2890
|
}
|
|
2450
2891
|
}
|
|
@@ -2453,8 +2894,75 @@ var Chalkboard = {
|
|
|
2453
2894
|
return undefined;
|
|
2454
2895
|
}
|
|
2455
2896
|
},
|
|
2897
|
+
shift: function(size, shiftAmount) {
|
|
2898
|
+
shiftAmount = shiftAmount || 1;
|
|
2899
|
+
if(Number.isInteger(size) && size > 0) {
|
|
2900
|
+
var result = Chalkboard.matr.fill(0, size, size);
|
|
2901
|
+
for(var i = 0; i < size; i++) {
|
|
2902
|
+
for(var j = 0; j < size; j++) {
|
|
2903
|
+
result[i][j] = Chalkboard.numb.Kronecker(i + shiftAmount, j);
|
|
2904
|
+
}
|
|
2905
|
+
}
|
|
2906
|
+
return result;
|
|
2907
|
+
} else {
|
|
2908
|
+
return undefined;
|
|
2909
|
+
}
|
|
2910
|
+
},
|
|
2911
|
+
binomial: function(size, type) {
|
|
2912
|
+
type = type || "lower";
|
|
2913
|
+
if(Number.isInteger(size) && size > 0) {
|
|
2914
|
+
var result = Chalkboard.matr.new();
|
|
2915
|
+
for(var i = 0; i < size; i++) {
|
|
2916
|
+
result.push([]);
|
|
2917
|
+
for(var j = 0; j < size; j++) {
|
|
2918
|
+
if(type === "lower") {
|
|
2919
|
+
result[i].push(Chalkboard.numb.binomial(i, j));
|
|
2920
|
+
} else if(type === "upper") {
|
|
2921
|
+
result[i].push(Chalkboard.numb.binomial(j, i));
|
|
2922
|
+
}
|
|
2923
|
+
}
|
|
2924
|
+
}
|
|
2925
|
+
if(type === "symmetric") {
|
|
2926
|
+
return Chalkboard.matr.mul(Chalkboard.matr.binomial(size, "lower"), Chalkboard.matr.binomial(size, "upper"));
|
|
2927
|
+
} else if(type !== "lower" && type !== "upper") {
|
|
2928
|
+
return "TypeError: Parameter \"type\" must be either \"lower\", \"upper\", or \"symmetric\".";
|
|
2929
|
+
} else {
|
|
2930
|
+
return result;
|
|
2931
|
+
}
|
|
2932
|
+
} else {
|
|
2933
|
+
return undefined;
|
|
2934
|
+
}
|
|
2935
|
+
},
|
|
2936
|
+
Hilbert: function(size) {
|
|
2937
|
+
if(Number.isInteger(size) && size > 0) {
|
|
2938
|
+
var result = Chalkboard.matr.new();
|
|
2939
|
+
for(var i = 0; i < size; i++) {
|
|
2940
|
+
result.push([]);
|
|
2941
|
+
for(var j = 0; j < size; j++) {
|
|
2942
|
+
result[i].push(1 / (i + j + 1));
|
|
2943
|
+
}
|
|
2944
|
+
}
|
|
2945
|
+
return result;
|
|
2946
|
+
} else {
|
|
2947
|
+
return undefined;
|
|
2948
|
+
}
|
|
2949
|
+
},
|
|
2950
|
+
Lehmer: function(size) {
|
|
2951
|
+
if(Number.isInteger(size) && size > 0) {
|
|
2952
|
+
var result = Chalkboard.matr.new();
|
|
2953
|
+
for(var i = 0; i < size; i++) {
|
|
2954
|
+
result.push([]);
|
|
2955
|
+
for(var j = 0; j < size; j++) {
|
|
2956
|
+
result[i].push(Math.min(i + 1, j + 1) / Math.max(i + 1, j + 1));
|
|
2957
|
+
}
|
|
2958
|
+
}
|
|
2959
|
+
return result;
|
|
2960
|
+
} else {
|
|
2961
|
+
return undefined;
|
|
2962
|
+
}
|
|
2963
|
+
},
|
|
2456
2964
|
cofactor: function(matr, row, col) {
|
|
2457
|
-
return matr.slice(0, row - 1).concat(matr.slice(row)).map(function
|
|
2965
|
+
return matr.slice(0, row - 1).concat(matr.slice(row)).map(function(row) {
|
|
2458
2966
|
return row.slice(0, col - 1).concat(row.slice(col));
|
|
2459
2967
|
});
|
|
2460
2968
|
},
|
|
@@ -2491,15 +2999,15 @@ var Chalkboard = {
|
|
|
2491
2999
|
}
|
|
2492
3000
|
},
|
|
2493
3001
|
rank: function(matr) {
|
|
2494
|
-
return Chalkboard.matr.reduce(matr).filter(function
|
|
2495
|
-
return row.some(function
|
|
3002
|
+
return Chalkboard.matr.reduce(matr).filter(function(row) {
|
|
3003
|
+
return row.some(function(element) {
|
|
2496
3004
|
return element !== 0;
|
|
2497
3005
|
});
|
|
2498
3006
|
}).length;
|
|
2499
3007
|
},
|
|
2500
3008
|
rowspace: function(matr) {
|
|
2501
|
-
return Chalkboard.matr.reduce(matr).filter(function
|
|
2502
|
-
return row.some(function
|
|
3009
|
+
return Chalkboard.matr.reduce(matr).filter(function(row) {
|
|
3010
|
+
return row.some(function(element) {
|
|
2503
3011
|
return element !== 0;
|
|
2504
3012
|
});
|
|
2505
3013
|
});
|
|
@@ -2508,15 +3016,15 @@ var Chalkboard = {
|
|
|
2508
3016
|
return Chalkboard.matr.transpose(Chalkboard.matr.rowspace(Chalkboard.matr.transpose(matr)));
|
|
2509
3017
|
},
|
|
2510
3018
|
nullspace: function(matr) {
|
|
2511
|
-
var augmented = matr.map(function
|
|
3019
|
+
var augmented = matr.map(function(row) {
|
|
2512
3020
|
return row.slice().concat(Array(Chalkboard.matr.rows(matr)).fill(0));
|
|
2513
3021
|
});
|
|
2514
3022
|
var reduced = Chalkboard.matr.reduce(augmented);
|
|
2515
|
-
return reduced.filter(function
|
|
2516
|
-
return row.slice(0, Chalkboard.matr.rows(matr)).every(function
|
|
3023
|
+
return reduced.filter(function(row) {
|
|
3024
|
+
return row.slice(0, Chalkboard.matr.rows(matr)).every(function(element) {
|
|
2517
3025
|
return element === 0;
|
|
2518
3026
|
});
|
|
2519
|
-
}).map(function
|
|
3027
|
+
}).map(function(row) {
|
|
2520
3028
|
return row.slice(Chalkboard.matr.rows(matr));
|
|
2521
3029
|
});
|
|
2522
3030
|
},
|
|
@@ -2572,6 +3080,78 @@ var Chalkboard = {
|
|
|
2572
3080
|
return undefined;
|
|
2573
3081
|
}
|
|
2574
3082
|
},
|
|
3083
|
+
LUdecomp: function(matr) {
|
|
3084
|
+
if(Chalkboard.matr.rows(matr) === Chalkboard.matr.cols(matr)) {
|
|
3085
|
+
var L = Chalkboard.matr.identity(Chalkboard.matr.rows(matr)),
|
|
3086
|
+
U = Chalkboard.matr.fill(0, Chalkboard.matr.rows(matr));
|
|
3087
|
+
for(var j = 0; j < Chalkboard.matr.cols(matr); j++) {
|
|
3088
|
+
for(var i = 0; i <= j; i++) {
|
|
3089
|
+
var sum = 0;
|
|
3090
|
+
for(var k = 0; k < i; k++) {
|
|
3091
|
+
sum += L[i][k] * U[k][j];
|
|
3092
|
+
}
|
|
3093
|
+
U[i][j] = matr[i][j] - sum;
|
|
3094
|
+
}
|
|
3095
|
+
for(var i = j + 1; i < Chalkboard.matr.rows(matr); i++) {
|
|
3096
|
+
var sum = 0;
|
|
3097
|
+
for(var k = 0; k < j; k++) {
|
|
3098
|
+
sum += L[i][k] * U[k][j];
|
|
3099
|
+
}
|
|
3100
|
+
L[i][j] = (matr[i][j] - sum) / U[j][j];
|
|
3101
|
+
}
|
|
3102
|
+
}
|
|
3103
|
+
return {L: L, U: U};
|
|
3104
|
+
} else {
|
|
3105
|
+
return undefined;
|
|
3106
|
+
}
|
|
3107
|
+
},
|
|
3108
|
+
QRdecomp: function(matr) {
|
|
3109
|
+
var Q = Chalkboard.matr.identity(Chalkboard.matr.rows(matr)),
|
|
3110
|
+
R = Chalkboard.matr.copy(matr);
|
|
3111
|
+
for(var j = 0; j < Math.min(Chalkboard.matr.rows(matr), Chalkboard.matr.cols(matr)) - (Chalkboard.matr.rows(matr) > Chalkboard.matr.cols(matr) ? 0 : 1); j++) {
|
|
3112
|
+
var norm = 0;
|
|
3113
|
+
for(var i = j; i < Chalkboard.matr.rows(matr); i++) {
|
|
3114
|
+
norm += R[i][j] * R[i][j];
|
|
3115
|
+
}
|
|
3116
|
+
norm = Chalkboard.real.sqrt(norm);
|
|
3117
|
+
var v = [];
|
|
3118
|
+
v[0] = norm - R[j][j];
|
|
3119
|
+
var normalizer = v[0] * v[0];
|
|
3120
|
+
for(var i = 1; i < Chalkboard.matr.rows(matr) - j; i++) {
|
|
3121
|
+
v[i] = -R[i + j][j];
|
|
3122
|
+
normalizer += v[i] * v[i];
|
|
3123
|
+
}
|
|
3124
|
+
normalizer = 1 / Chalkboard.real.sqrt(normalizer);
|
|
3125
|
+
for(var i = 0; i < v.length; i++) {
|
|
3126
|
+
v[i] *= normalizer;
|
|
3127
|
+
}
|
|
3128
|
+
R[j][j] = norm;
|
|
3129
|
+
for(var i = j + 1; i < Chalkboard.matr.rows(R); i++) {
|
|
3130
|
+
R[i][j] = 0;
|
|
3131
|
+
}
|
|
3132
|
+
for(var k = j + 1; k < Chalkboard.matr.cols(R); k++) {
|
|
3133
|
+
var dot = 0;
|
|
3134
|
+
for(var i = 0; i < v.length; i++) {
|
|
3135
|
+
dot += v[i] * R[i + j][k];
|
|
3136
|
+
}
|
|
3137
|
+
dot *= 2;
|
|
3138
|
+
for(var i = 0; i < v.length; i++) {
|
|
3139
|
+
R[i + j][k] -= dot * v[i];
|
|
3140
|
+
}
|
|
3141
|
+
}
|
|
3142
|
+
for(var k = 0; k < Chalkboard.matr.cols(Q); k++) {
|
|
3143
|
+
var dot = 0;
|
|
3144
|
+
for(var i = 0; i < v.length; i++) {
|
|
3145
|
+
dot += v[i] * Q[k][i + j];
|
|
3146
|
+
}
|
|
3147
|
+
dot *= 2;
|
|
3148
|
+
for(var i = 0; i < v.length; i++) {
|
|
3149
|
+
Q[k][i + j] -= dot * v[i];
|
|
3150
|
+
}
|
|
3151
|
+
}
|
|
3152
|
+
}
|
|
3153
|
+
return {Q: Q, R: R};
|
|
3154
|
+
},
|
|
2575
3155
|
zero: function(matr) {
|
|
2576
3156
|
var result = Chalkboard.matr.new();
|
|
2577
3157
|
for(var i = 0; i < Chalkboard.matr.rows(matr); i++) {
|
|
@@ -2672,6 +3252,28 @@ var Chalkboard = {
|
|
|
2672
3252
|
}
|
|
2673
3253
|
return result;
|
|
2674
3254
|
},
|
|
3255
|
+
concat: function(matr_1, matr_2, type) {
|
|
3256
|
+
type = type || "row";
|
|
3257
|
+
if(type === "row") {
|
|
3258
|
+
if(Chalkboard.matr.rows(matr_1) === Chalkboard.matr.rows(matr_2)) {
|
|
3259
|
+
return Chalkboard.matr.new(matr_1.concat(matr_2));
|
|
3260
|
+
} else {
|
|
3261
|
+
return undefined;
|
|
3262
|
+
}
|
|
3263
|
+
} else if(type === "col") {
|
|
3264
|
+
if(Chalkboard.matr.cols(matr_1) === Chalkboard.matr.cols(matr_2)) {
|
|
3265
|
+
var result = Chalkboard.matr.new();
|
|
3266
|
+
for(var i = 0; i < Chalkboard.matr.rows(matr_1); i++) {
|
|
3267
|
+
result.push(matr_1[i].concat(matr_2[i]));
|
|
3268
|
+
}
|
|
3269
|
+
return result;
|
|
3270
|
+
} else {
|
|
3271
|
+
return undefined;
|
|
3272
|
+
}
|
|
3273
|
+
} else {
|
|
3274
|
+
return "TypeError: Parameter \"type\" should be either \"row\" or \"col\".";
|
|
3275
|
+
}
|
|
3276
|
+
},
|
|
2675
3277
|
add: function(matr_1, matr_2) {
|
|
2676
3278
|
if(Chalkboard.matr.rows(matr_1) === Chalkboard.matr.rows(matr_2) && Chalkboard.matr.cols(matr_1) === Chalkboard.matr.cols(matr_2)) {
|
|
2677
3279
|
var result = Chalkboard.matr.new();
|
|
@@ -2717,6 +3319,29 @@ var Chalkboard = {
|
|
|
2717
3319
|
return undefined;
|
|
2718
3320
|
}
|
|
2719
3321
|
},
|
|
3322
|
+
mulvec: function(matr, vec) {
|
|
3323
|
+
if(vec.type === "vec2") {
|
|
3324
|
+
if(Chalkboard.matr.rows(matr) === 2) {
|
|
3325
|
+
return Chalkboard.matr.toVector(Chalkboard.matr.mul(matr, Chalkboard.vec2.toMatrix(vec)), "vec2");
|
|
3326
|
+
} else {
|
|
3327
|
+
return Chalkboard.matr.mul(matr, Chalkboard.vec2.toMatrix(vec));
|
|
3328
|
+
}
|
|
3329
|
+
} else if(vec.type === "vec3") {
|
|
3330
|
+
if(Chalkboard.matr.rows(matr) === 3) {
|
|
3331
|
+
return Chalkboard.matr.toVector(Chalkboard.matr.mul(matr, Chalkboard.vec3.toMatrix(vec)), "vec3");
|
|
3332
|
+
} else {
|
|
3333
|
+
return Chalkboard.matr.mul(matr, Chalkboard.vec2.toMatrix(vec));
|
|
3334
|
+
}
|
|
3335
|
+
} else if(vec.type === "vec4") {
|
|
3336
|
+
if(Chalkboard.matr.rows(matr) === 4) {
|
|
3337
|
+
return Chalkboard.matr.toVector(Chalkboard.matr.mul(matr, Chalkboard.vec4.toMatrix(vec)), "vec4");
|
|
3338
|
+
} else {
|
|
3339
|
+
return Chalkboard.matr.mul(matr, Chalkboard.vec2.toMatrix(vec));
|
|
3340
|
+
}
|
|
3341
|
+
} else {
|
|
3342
|
+
return "TypeError: Parameter \"vec\" should be \"vec2\", \"vec3\", or \"vec4\".";
|
|
3343
|
+
}
|
|
3344
|
+
},
|
|
2720
3345
|
pow: function(matr, num) {
|
|
2721
3346
|
if(Chalkboard.matr.rows(matr) === Chalkboard.matr.cols(matr)) {
|
|
2722
3347
|
if(Number.isInteger(num) && num >= 0) {
|
|
@@ -2736,6 +3361,29 @@ var Chalkboard = {
|
|
|
2736
3361
|
return undefined;
|
|
2737
3362
|
}
|
|
2738
3363
|
},
|
|
3364
|
+
addKronecker: function(matr_1, matr_2) {
|
|
3365
|
+
if(Chalkboard.matr.rows(matr_1) === Chalkboard.matr.cols(matr_1) && Chalkboard.matr.rows(matr_2) === Chalkboard.matr.cols(matr_2)) {
|
|
3366
|
+
return Chalkboard.matr.add(Chalkboard.matr.mulKronecker(matr_1, Chalkboard.matr.identity(Chalkboard.matr.rows(matr_1))), Chalkboard.matr.mulKronecker(Chalkboard.matr.identity(Chalkboard.matr.rows(matr_2)), matr_2));
|
|
3367
|
+
} else {
|
|
3368
|
+
return undefined;
|
|
3369
|
+
}
|
|
3370
|
+
},
|
|
3371
|
+
mulKronecker: function(matr_1, matr_2) {
|
|
3372
|
+
var result = Chalkboard.matr.new();
|
|
3373
|
+
for(var i = 0; i < Chalkboard.matr.rows(matr_1); i++) {
|
|
3374
|
+
for(var j = 0; j < Chalkboard.matr.cols(matr_1); j++) {
|
|
3375
|
+
for(var k = 0; k < Chalkboard.matr.rows(matr_2); k++) {
|
|
3376
|
+
for(var l = 0; l < Chalkboard.matr.cols(matr_2); l++) {
|
|
3377
|
+
if(!result[i * Chalkboard.matr.rows(matr_2) + k]) {
|
|
3378
|
+
result[i * Chalkboard.matr.rows(matr_2) + k] = [];
|
|
3379
|
+
}
|
|
3380
|
+
result[i * Chalkboard.matr.rows(matr_2) + k][j * Chalkboard.matr.cols(matr_2) + l] = matr_1[i][j] * matr_2[k][l];
|
|
3381
|
+
}
|
|
3382
|
+
}
|
|
3383
|
+
}
|
|
3384
|
+
}
|
|
3385
|
+
return result;
|
|
3386
|
+
},
|
|
2739
3387
|
reduce: function(matr) {
|
|
2740
3388
|
var lead = 0;
|
|
2741
3389
|
for(var row = 0; row < Chalkboard.matr.rows(matr); row++) {
|
|
@@ -2819,6 +3467,12 @@ var Chalkboard = {
|
|
|
2819
3467
|
return "TypeError: Parameter \"vec\" should be \"vec2\", \"vec3\", or \"vec4\".";
|
|
2820
3468
|
}
|
|
2821
3469
|
},
|
|
3470
|
+
toTensor: function(matr, size) {
|
|
3471
|
+
if(!Array.isArray(size)) {
|
|
3472
|
+
size = Array.from(arguments).slice(1);
|
|
3473
|
+
}
|
|
3474
|
+
return Chalkboard.tens.resize(matr, size);
|
|
3475
|
+
},
|
|
2822
3476
|
toArray: function(matr) {
|
|
2823
3477
|
var result = [];
|
|
2824
3478
|
for(var i = 0; i < Chalkboard.matr.rows(matr); i++) {
|
|
@@ -2828,6 +3482,16 @@ var Chalkboard = {
|
|
|
2828
3482
|
}
|
|
2829
3483
|
return result;
|
|
2830
3484
|
},
|
|
3485
|
+
toObject: function(matr) {
|
|
3486
|
+
var result = {};
|
|
3487
|
+
for(var i = 0; i < Chalkboard.matr.rows(matr); i++) {
|
|
3488
|
+
result["i" + (i + 1)] = {};
|
|
3489
|
+
for(var j = 0; j < Chalkboard.matr.cols(matr); j++) {
|
|
3490
|
+
result["i" + (i + 1)]["j" + (j + 1)] = matr[i][j];
|
|
3491
|
+
}
|
|
3492
|
+
}
|
|
3493
|
+
return result;
|
|
3494
|
+
},
|
|
2831
3495
|
toString: function(matr) {
|
|
2832
3496
|
var result = "";
|
|
2833
3497
|
for(var i = 0; i < Chalkboard.matr.rows(matr); i++) {
|
|
@@ -2839,18 +3503,369 @@ var Chalkboard = {
|
|
|
2839
3503
|
}
|
|
2840
3504
|
return result;
|
|
2841
3505
|
},
|
|
2842
|
-
|
|
2843
|
-
|
|
2844
|
-
|
|
2845
|
-
|
|
2846
|
-
|
|
2847
|
-
|
|
3506
|
+
print: function(matr) {
|
|
3507
|
+
console.log(Chalkboard.matr.toString(matr));
|
|
3508
|
+
}
|
|
3509
|
+
},
|
|
3510
|
+
tens: {
|
|
3511
|
+
new: function(tensor) {
|
|
3512
|
+
if(arguments.length === 0) {
|
|
3513
|
+
return [];
|
|
3514
|
+
} else if(arguments.length === 1 && Array.isArray(arguments[0])) {
|
|
3515
|
+
tensor = arguments[0];
|
|
3516
|
+
} else {
|
|
3517
|
+
tensor = Array.from(arguments);
|
|
3518
|
+
}
|
|
3519
|
+
var newNDArray = function(arr) {
|
|
3520
|
+
return arr.map(function(subarr) {
|
|
3521
|
+
if(Array.isArray(subarr)) {
|
|
3522
|
+
return newNDArray(subarr);
|
|
3523
|
+
} else {
|
|
3524
|
+
return subarr;
|
|
3525
|
+
}
|
|
3526
|
+
});
|
|
3527
|
+
};
|
|
3528
|
+
return newNDArray(tensor);
|
|
3529
|
+
},
|
|
3530
|
+
copy: function(tens) {
|
|
3531
|
+
if(Array.isArray(tens)) {
|
|
3532
|
+
var result = Chalkboard.tens.new();
|
|
3533
|
+
for(var i = 0; i < tens.length; i++) {
|
|
3534
|
+
result[i] = Chalkboard.tens.copy(tens[i]);
|
|
2848
3535
|
}
|
|
3536
|
+
return result;
|
|
3537
|
+
} else {
|
|
3538
|
+
return tens;
|
|
2849
3539
|
}
|
|
3540
|
+
},
|
|
3541
|
+
rank: function(tens) {
|
|
3542
|
+
if(Array.isArray(tens)) {
|
|
3543
|
+
var result = 0;
|
|
3544
|
+
for(var i = 0; i < tens.length; i++) {
|
|
3545
|
+
result = Math.max(result, Chalkboard.tens.rank(tens[i]));
|
|
3546
|
+
}
|
|
3547
|
+
return result + 1;
|
|
3548
|
+
} else {
|
|
3549
|
+
return 0;
|
|
3550
|
+
}
|
|
3551
|
+
},
|
|
3552
|
+
size: function(tens) {
|
|
3553
|
+
if(Array.isArray(tens)) {
|
|
3554
|
+
var result = [tens.length];
|
|
3555
|
+
if(Array.isArray(tens[0])) {
|
|
3556
|
+
result = result.concat(Chalkboard.tens.size(tens[0]));
|
|
3557
|
+
}
|
|
3558
|
+
return result;
|
|
3559
|
+
} else {
|
|
3560
|
+
return [];
|
|
3561
|
+
}
|
|
3562
|
+
},
|
|
3563
|
+
resize: function(tens, size) {
|
|
3564
|
+
if(!Array.isArray(size)) {
|
|
3565
|
+
size = Array.from(arguments).slice(1);
|
|
3566
|
+
}
|
|
3567
|
+
var result = Chalkboard.tens.fill(0, size);
|
|
3568
|
+
var refill = function(arr1, arr2) {
|
|
3569
|
+
for(var i = 0; i < arr2.length; i++) {
|
|
3570
|
+
if(Array.isArray(arr2[i])) {
|
|
3571
|
+
refill(arr1, arr2[i]);
|
|
3572
|
+
} else {
|
|
3573
|
+
arr2[i] = arr1.length > 0 ? arr1.shift() : 0;
|
|
3574
|
+
}
|
|
3575
|
+
}
|
|
3576
|
+
};
|
|
3577
|
+
refill(Chalkboard.tens.toArray(tens), result);
|
|
2850
3578
|
return result;
|
|
2851
3579
|
},
|
|
2852
|
-
|
|
2853
|
-
|
|
3580
|
+
push: function(tens, rank, index, elements) {
|
|
3581
|
+
if(rank === 0) {
|
|
3582
|
+
tens.splice(index, 0, elements);
|
|
3583
|
+
return tens;
|
|
3584
|
+
} else {
|
|
3585
|
+
for(var i = 0; i < tens.length; i++) {
|
|
3586
|
+
Chalkboard.tens.push(tens[i], rank - 1, index, elements[i]);
|
|
3587
|
+
}
|
|
3588
|
+
return tens;
|
|
3589
|
+
}
|
|
3590
|
+
},
|
|
3591
|
+
pull: function(tens, rank, index) {
|
|
3592
|
+
if(rank === 0) {
|
|
3593
|
+
tens.splice(index, 1);
|
|
3594
|
+
return tens;
|
|
3595
|
+
} else {
|
|
3596
|
+
for(var i = 0; i < tens.length; i++) {
|
|
3597
|
+
Chalkboard.tens.pull(tens[i], rank - 1, index);
|
|
3598
|
+
}
|
|
3599
|
+
return tens;
|
|
3600
|
+
}
|
|
3601
|
+
},
|
|
3602
|
+
fill: function(element, size) {
|
|
3603
|
+
if(!Array.isArray(size)) {
|
|
3604
|
+
size = Array.from(arguments).slice(1);
|
|
3605
|
+
}
|
|
3606
|
+
var newNDArray = function(size) {
|
|
3607
|
+
if(size.length === 0) {
|
|
3608
|
+
return element;
|
|
3609
|
+
}
|
|
3610
|
+
var curr = size[0];
|
|
3611
|
+
var rest = size.slice(1);
|
|
3612
|
+
var result = [];
|
|
3613
|
+
for(var i = 0; i < curr; i++) {
|
|
3614
|
+
result[i] = newNDArray(rest);
|
|
3615
|
+
}
|
|
3616
|
+
return result;
|
|
3617
|
+
}
|
|
3618
|
+
return newNDArray(size);
|
|
3619
|
+
},
|
|
3620
|
+
empty: function(size) {
|
|
3621
|
+
if(!Array.isArray(size)) {
|
|
3622
|
+
size = Array.from(arguments);
|
|
3623
|
+
}
|
|
3624
|
+
var newNDArray = function(size) {
|
|
3625
|
+
if(size.length === 0) {
|
|
3626
|
+
return null;
|
|
3627
|
+
}
|
|
3628
|
+
var curr = size[0];
|
|
3629
|
+
var rest = size.slice(1);
|
|
3630
|
+
var result = [];
|
|
3631
|
+
for(var i = 0; i < curr; i++) {
|
|
3632
|
+
result[i] = newNDArray(rest);
|
|
3633
|
+
}
|
|
3634
|
+
return result;
|
|
3635
|
+
}
|
|
3636
|
+
return newNDArray(size);
|
|
3637
|
+
},
|
|
3638
|
+
random: function(inf, sup, size) {
|
|
3639
|
+
if(!Array.isArray(size)) {
|
|
3640
|
+
size = Array.from(arguments).slice(2);
|
|
3641
|
+
}
|
|
3642
|
+
var newNDArray = function(size) {
|
|
3643
|
+
if(size.length === 0) {
|
|
3644
|
+
return Chalkboard.numb.random(inf, sup);
|
|
3645
|
+
}
|
|
3646
|
+
var curr = size[0];
|
|
3647
|
+
var rest = size.slice(1);
|
|
3648
|
+
var result = [];
|
|
3649
|
+
for(var i = 0; i < curr; i++) {
|
|
3650
|
+
result[i] = newNDArray(rest);
|
|
3651
|
+
}
|
|
3652
|
+
return result;
|
|
3653
|
+
}
|
|
3654
|
+
return newNDArray(size);
|
|
3655
|
+
},
|
|
3656
|
+
contract: function(tens) {
|
|
3657
|
+
if(Chalkboard.tens.rank(tens) > 2) {
|
|
3658
|
+
return Chalkboard.tens.resize(tens, Chalkboard.tens.size(tens)[0], Chalkboard.tens.size(tens).slice(1).reduce(function(a, b) { return a * b; }) / Chalkboard.tens.size(tens)[0]);
|
|
3659
|
+
} else if(Chalkboard.tens.rank(tens) === 2) {
|
|
3660
|
+
return Chalkboard.matr.trace(tens);
|
|
3661
|
+
}
|
|
3662
|
+
},
|
|
3663
|
+
transpose: function(tens) {
|
|
3664
|
+
return Chalkboard.tens.resize(tens, Chalkboard.tens.size(tens).reverse());
|
|
3665
|
+
},
|
|
3666
|
+
zero: function(tens) {
|
|
3667
|
+
var result = Chalkboard.tens.new();
|
|
3668
|
+
if(Array.isArray(tens)) {
|
|
3669
|
+
for(var i = 0; i < tens.length; i++) {
|
|
3670
|
+
result[i] = Chalkboard.tens.zero(tens[i]);
|
|
3671
|
+
}
|
|
3672
|
+
return result;
|
|
3673
|
+
} else {
|
|
3674
|
+
return 0;
|
|
3675
|
+
}
|
|
3676
|
+
},
|
|
3677
|
+
negate: function(tens) {
|
|
3678
|
+
var result = Chalkboard.tens.new();
|
|
3679
|
+
if(Array.isArray(tens)) {
|
|
3680
|
+
for(var i = 0; i < tens.length; i++) {
|
|
3681
|
+
result[i] = Chalkboard.tens.negate(tens[i]);
|
|
3682
|
+
}
|
|
3683
|
+
return result;
|
|
3684
|
+
} else {
|
|
3685
|
+
return -tens;
|
|
3686
|
+
}
|
|
3687
|
+
},
|
|
3688
|
+
reciprocate: function(tens) {
|
|
3689
|
+
var result = Chalkboard.tens.new();
|
|
3690
|
+
if(Array.isArray(tens)) {
|
|
3691
|
+
for(var i = 0; i < tens.length; i++) {
|
|
3692
|
+
result[i] = Chalkboard.tens.reciprocate(tens[i]);
|
|
3693
|
+
}
|
|
3694
|
+
return result;
|
|
3695
|
+
} else {
|
|
3696
|
+
return 1 / tens;
|
|
3697
|
+
}
|
|
3698
|
+
},
|
|
3699
|
+
absolute: function(tens) {
|
|
3700
|
+
var result = Chalkboard.tens.new();
|
|
3701
|
+
if(Array.isArray(tens)) {
|
|
3702
|
+
for(var i = 0; i < tens.length; i++) {
|
|
3703
|
+
result[i] = Chalkboard.tens.absolute(tens[i]);
|
|
3704
|
+
}
|
|
3705
|
+
return result;
|
|
3706
|
+
} else {
|
|
3707
|
+
return Math.abs(tens);
|
|
3708
|
+
}
|
|
3709
|
+
},
|
|
3710
|
+
round: function(tens) {
|
|
3711
|
+
var result = Chalkboard.tens.new();
|
|
3712
|
+
if(Array.isArray(tens)) {
|
|
3713
|
+
for(var i = 0; i < tens.length; i++) {
|
|
3714
|
+
result[i] = Chalkboard.tens.round(tens[i]);
|
|
3715
|
+
}
|
|
3716
|
+
return result;
|
|
3717
|
+
} else {
|
|
3718
|
+
return Math.round(tens);
|
|
3719
|
+
}
|
|
3720
|
+
},
|
|
3721
|
+
scl: function(tens, num) {
|
|
3722
|
+
var result = Chalkboard.tens.new();
|
|
3723
|
+
if(Array.isArray(tens)) {
|
|
3724
|
+
for(var i = 0; i < tens.length; i++) {
|
|
3725
|
+
result[i] = Chalkboard.tens.scl(tens[i], num);
|
|
3726
|
+
}
|
|
3727
|
+
return result;
|
|
3728
|
+
} else {
|
|
3729
|
+
return tens * num;
|
|
3730
|
+
}
|
|
3731
|
+
},
|
|
3732
|
+
constrain: function(tens, range) {
|
|
3733
|
+
var result = Chalkboard.tens.new();
|
|
3734
|
+
if(Array.isArray(tens)) {
|
|
3735
|
+
for(var i = 0; i < tens.length; i++) {
|
|
3736
|
+
result[i] = Chalkboard.tens.constrain(tens[i], range);
|
|
3737
|
+
}
|
|
3738
|
+
return result;
|
|
3739
|
+
} else {
|
|
3740
|
+
return Chalkboard.numb.constrain(tens, range);
|
|
3741
|
+
}
|
|
3742
|
+
},
|
|
3743
|
+
concat: function(tens_1, tens_2, rank) {
|
|
3744
|
+
rank = rank || 1;
|
|
3745
|
+
var concatAtRank = function(arr1, arr2, currentRank) {
|
|
3746
|
+
if(currentRank === rank) {
|
|
3747
|
+
return Chalkboard.tens.new(arr1.concat(arr2));
|
|
3748
|
+
}
|
|
3749
|
+
return arr1.map(function(element, index) {
|
|
3750
|
+
return concatAtRank(element, arr2[index], currentRank);
|
|
3751
|
+
});
|
|
3752
|
+
}
|
|
3753
|
+
return concatAtRank(tens_1, tens_2, 1);
|
|
3754
|
+
},
|
|
3755
|
+
add: function(tens_1, tens_2) {
|
|
3756
|
+
var result = Chalkboard.tens.new();
|
|
3757
|
+
if(Array.isArray(tens_1) && Array.isArray(tens_2)) {
|
|
3758
|
+
for(var i = 0; i < Math.max(tens_1.length, tens_2.length); i++) {
|
|
3759
|
+
result[i] = Chalkboard.tens.add(tens_1[i] !== undefined ? tens_1[i] : 0, tens_2[i] !== undefined ? tens_2[i] : 0);
|
|
3760
|
+
}
|
|
3761
|
+
return result;
|
|
3762
|
+
} else {
|
|
3763
|
+
return tens_1 + tens_2;
|
|
3764
|
+
}
|
|
3765
|
+
},
|
|
3766
|
+
sub: function(tens_1, tens_2) {
|
|
3767
|
+
var result = Chalkboard.tens.new();
|
|
3768
|
+
if(Array.isArray(tens_1) && Array.isArray(tens_2)) {
|
|
3769
|
+
for(var i = 0; i < Math.max(tens_1.length, tens_2.length); i++) {
|
|
3770
|
+
result[i] = Chalkboard.tens.sub(tens_1[i] !== undefined ? tens_1[i] : 0, tens_2[i] !== undefined ? tens_2[i] : 0);
|
|
3771
|
+
}
|
|
3772
|
+
return result;
|
|
3773
|
+
} else {
|
|
3774
|
+
return tens_1 - tens_2;
|
|
3775
|
+
}
|
|
3776
|
+
},
|
|
3777
|
+
mul: function(tens_1, tens_2) {
|
|
3778
|
+
var result = Chalkboard.tens.new();
|
|
3779
|
+
if(Array.isArray(tens_1) && Array.isArray(tens_2)) {
|
|
3780
|
+
for(var i = 0; i < tens_1.length; i++) {
|
|
3781
|
+
var subarr = Chalkboard.tens.new();
|
|
3782
|
+
for(var j = 0; j < tens_2.length; j++) {
|
|
3783
|
+
subarr[j] = Chalkboard.tens.mul(tens_1[i], tens_2[j]);
|
|
3784
|
+
}
|
|
3785
|
+
result.push(subarr);
|
|
3786
|
+
}
|
|
3787
|
+
return result;
|
|
3788
|
+
} else {
|
|
3789
|
+
return tens_1 * tens_2;
|
|
3790
|
+
}
|
|
3791
|
+
},
|
|
3792
|
+
toVector: function(tens, type, index) {
|
|
3793
|
+
if(index === undefined) { index = 0; }
|
|
3794
|
+
var arr = Chalkboard.tens.toArray(tens);
|
|
3795
|
+
if(type === "vec2") {
|
|
3796
|
+
return Chalkboard.vec2.new(arr[index], arr[index + 1]);
|
|
3797
|
+
} else if(type === "vec3") {
|
|
3798
|
+
return Chalkboard.vec3.new(arr[index], arr[index + 1], arr[index + 2]);
|
|
3799
|
+
} else if(type === "vec4") {
|
|
3800
|
+
return Chalkboard.vec4.new(arr[index], arr[index + 1], arr[index + 2], arr[index + 3]);
|
|
3801
|
+
} else {
|
|
3802
|
+
return "TypeError: Parameter \"type\" should be \"vec2\", \"vec3\", or \"vec4\".";
|
|
3803
|
+
}
|
|
3804
|
+
},
|
|
3805
|
+
toMatrix: function(tens) {
|
|
3806
|
+
var result = Chalkboard.matr.new();
|
|
3807
|
+
var flatten = function(tens, result) {
|
|
3808
|
+
for(var i = 0; i < tens.length; i++) {
|
|
3809
|
+
if(Array.isArray(tens[i])) {
|
|
3810
|
+
flatten(tens[i], result);
|
|
3811
|
+
} else {
|
|
3812
|
+
result.push(tens[i]);
|
|
3813
|
+
}
|
|
3814
|
+
}
|
|
3815
|
+
}
|
|
3816
|
+
var matr = Chalkboard.matr.new();
|
|
3817
|
+
flatten(tens, matr);
|
|
3818
|
+
var rows = tens.length || 1;
|
|
3819
|
+
for(var j = 0; j < rows; j++) {
|
|
3820
|
+
result.push(matr.slice(j * matr.length / rows, (j + 1) * matr.length / rows));
|
|
3821
|
+
}
|
|
3822
|
+
return result;
|
|
3823
|
+
},
|
|
3824
|
+
toArray: function(tens) {
|
|
3825
|
+
var result = [];
|
|
3826
|
+
var flatten = function(tens) {
|
|
3827
|
+
for(var i = 0; i < tens.length; i++) {
|
|
3828
|
+
if(Array.isArray(tens[i])) {
|
|
3829
|
+
flatten(tens[i]);
|
|
3830
|
+
} else {
|
|
3831
|
+
result.push(tens[i]);
|
|
3832
|
+
}
|
|
3833
|
+
}
|
|
3834
|
+
}
|
|
3835
|
+
flatten(tens);
|
|
3836
|
+
return result;
|
|
3837
|
+
},
|
|
3838
|
+
toObject: function(tens) {
|
|
3839
|
+
if(Array.isArray(tens)) {
|
|
3840
|
+
var result = {};
|
|
3841
|
+
for(var i = 0; i < tens.length; i++) {
|
|
3842
|
+
result["_" + (i + 1)] = Chalkboard.tens.toObject(tens[i]);
|
|
3843
|
+
}
|
|
3844
|
+
return result;
|
|
3845
|
+
} else {
|
|
3846
|
+
return tens;
|
|
3847
|
+
}
|
|
3848
|
+
},
|
|
3849
|
+
toString: function(tens, indentation) {
|
|
3850
|
+
if(indentation === undefined) { indentation = 0; }
|
|
3851
|
+
if(Array.isArray(tens[0])) {
|
|
3852
|
+
var result = "\t".repeat(indentation) + "[\n";
|
|
3853
|
+
for(var i = 0; i < tens.length; i++) {
|
|
3854
|
+
result += Chalkboard.tens.toString(tens[i], indentation + 1);
|
|
3855
|
+
}
|
|
3856
|
+
result += "\t".repeat(indentation) + "]\n";
|
|
3857
|
+
return result;
|
|
3858
|
+
} else {
|
|
3859
|
+
var result = "\t".repeat(indentation) + "[ ";
|
|
3860
|
+
for(var i = 0; i < tens.length; i++) {
|
|
3861
|
+
result += tens[i].toString() + " ";
|
|
3862
|
+
}
|
|
3863
|
+
result += "]\n";
|
|
3864
|
+
return result;
|
|
3865
|
+
}
|
|
3866
|
+
},
|
|
3867
|
+
print: function(tens) {
|
|
3868
|
+
return console.log(Chalkboard.tens.toString(tens));
|
|
2854
3869
|
}
|
|
2855
3870
|
},
|
|
2856
3871
|
calc: {
|
|
@@ -2888,6 +3903,9 @@ var Chalkboard = {
|
|
|
2888
3903
|
if(func.type === "expl") {
|
|
2889
3904
|
var f = Chalkboard.real.parse("x => " + func.definition);
|
|
2890
3905
|
return (f(val + h) - f(val)) / h;
|
|
3906
|
+
} else if(func.type === "inve") {
|
|
3907
|
+
var f = Chalkboard.real.parse("y => " + func.definition);
|
|
3908
|
+
return (f(val + h) - f(val)) / h;
|
|
2891
3909
|
} else if(func.type === "pola") {
|
|
2892
3910
|
var r = Chalkboard.real.parse("O => " + func.definition);
|
|
2893
3911
|
return (r(val + h) - r(val)) / h;
|
|
@@ -2903,7 +3921,7 @@ var Chalkboard = {
|
|
|
2903
3921
|
return Chalkboard.vec3.new((x(val + h) - x(val)) / h, (y(val + h) - y(val)) / h, (z(val + h) - z(val)) / h);
|
|
2904
3922
|
}
|
|
2905
3923
|
} else {
|
|
2906
|
-
return "TypeError: Parameter \"func\" must be of type \"expl\", \"pola\", or \"curv\".";
|
|
3924
|
+
return "TypeError: Parameter \"func\" must be of type \"expl\", \"inve\", \"pola\", or \"curv\".";
|
|
2907
3925
|
}
|
|
2908
3926
|
},
|
|
2909
3927
|
d2fdx2: function(func, val) {
|
|
@@ -2911,6 +3929,9 @@ var Chalkboard = {
|
|
|
2911
3929
|
if(func.type === "expl") {
|
|
2912
3930
|
var f = Chalkboard.real.parse("x => " + func.definition);
|
|
2913
3931
|
return (f(val + h) - 2 * f(val) + f(val - h)) / (h * h);
|
|
3932
|
+
} else if(func.type === "inve") {
|
|
3933
|
+
var f = Chalkboard.real.parse("y => " + func.definition);
|
|
3934
|
+
return (f(val + h) - 2 * f(val) + f(val - h)) / (h * h);
|
|
2914
3935
|
} else if(func.type === "pola") {
|
|
2915
3936
|
var r = Chalkboard.real.parse("O => " + func.definition);
|
|
2916
3937
|
return (r(val + h) - 2 * r(val) + r(val - h)) / (h * h);
|
|
@@ -2926,7 +3947,7 @@ var Chalkboard = {
|
|
|
2926
3947
|
return Chalkboard.vec3.new((x(val + h) - 2 * x(val) + x(val - h)) / (h * h), (y(val + h) - 2 * y(val) + y(val - h)) / (h * h), (z(val + h) - 2 * z(val) + z(val - h)) / (h * h));
|
|
2927
3948
|
}
|
|
2928
3949
|
} else {
|
|
2929
|
-
return "TypeError: Parameter \"func\" must be of type \"expl\", \"pola\", or \"curv\".";
|
|
3950
|
+
return "TypeError: Parameter \"func\" must be of type \"expl\", \"inve\", \"pola\", or \"curv\".";
|
|
2930
3951
|
}
|
|
2931
3952
|
},
|
|
2932
3953
|
tangent: function(func, val) {
|
|
@@ -3181,7 +4202,7 @@ var Chalkboard = {
|
|
|
3181
4202
|
return "TypeError: Parameter \"func\" must be of type \"comp\".";
|
|
3182
4203
|
}
|
|
3183
4204
|
},
|
|
3184
|
-
|
|
4205
|
+
d2fdz2: function(func, comp) {
|
|
3185
4206
|
var h = 0.00001;
|
|
3186
4207
|
if(func.type === "comp") {
|
|
3187
4208
|
var u = Chalkboard.comp.parse("(a, b) => " + func.definition[0]),
|
|
@@ -3195,59 +4216,61 @@ var Chalkboard = {
|
|
|
3195
4216
|
return "TypeError: Parameter \"func\" must be of type \"comp\".";
|
|
3196
4217
|
}
|
|
3197
4218
|
},
|
|
3198
|
-
fxdx: function(func,
|
|
3199
|
-
if(func.type === "expl" || func.type === "pola") {
|
|
4219
|
+
fxdx: function(func, inf, sup) {
|
|
4220
|
+
if(func.type === "expl" || func.type === "inve" || func.type === "pola") {
|
|
3200
4221
|
var f;
|
|
3201
4222
|
if(func.type === "expl") {
|
|
3202
4223
|
f = Chalkboard.real.parse("x => " + func.definition);
|
|
4224
|
+
} else if(func.type === "inve") {
|
|
4225
|
+
f = Chalkboard.real.parse("y => " + func.definition);
|
|
3203
4226
|
} else if(func.type === "pola") {
|
|
3204
4227
|
f = Chalkboard.real.parse("O => " + "((" + func.definition + ") * (" + func.definition + ")) / 2");
|
|
3205
4228
|
}
|
|
3206
|
-
var fx = f(
|
|
3207
|
-
var dx = (
|
|
4229
|
+
var fx = f(inf) + f(sup);
|
|
4230
|
+
var dx = (sup - inf) / 1000000;
|
|
3208
4231
|
for(var i = 1; i < 1000000; i++) {
|
|
3209
|
-
fx += i % 2 === 0 ? 2 * f(
|
|
4232
|
+
fx += i % 2 === 0 ? 2 * f(inf + i * dx) : 4 * f(inf + i * dx);
|
|
3210
4233
|
}
|
|
3211
4234
|
return (fx * dx) / 3;
|
|
3212
4235
|
} else if(func.type === "curv") {
|
|
3213
4236
|
if(func.definition.length === 2) {
|
|
3214
4237
|
var x = Chalkboard.real.parse("t => " + func.definition[0]),
|
|
3215
4238
|
y = Chalkboard.real.parse("t => " + func.definition[1]);
|
|
3216
|
-
var xt = x(
|
|
3217
|
-
yt = y(
|
|
3218
|
-
var dt = (
|
|
4239
|
+
var xt = x(inf) + x(sup),
|
|
4240
|
+
yt = y(inf) + y(sup);
|
|
4241
|
+
var dt = (sup - inf) / 1000000;
|
|
3219
4242
|
for(var i = 1; i < 1000000; i++) {
|
|
3220
|
-
xt += i % 2 === 0 ? 2 * x(
|
|
3221
|
-
yt += i % 2 === 0 ? 2 * y(
|
|
4243
|
+
xt += i % 2 === 0 ? 2 * x(inf + i * dt) : 4 * x(inf + i * dt);
|
|
4244
|
+
yt += i % 2 === 0 ? 2 * y(sup + i * dt) : 4 * y(sup + i * dt);
|
|
3222
4245
|
}
|
|
3223
4246
|
return Chalkboard.vec2.new((xt * dt) / 3, (yt * dt) / 3);
|
|
3224
4247
|
} else if(func.definition.length === 3) {
|
|
3225
4248
|
var x = Chalkboard.real.parse("t => " + func.definition[0]),
|
|
3226
4249
|
y = Chalkboard.real.parse("t => " + func.definition[1]),
|
|
3227
4250
|
z = Chalkboard.real.parse("t => " + func.definition[2]);
|
|
3228
|
-
var xt = x(
|
|
3229
|
-
yt = y(
|
|
3230
|
-
zt = z(
|
|
3231
|
-
var dt = (
|
|
4251
|
+
var xt = x(inf) + x(sup),
|
|
4252
|
+
yt = y(inf) + y(sup),
|
|
4253
|
+
zt = z(inf) + z(sup);
|
|
4254
|
+
var dt = (sup - inf) / 1000000;
|
|
3232
4255
|
for(var i = 1; i < 1000000; i++) {
|
|
3233
|
-
xt += i % 2 === 0 ? 2 * x(
|
|
3234
|
-
yt += i % 2 === 0 ? 2 * y(
|
|
3235
|
-
zt += i % 2 === 0 ? 2 * z(
|
|
4256
|
+
xt += i % 2 === 0 ? 2 * x(inf + i * dt) : 4 * x(inf + i * dt);
|
|
4257
|
+
yt += i % 2 === 0 ? 2 * y(inf + i * dt) : 4 * y(inf + i * dt);
|
|
4258
|
+
zt += i % 2 === 0 ? 2 * z(inf + i * dt) : 4 * z(inf + i * dt);
|
|
3236
4259
|
}
|
|
3237
4260
|
return Chalkboard.vec3.new((xt * dt) / 3, (yt * dt) / 3, (zt * dt) / 3);
|
|
3238
4261
|
}
|
|
3239
4262
|
} else {
|
|
3240
|
-
return "TypeError: Parameter \"func\" must be of type \"expl\", \"pola\", or \"curv\".";
|
|
4263
|
+
return "TypeError: Parameter \"func\" must be of type \"expl\", \"inve\", \"pola\", or \"curv\".";
|
|
3241
4264
|
}
|
|
3242
4265
|
},
|
|
3243
|
-
fxydxdy: function(func,
|
|
4266
|
+
fxydxdy: function(func, xinf, xsup, yinf, ysup) {
|
|
3244
4267
|
if(func.type === "mult") {
|
|
3245
4268
|
var f = Chalkboard.real.parse("(x, y) => " + func.definition);
|
|
3246
4269
|
var result = 0;
|
|
3247
|
-
var dx = (
|
|
3248
|
-
dy = (
|
|
3249
|
-
for(var x =
|
|
3250
|
-
for(var y =
|
|
4270
|
+
var dx = (xsup - xinf) / 10000,
|
|
4271
|
+
dy = (ysup - yinf) / 10000;
|
|
4272
|
+
for(var x = xinf; x <= xsup; x += dx) {
|
|
4273
|
+
for(var y = yinf; y <= ysup; y += dy) {
|
|
3251
4274
|
result += f(x, y);
|
|
3252
4275
|
}
|
|
3253
4276
|
}
|
|
@@ -3256,29 +4279,29 @@ var Chalkboard = {
|
|
|
3256
4279
|
return "TypeError: Parameter \"func\" must be of type \"mult\".";
|
|
3257
4280
|
}
|
|
3258
4281
|
},
|
|
3259
|
-
fds: function(func,
|
|
4282
|
+
fds: function(func, tinf, tsup, sinf, ssup) {
|
|
3260
4283
|
var result = 0;
|
|
3261
4284
|
var drdt, drds;
|
|
3262
4285
|
if(func.type === "curv") {
|
|
3263
|
-
var dt = (
|
|
4286
|
+
var dt = (tsup - tinf) / 10000;
|
|
3264
4287
|
if(func.definition.length === 2) {
|
|
3265
|
-
for(var t =
|
|
4288
|
+
for(var t = tinf; t <= tsup; t += dt) {
|
|
3266
4289
|
drdt = Chalkboard.calc.dfdx(func, t);
|
|
3267
4290
|
result += Chalkboard.vec2.mag(drdt);
|
|
3268
4291
|
}
|
|
3269
4292
|
return result * dt;
|
|
3270
4293
|
} else if(func.definition.length === 3) {
|
|
3271
|
-
for(var t =
|
|
4294
|
+
for(var t = tinf; t <= tsup; t += dt) {
|
|
3272
4295
|
drdt = Chalkboard.calc.dfdx(func, t);
|
|
3273
4296
|
result += Chalkboard.vec3.mag(drdt);
|
|
3274
4297
|
}
|
|
3275
4298
|
return result * dt;
|
|
3276
4299
|
}
|
|
3277
4300
|
} else if(func.type === "surf") {
|
|
3278
|
-
var dt = (
|
|
3279
|
-
ds = (
|
|
3280
|
-
for(var s =
|
|
3281
|
-
for(var t =
|
|
4301
|
+
var dt = (tsup - tinf) / 100,
|
|
4302
|
+
ds = (ssup - sinf) / 100;
|
|
4303
|
+
for(var s = sinf; s <= ssup; s += ds) {
|
|
4304
|
+
for(var t = tinf; t <= tsup; t += dt) {
|
|
3282
4305
|
drds = Chalkboard.matr.toVector(Chalkboard.calc.grad(func, Chalkboard.vec2.new(s, t)), "vec3", "col", 1);
|
|
3283
4306
|
drdt = Chalkboard.matr.toVector(Chalkboard.calc.grad(func, Chalkboard.vec2.new(s, t)), "vec3", "col", 2);
|
|
3284
4307
|
result += Chalkboard.vec3.mag(Chalkboard.vec3.cross(drds, drdt));
|
|
@@ -3289,22 +4312,22 @@ var Chalkboard = {
|
|
|
3289
4312
|
return "TypeError: Parameter \"func\" must be of type \"curv\" or \"surf\".";
|
|
3290
4313
|
}
|
|
3291
4314
|
},
|
|
3292
|
-
frds: function(funcORvecfield, func,
|
|
4315
|
+
frds: function(funcORvecfield, func, inf, sup) {
|
|
3293
4316
|
if(func.type === "curv") {
|
|
3294
4317
|
var result = 0;
|
|
3295
|
-
var dt = (
|
|
4318
|
+
var dt = (sup - inf) / 10000;
|
|
3296
4319
|
if(funcORvecfield.type === "mult") {
|
|
3297
|
-
for(var t =
|
|
3298
|
-
result += Chalkboard.real.val(funcORvecfield, Chalkboard.
|
|
4320
|
+
for(var t = inf; t <= sup; t += dt) {
|
|
4321
|
+
result += Chalkboard.real.val(funcORvecfield, Chalkboard.real.val(func, t)) * Chalkboard.vec2.mag(Chalkboard.calc.dfdx(func, t));
|
|
3299
4322
|
}
|
|
3300
4323
|
return result * dt;
|
|
3301
4324
|
} else if(funcORvecfield.type === "vec2field") {
|
|
3302
|
-
for(var t =
|
|
4325
|
+
for(var t = inf; t <= sup; t += dt) {
|
|
3303
4326
|
result += Chalkboard.vec2.dot(Chalkboard.vec2.fromField(funcORvecfield, Chalkboard.real.val(func, t)), Chalkboard.calc.dfdx(func, t));
|
|
3304
4327
|
}
|
|
3305
4328
|
return result * dt;
|
|
3306
4329
|
} else if(funcORvecfield.type === "vec3field") {
|
|
3307
|
-
for(var t =
|
|
4330
|
+
for(var t = inf; t <= sup; t += dt) {
|
|
3308
4331
|
result += Chalkboard.vec3.dot(Chalkboard.vec3.fromField(funcORvecfield, Chalkboard.real.val(func, t)), Chalkboard.calc.dfdx(func, t));
|
|
3309
4332
|
}
|
|
3310
4333
|
return result * dt;
|
|
@@ -3315,29 +4338,29 @@ var Chalkboard = {
|
|
|
3315
4338
|
return "TypeError: Parameter \"func\" must be of type \"curv\".";
|
|
3316
4339
|
}
|
|
3317
4340
|
},
|
|
3318
|
-
fnds: function(vecfield, func,
|
|
4341
|
+
fnds: function(vecfield, func, tinf, tsup, sinf, ssup) {
|
|
3319
4342
|
var result = 0;
|
|
3320
4343
|
var drdt, drds;
|
|
3321
4344
|
if(func.type === "curv") {
|
|
3322
|
-
var dt = (
|
|
4345
|
+
var dt = (tsup - tinf) / 10000;
|
|
3323
4346
|
if(func.definition.length === 2) {
|
|
3324
|
-
for(var t =
|
|
4347
|
+
for(var t = tinf; t <= tsup; t += dt) {
|
|
3325
4348
|
drdt = Chalkboard.calc.dfdx(func, t);
|
|
3326
4349
|
result += Chalkboard.vec2.dot(Chalkboard.vec2.fromField(vecfield, Chalkboard.real.val(func, t)), Chalkboard.vec2.new(-drdt.y, drdt.x)) * Chalkboard.vec2.mag(drdt);
|
|
3327
4350
|
}
|
|
3328
4351
|
return result * dt;
|
|
3329
4352
|
} else if(func.definition.length === 3) {
|
|
3330
|
-
for(var t =
|
|
4353
|
+
for(var t = tinf; t <= tsup; t += dt) {
|
|
3331
4354
|
drdt = Chalkboard.calc.dfdx(func, t);
|
|
3332
4355
|
result += Chalkboard.vec3.dot(Chalkboard.vec3.fromField(vecfield, Chalkboard.real.val(func, t)), Chalkboard.calc.normal(func, t)) * Chalkboard.vec3.mag(drdt);
|
|
3333
4356
|
}
|
|
3334
4357
|
return result * dt;
|
|
3335
4358
|
}
|
|
3336
4359
|
} else if(func.type === "surf") {
|
|
3337
|
-
var dt = (
|
|
3338
|
-
ds = (
|
|
3339
|
-
for(var s =
|
|
3340
|
-
for(var t =
|
|
4360
|
+
var dt = (tsup - tinf) / 100,
|
|
4361
|
+
ds = (ssup - sinf) / 100;
|
|
4362
|
+
for(var s = sinf; s <= ssup; s += ds) {
|
|
4363
|
+
for(var t = tinf; t <= tsup; t += dt) {
|
|
3341
4364
|
drds = Chalkboard.matr.toVector(Chalkboard.calc.grad(func, Chalkboard.vec2.new(s, t)), "vec3", "col", 1);
|
|
3342
4365
|
drdt = Chalkboard.matr.toVector(Chalkboard.calc.grad(func, Chalkboard.vec2.new(s, t)), "vec3", "col", 2);
|
|
3343
4366
|
result += Chalkboard.vec3.scalarTriple(Chalkboard.vec3.fromField(vecfield, Chalkboard.real.val(func, Chalkboard.vec2.new(s, t))), drds, drdt);
|
|
@@ -3348,12 +4371,12 @@ var Chalkboard = {
|
|
|
3348
4371
|
return "TypeError: Parameter \"func\" must be of type \"curv\" or \"surf\".";
|
|
3349
4372
|
}
|
|
3350
4373
|
},
|
|
3351
|
-
fzdz: function(func_1, func_2,
|
|
4374
|
+
fzdz: function(func_1, func_2, inf, sup) {
|
|
3352
4375
|
if(func_1.type === "comp") {
|
|
3353
4376
|
if(func_2.type === "curv") {
|
|
3354
4377
|
var result = Chalkboard.comp.new(0, 0);
|
|
3355
|
-
var dt = (
|
|
3356
|
-
for(var t =
|
|
4378
|
+
var dt = (sup - inf) / 10000;
|
|
4379
|
+
for(var t = inf; t <= sup; t += dt) {
|
|
3357
4380
|
var fz = Chalkboard.comp.val(func_1, Chalkboard.vec2.toComplex(Chalkboard.real.val(func_2, t)));
|
|
3358
4381
|
var rt = Chalkboard.calc.dfdx(func_2, t);
|
|
3359
4382
|
result = Chalkboard.comp.add(result, Chalkboard.comp.new((fz.a * rt.x) - (fz.b * rt.y), (fz.b * rt.x) + (fz.a * rt.y)));
|