jsxgraph 1.3.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/distrib/README.md +2 -2
- package/distrib/geogebra.min.js +3 -3
- package/distrib/geonext.min.js +3 -3
- package/distrib/index.d.ts +651 -448
- package/distrib/intergeo.min.js +3 -3
- package/distrib/jsxgraph.css +4 -13
- package/distrib/jsxgraphcore.js +9 -25
- package/distrib/jsxgraphsrc.js +28203 -25234
- package/distrib/sketch.min.js +3 -3
- package/package.json +11 -22
- package/src/base/board.js +674 -469
- package/src/base/chart.js +1 -1
- package/src/base/circle.js +23 -1
- package/src/base/composition.js +1 -1
- package/src/base/constants.js +32 -11
- package/src/base/coords.js +4 -4
- package/src/base/coordselement.js +51 -24
- package/src/base/curve.js +308 -117
- package/src/base/element.js +79 -50
- package/src/base/foreignobject.js +463 -0
- package/src/base/group.js +2 -2
- package/src/base/image.js +12 -15
- package/src/base/line.js +108 -21
- package/src/base/point.js +24 -28
- package/src/base/polygon.js +75 -18
- package/src/base/text.js +116 -63
- package/src/base/ticks.js +29 -11
- package/src/base/transformation.js +1 -1
- package/src/base/turtle.js +1 -1
- package/src/element/arc.js +1 -1
- package/src/element/button.js +29 -2
- package/src/element/checkbox.js +31 -1
- package/src/element/comb.js +5 -2
- package/src/element/composition.js +127 -19
- package/src/element/conic.js +46 -5
- package/src/element/input.js +32 -1
- package/src/element/locus.js +2 -2
- package/src/element/measure.js +9 -4
- package/src/element/sector.js +46 -12
- package/src/element/slider.js +17 -12
- package/src/element/slopetriangle.js +1 -1
- package/src/jsxgraph.js +28 -9
- package/src/jxg.js +4 -3
- package/src/loadjsxgraph.js +3 -2
- package/src/math/bst.js +1 -1
- package/src/math/clip.js +550 -345
- package/src/math/complex.js +1 -1
- package/src/math/extrapolate.js +1 -1
- package/src/math/geometry.js +155 -126
- package/src/math/ia.js +290 -21
- package/src/math/math.js +30 -1
- package/src/math/metapost.js +1 -1
- package/src/math/nlp.js +25 -5
- package/src/math/numerics.js +183 -4
- package/src/math/plot.js +4 -4
- package/src/math/poly.js +1 -1
- package/src/math/probfuncs.js +2 -1
- package/src/math/qdt.js +68 -62
- package/src/math/statistics.js +58 -7
- package/src/math/symbolic.js +1 -1
- package/src/options.js +377 -114
- package/src/parser/ca.js +1297 -1291
- package/src/parser/datasource.js +1 -1
- package/src/parser/geonext.js +6 -6
- package/src/parser/jessiecode.js +275 -79
- package/src/parser/jessiescript.js +1 -1
- package/src/reader/cinderella.js +1 -1
- package/src/reader/file.js +1 -1
- package/src/reader/geogebra.js +1 -1
- package/src/reader/geonext.js +1 -1
- package/src/reader/graph.js +1 -1
- package/src/reader/intergeo.js +1 -1
- package/src/reader/sketch.js +21 -13
- package/src/renderer/abstract.js +21 -6
- package/src/renderer/canvas.js +22 -15
- package/src/renderer/no.js +11 -4
- package/src/renderer/svg.js +76 -53
- package/src/renderer/vml.js +36 -32
- package/src/server/server.js +1 -1
- package/src/utils/base64.js +2 -2
- package/src/utils/color.js +148 -3
- package/src/utils/dump.js +21 -15
- package/src/utils/env.js +63 -104
- package/src/utils/event.js +1 -1
- package/src/utils/expect.js +1 -1
- package/src/utils/type.js +30 -19
- package/src/utils/xml.js +1 -1
- package/src/utils/zip.js +1 -1
- package/CHANGELOG.md +0 -1281
package/src/math/ia.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
Copyright 2008-
|
|
2
|
+
Copyright 2008-2022
|
|
3
3
|
Matthias Ehmann,
|
|
4
4
|
Michael Gerhaeuser,
|
|
5
5
|
Carsten Miller,
|
|
@@ -171,10 +171,13 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
171
171
|
var doubleBits = new JXG.Math.DoubleBits(),
|
|
172
172
|
|
|
173
173
|
/**
|
|
174
|
-
*
|
|
174
|
+
* Interval for interval arithmetics. Consists of the properties
|
|
175
|
+
* <ul>
|
|
176
|
+
* <li>lo
|
|
177
|
+
* <li>hi
|
|
178
|
+
* </ul>
|
|
175
179
|
* @name JXG.Math.Interval
|
|
176
|
-
* @
|
|
177
|
-
* @namespace
|
|
180
|
+
* @type Object
|
|
178
181
|
*/
|
|
179
182
|
MatInterval = function (lo, hi) {
|
|
180
183
|
if (lo !== undefined && hi !== undefined) {
|
|
@@ -272,9 +275,8 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
272
275
|
});
|
|
273
276
|
|
|
274
277
|
/**
|
|
275
|
-
* Object for interval
|
|
276
|
-
* @name JXG.Math.
|
|
277
|
-
* @exports Mat.Interval as JXG.Math.Interval
|
|
278
|
+
* Object for interval arithmetics.
|
|
279
|
+
* @name JXG.Math.IntervalArithmetic
|
|
278
280
|
* @namespace
|
|
279
281
|
*/
|
|
280
282
|
JXG.Math.IntervalArithmetic = {
|
|
@@ -294,6 +296,14 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
294
296
|
/*
|
|
295
297
|
* Arithmetics
|
|
296
298
|
*/
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Addition
|
|
302
|
+
*
|
|
303
|
+
* @param {JXG.Math.Interval|Number} x
|
|
304
|
+
* @param {JXG.Math.Interval|Number} y
|
|
305
|
+
* @returns JXG.Math.Interval
|
|
306
|
+
*/
|
|
297
307
|
add: function(x, y) {
|
|
298
308
|
if (Type.isNumber(x)) {
|
|
299
309
|
x = this.Interval(x);
|
|
@@ -304,7 +314,14 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
304
314
|
return new MatInterval(this.addLo(x.lo, y.lo), this.addHi(x.hi, y.hi));
|
|
305
315
|
},
|
|
306
316
|
|
|
307
|
-
|
|
317
|
+
/**
|
|
318
|
+
* Subtraction
|
|
319
|
+
*
|
|
320
|
+
* @param {JXG.Math.Interval|Number} x
|
|
321
|
+
* @param {JXG.Math.Interval|Number} y
|
|
322
|
+
* @returns JXG.Math.Interval
|
|
323
|
+
*/
|
|
324
|
+
sub: function(x, y) {
|
|
308
325
|
if (Type.isNumber(x)) {
|
|
309
326
|
x = this.Interval(x);
|
|
310
327
|
}
|
|
@@ -314,7 +331,14 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
314
331
|
return new MatInterval(this.subLo(x.lo, y.hi), this.subHi(x.hi, y.lo));
|
|
315
332
|
},
|
|
316
333
|
|
|
317
|
-
|
|
334
|
+
/**
|
|
335
|
+
* Multiplication
|
|
336
|
+
*
|
|
337
|
+
* @param {JXG.Math.Interval|Number} x
|
|
338
|
+
* @param {JXG.Math.Interval|Number} y
|
|
339
|
+
* @returns JXG.Math.Interval
|
|
340
|
+
*/
|
|
341
|
+
mul: function(x, y) {
|
|
318
342
|
var xl, xh, yl, yh, out;
|
|
319
343
|
|
|
320
344
|
if (Type.isNumber(x)) {
|
|
@@ -411,7 +435,14 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
411
435
|
return out;
|
|
412
436
|
},
|
|
413
437
|
|
|
414
|
-
|
|
438
|
+
/**
|
|
439
|
+
* Division
|
|
440
|
+
*
|
|
441
|
+
* @param {JXG.Math.Interval|Number} x
|
|
442
|
+
* @param {JXG.Math.Interval|Number} y
|
|
443
|
+
* @returns JXG.Math.Interval
|
|
444
|
+
*/
|
|
445
|
+
div: function(x, y) {
|
|
415
446
|
if (Type.isNumber(x)) {
|
|
416
447
|
x = this.Interval(x);
|
|
417
448
|
}
|
|
@@ -437,11 +468,23 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
437
468
|
return this.divNonZero(x, y);
|
|
438
469
|
},
|
|
439
470
|
|
|
440
|
-
|
|
471
|
+
/**
|
|
472
|
+
* Return +x (i.e. identity)
|
|
473
|
+
*
|
|
474
|
+
* @param {JXG.Math.Interval} x
|
|
475
|
+
* @returns JXG.Math.Interval
|
|
476
|
+
*/
|
|
477
|
+
positive: function(x) {
|
|
441
478
|
return new MatInterval(x.lo, x.hi);
|
|
442
479
|
},
|
|
443
480
|
|
|
444
|
-
|
|
481
|
+
/**
|
|
482
|
+
* Return -x
|
|
483
|
+
*
|
|
484
|
+
* @param {JXG.Math.Interval} x
|
|
485
|
+
* @returns JXG.Math.Interval
|
|
486
|
+
*/
|
|
487
|
+
negative: function(x) {
|
|
445
488
|
if (Type.isNumber(x)) {
|
|
446
489
|
return new MatInterval(-x);
|
|
447
490
|
}
|
|
@@ -451,33 +494,67 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
451
494
|
/*
|
|
452
495
|
* Utils
|
|
453
496
|
*/
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* Test if interval is empty set.
|
|
500
|
+
* @param {JXG.Math.Interval} i
|
|
501
|
+
* @returns Boolean
|
|
502
|
+
*/
|
|
454
503
|
isEmpty: function(i) {
|
|
455
504
|
return i.lo > i.hi;
|
|
456
505
|
},
|
|
457
506
|
|
|
507
|
+
/**
|
|
508
|
+
* Test if interval is (-Infinity, Infinity).
|
|
509
|
+
* @param {JXG.Math.Interval} i
|
|
510
|
+
* @returns Boolean
|
|
511
|
+
*/
|
|
458
512
|
isWhole: function(i){
|
|
459
513
|
return i.lo === -Infinity && i.hi === Infinity;
|
|
460
514
|
},
|
|
461
515
|
|
|
462
|
-
|
|
516
|
+
/**
|
|
517
|
+
* Test if interval contains 0.
|
|
518
|
+
* @param {JXG.Math.Interval} i
|
|
519
|
+
* @returns Boolean
|
|
520
|
+
*/
|
|
521
|
+
zeroIn: function(i) {
|
|
463
522
|
return this.hasValue(i, 0);
|
|
464
523
|
},
|
|
465
524
|
|
|
466
|
-
|
|
525
|
+
/**
|
|
526
|
+
* Test if interval contains a specific value.
|
|
527
|
+
* @param {JXG.Math.Interval} i
|
|
528
|
+
* @param {Number} value
|
|
529
|
+
* @returns Boolean
|
|
530
|
+
*/
|
|
531
|
+
hasValue: function(i, value) {
|
|
467
532
|
if (this.isEmpty(i)) {
|
|
468
533
|
return false;
|
|
469
534
|
}
|
|
470
535
|
return i.lo <= value && value <= i.hi;
|
|
471
536
|
},
|
|
472
537
|
|
|
473
|
-
|
|
538
|
+
/**
|
|
539
|
+
* Test if interval x contains interval y.
|
|
540
|
+
* @param {JXG.Math.Interval} x
|
|
541
|
+
* @param {JXG.Math.Interval} y
|
|
542
|
+
* @returns Boolean
|
|
543
|
+
*/
|
|
544
|
+
hasInterval: function(x, y) {
|
|
474
545
|
if (this.isEmpty(x)) {
|
|
475
546
|
return true;
|
|
476
547
|
}
|
|
477
548
|
return !this.isEmpty(y) && y.lo <= x.lo && x.hi <= y.hi;
|
|
478
549
|
},
|
|
479
550
|
|
|
480
|
-
|
|
551
|
+
/**
|
|
552
|
+
* Test if intervals x and y have non-zero intersection.
|
|
553
|
+
* @param {JXG.Math.Interval} x
|
|
554
|
+
* @param {JXG.Math.Interval} y
|
|
555
|
+
* @returns Boolean
|
|
556
|
+
*/
|
|
557
|
+
intervalsOverlap: function(x, y) {
|
|
481
558
|
if (this.isEmpty(x) || this.isEmpty(y)) {
|
|
482
559
|
return false;
|
|
483
560
|
}
|
|
@@ -487,6 +564,12 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
487
564
|
/*
|
|
488
565
|
* Division
|
|
489
566
|
*/
|
|
567
|
+
/**
|
|
568
|
+
* @private
|
|
569
|
+
* @param {JXG.Math.Interval} x
|
|
570
|
+
* @param {JXG.Math.Interval} y
|
|
571
|
+
* @returns JXG.Math.Interval
|
|
572
|
+
*/
|
|
490
573
|
divNonZero: function(x, y) {
|
|
491
574
|
var xl = x.lo,
|
|
492
575
|
xh = x.hi,
|
|
@@ -522,7 +605,13 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
522
605
|
return out;
|
|
523
606
|
},
|
|
524
607
|
|
|
525
|
-
|
|
608
|
+
/**
|
|
609
|
+
* @private
|
|
610
|
+
* @param {JXG.Math.Interval} x
|
|
611
|
+
* @param {JXG.Math.Interval} y
|
|
612
|
+
* @returns JXG.Math.Interval
|
|
613
|
+
*/
|
|
614
|
+
divPositive: function(x, v) {
|
|
526
615
|
if (x.lo === 0 && x.hi === 0) {
|
|
527
616
|
return x;
|
|
528
617
|
}
|
|
@@ -540,7 +629,13 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
540
629
|
return new MatInterval(this.divLo(x.lo, v), Number.POSITIVE_INFINITY);
|
|
541
630
|
},
|
|
542
631
|
|
|
543
|
-
|
|
632
|
+
/**
|
|
633
|
+
* @private
|
|
634
|
+
* @param {JXG.Math.Interval} x
|
|
635
|
+
* @param {JXG.Math.Interval} y
|
|
636
|
+
* @returns JXG.Math.Interval
|
|
637
|
+
*/
|
|
638
|
+
divNegative: function(x, v) {
|
|
544
639
|
if (x.lo === 0 && x.hi === 0) {
|
|
545
640
|
return x;
|
|
546
641
|
}
|
|
@@ -558,7 +653,12 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
558
653
|
return new MatInterval(Number.NEGATIVE_INFINITY, this.divHi(x.lo, v));
|
|
559
654
|
},
|
|
560
655
|
|
|
561
|
-
|
|
656
|
+
/**
|
|
657
|
+
* @private
|
|
658
|
+
* @param {JXG.Math.Interval} x
|
|
659
|
+
* @returns JXG.Math.Interval
|
|
660
|
+
*/
|
|
661
|
+
divZero: function(x) {
|
|
562
662
|
if (x.lo === 0 && x.hi === 0) {
|
|
563
663
|
return x;
|
|
564
664
|
}
|
|
@@ -568,6 +668,12 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
568
668
|
/*
|
|
569
669
|
* Algebra
|
|
570
670
|
*/
|
|
671
|
+
/**
|
|
672
|
+
* x mod y: x - n * y
|
|
673
|
+
* @param {JXG.Math.Interval|Number} x
|
|
674
|
+
* @param {JXG.Math.Interval|Number} y
|
|
675
|
+
* @returns JXG.Math.Interval
|
|
676
|
+
*/
|
|
571
677
|
fmod: function(x, y) {
|
|
572
678
|
var yb, n;
|
|
573
679
|
if (Type.isNumber(x)) {
|
|
@@ -590,6 +696,11 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
590
696
|
return this.sub(x, this.mul(y, new MatInterval(n)));
|
|
591
697
|
},
|
|
592
698
|
|
|
699
|
+
/**
|
|
700
|
+
* 1 / x
|
|
701
|
+
* @param {JXG.Math.Interval|Number} x
|
|
702
|
+
* @returns JXG.Math.Interval
|
|
703
|
+
*/
|
|
593
704
|
multiplicativeInverse: function(x) {
|
|
594
705
|
if (Type.isNumber(x)) {
|
|
595
706
|
x = this.Interval(x);
|
|
@@ -617,6 +728,12 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
617
728
|
return new MatInterval(this.divLo(1, x.hi), this.divHi(1, x.lo));
|
|
618
729
|
},
|
|
619
730
|
|
|
731
|
+
/**
|
|
732
|
+
* x<sup>power</sup>
|
|
733
|
+
* @param {JXG.Math.Interval|Number} x
|
|
734
|
+
* @param {JXG.Math.Interval|Number} power
|
|
735
|
+
* @returns JXG.Math.Interval
|
|
736
|
+
*/
|
|
620
737
|
pow: function(x, power) {
|
|
621
738
|
var yl, yh;
|
|
622
739
|
|
|
@@ -678,13 +795,24 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
678
795
|
return this.EMPTY.clone();
|
|
679
796
|
},
|
|
680
797
|
|
|
681
|
-
|
|
798
|
+
/**
|
|
799
|
+
* sqrt(x)
|
|
800
|
+
* @param {JXG.Math.Interval|Number} x
|
|
801
|
+
* @returns JXG.Math.Interval
|
|
802
|
+
*/
|
|
803
|
+
sqrt: function(x) {
|
|
682
804
|
if (Type.isNumber(x)) {
|
|
683
805
|
x = this.Interval(x);
|
|
684
806
|
}
|
|
685
807
|
return this.nthRoot(x, 2);
|
|
686
808
|
},
|
|
687
809
|
|
|
810
|
+
/**
|
|
811
|
+
* x<sup>1/n</sup>
|
|
812
|
+
* @param {JXG.Math.Interval|Number} x
|
|
813
|
+
* @param {Number} n
|
|
814
|
+
* @returns JXG.Math.Interval
|
|
815
|
+
*/
|
|
688
816
|
nthRoot: function(x, n) {
|
|
689
817
|
var power,yl, yh, yp, yn;
|
|
690
818
|
|
|
@@ -736,6 +864,11 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
736
864
|
/*
|
|
737
865
|
* Misc
|
|
738
866
|
*/
|
|
867
|
+
/**
|
|
868
|
+
*
|
|
869
|
+
* @param {JXG.Math.Interval|Number} x
|
|
870
|
+
* @returns JXG.Math.Interval
|
|
871
|
+
*/
|
|
739
872
|
exp: function(x) {
|
|
740
873
|
if (Type.isNumber(x)) {
|
|
741
874
|
x = this.Interval(x);
|
|
@@ -746,6 +879,11 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
746
879
|
return new MatInterval(this.expLo(x.lo), this.expHi(x.hi));
|
|
747
880
|
},
|
|
748
881
|
|
|
882
|
+
/**
|
|
883
|
+
* Natural log
|
|
884
|
+
* @param {JXG.Math.Interval|Number} x
|
|
885
|
+
* @returns JXG.Math.Interval
|
|
886
|
+
*/
|
|
749
887
|
log: function(x) {
|
|
750
888
|
var l;
|
|
751
889
|
if (Type.isNumber(x)) {
|
|
@@ -758,12 +896,22 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
758
896
|
return new MatInterval(l, this.logHi(x.hi));
|
|
759
897
|
},
|
|
760
898
|
|
|
899
|
+
/**
|
|
900
|
+
* Natural log, alias for {@link JXG.Math.IntervalArithmetic#log}.
|
|
901
|
+
* @param {JXG.Math.Interval|Number} x
|
|
902
|
+
* @returns JXG.Math.Interval
|
|
903
|
+
*/
|
|
761
904
|
ln: function(x) {
|
|
762
905
|
return this.log(x);
|
|
763
906
|
},
|
|
764
907
|
|
|
765
908
|
// export const LOG_EXP_10 = this.log(new MatInterval(10, 10))
|
|
766
909
|
// export const LOG_EXP_2 = log(new MatInterval(2, 2))
|
|
910
|
+
/**
|
|
911
|
+
* Logarithm to base 10.
|
|
912
|
+
* @param {JXG.Math.Interval|Number} x
|
|
913
|
+
* @returns JXG.Math.Interval
|
|
914
|
+
*/
|
|
767
915
|
log10: function(x) {
|
|
768
916
|
if (this.isEmpty(x)) {
|
|
769
917
|
return this.EMPTY.clone();
|
|
@@ -771,6 +919,11 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
771
919
|
return this.div(this.log(x), this.log(new MatInterval(10, 10)));
|
|
772
920
|
},
|
|
773
921
|
|
|
922
|
+
/**
|
|
923
|
+
* Logarithm to base 2.
|
|
924
|
+
* @param {JXG.Math.Interval|Number} x
|
|
925
|
+
* @returns JXG.Math.Interval
|
|
926
|
+
*/
|
|
774
927
|
log2: function(x) {
|
|
775
928
|
if (this.isEmpty(x)) {
|
|
776
929
|
return this.EMPTY.clone();
|
|
@@ -778,6 +931,12 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
778
931
|
return this.div(this.log(x), this.log(new MatInterval(2, 2)));
|
|
779
932
|
},
|
|
780
933
|
|
|
934
|
+
/**
|
|
935
|
+
* Hull of intervals x and y
|
|
936
|
+
* @param {JXG.Math.Interval} x
|
|
937
|
+
* @param {JXG.Math.Interval} y
|
|
938
|
+
* @returns JXG.Math.Interval
|
|
939
|
+
*/
|
|
781
940
|
hull: function(x, y) {
|
|
782
941
|
var badX = this.isEmpty(x),
|
|
783
942
|
badY = this.isEmpty(y);
|
|
@@ -793,6 +952,12 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
793
952
|
return new MatInterval(Math.min(x.lo, y.lo), Math.max(x.hi, y.hi));
|
|
794
953
|
},
|
|
795
954
|
|
|
955
|
+
/**
|
|
956
|
+
* Intersection of intervals x and y
|
|
957
|
+
* @param {JXG.Math.Interval} x
|
|
958
|
+
* @param {JXG.Math.Interval} y
|
|
959
|
+
* @returns JXG.Math.Interval
|
|
960
|
+
*/
|
|
796
961
|
intersection: function(x, y) {
|
|
797
962
|
var lo, hi;
|
|
798
963
|
if (this.isEmpty(x) || this.isEmpty(y)) {
|
|
@@ -806,6 +971,12 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
806
971
|
return this.EMPTY.clone();
|
|
807
972
|
},
|
|
808
973
|
|
|
974
|
+
/**
|
|
975
|
+
* Union of overlapping intervals x and y
|
|
976
|
+
* @param {JXG.Math.Interval} x
|
|
977
|
+
* @param {JXG.Math.Interval} y
|
|
978
|
+
* @returns JXG.Math.Interval
|
|
979
|
+
*/
|
|
809
980
|
union: function(x, y) {
|
|
810
981
|
if (!this.intervalsOverlap(x, y)) {
|
|
811
982
|
throw new Error('Interval#unions do not overlap');
|
|
@@ -813,6 +984,12 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
813
984
|
return new MatInterval(Math.min(x.lo, y.lo), Math.max(x.hi, y.hi));
|
|
814
985
|
},
|
|
815
986
|
|
|
987
|
+
/**
|
|
988
|
+
* Difference of overlapping intervals x and y
|
|
989
|
+
* @param {JXG.Math.Interval} x
|
|
990
|
+
* @param {JXG.Math.Interval} y
|
|
991
|
+
* @returns JXG.Math.Interval
|
|
992
|
+
*/
|
|
816
993
|
difference: function(x, y) {
|
|
817
994
|
if (this.isEmpty(x) || this.isWhole(y)) {
|
|
818
995
|
return this.EMPTY.clone();
|
|
@@ -844,6 +1021,10 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
844
1021
|
return x.clone();
|
|
845
1022
|
},
|
|
846
1023
|
|
|
1024
|
+
/**
|
|
1025
|
+
* @param {JXG.Math.Interval} x
|
|
1026
|
+
* @returns JXG.Math.Interval
|
|
1027
|
+
*/
|
|
847
1028
|
width: function(x) {
|
|
848
1029
|
if (this.isEmpty(x)) {
|
|
849
1030
|
return 0;
|
|
@@ -851,6 +1032,10 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
851
1032
|
return this.subHi(x.hi, x.lo);
|
|
852
1033
|
},
|
|
853
1034
|
|
|
1035
|
+
/**
|
|
1036
|
+
* @param {JXG.Math.Interval} x
|
|
1037
|
+
* @returns JXG.Math.Interval
|
|
1038
|
+
*/
|
|
854
1039
|
abs: function(x) {
|
|
855
1040
|
if (Type.isNumber(x)) {
|
|
856
1041
|
x = this.Interval(x);
|
|
@@ -867,6 +1052,11 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
867
1052
|
return new MatInterval(0, Math.max(-x.lo, x.hi));
|
|
868
1053
|
},
|
|
869
1054
|
|
|
1055
|
+
/**
|
|
1056
|
+
* @param {JXG.Math.Interval} x
|
|
1057
|
+
* @param {JXG.Math.Interval} y
|
|
1058
|
+
* @returns JXG.Math.Interval
|
|
1059
|
+
*/
|
|
870
1060
|
max: function(x, y) {
|
|
871
1061
|
var badX = this.isEmpty(x),
|
|
872
1062
|
badY = this.isEmpty(y);
|
|
@@ -882,6 +1072,11 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
882
1072
|
return new MatInterval(Math.max(x.lo, y.lo), Math.max(x.hi, y.hi));
|
|
883
1073
|
},
|
|
884
1074
|
|
|
1075
|
+
/**
|
|
1076
|
+
* @param {JXG.Math.Interval} x
|
|
1077
|
+
* @param {JXG.Math.Interval} y
|
|
1078
|
+
* @returns JXG.Math.Interval
|
|
1079
|
+
*/
|
|
885
1080
|
min: function(x, y) {
|
|
886
1081
|
var badX = this.isEmpty(x),
|
|
887
1082
|
badY = this.isEmpty(y);
|
|
@@ -919,6 +1114,10 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
919
1114
|
return interval;
|
|
920
1115
|
},
|
|
921
1116
|
|
|
1117
|
+
/**
|
|
1118
|
+
* @param {JXG.Math.Interval} x
|
|
1119
|
+
* @returns JXG.Math.Interval
|
|
1120
|
+
*/
|
|
922
1121
|
cos: function(x) {
|
|
923
1122
|
var cache, pi2, t, cosv,
|
|
924
1123
|
lo, hi, rlo, rhi;
|
|
@@ -963,6 +1162,10 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
963
1162
|
return new MatInterval(-1, 1);
|
|
964
1163
|
},
|
|
965
1164
|
|
|
1165
|
+
/**
|
|
1166
|
+
* @param {JXG.Math.Interval} x
|
|
1167
|
+
* @returns JXG.Math.Interval
|
|
1168
|
+
*/
|
|
966
1169
|
sin: function(x) {
|
|
967
1170
|
if (this.isEmpty(x) || this.onlyInfinity(x)) {
|
|
968
1171
|
return this.EMPTY.clone();
|
|
@@ -970,6 +1173,10 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
970
1173
|
return this.cos(this.sub(x, this.PI_HALF));
|
|
971
1174
|
},
|
|
972
1175
|
|
|
1176
|
+
/**
|
|
1177
|
+
* @param {JXG.Math.Interval} x
|
|
1178
|
+
* @returns JXG.Math.Interval
|
|
1179
|
+
*/
|
|
973
1180
|
tan: function(x) {
|
|
974
1181
|
var cache, t, pi;
|
|
975
1182
|
if (this.isEmpty(x) || this.onlyInfinity(x)) {
|
|
@@ -991,6 +1198,10 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
991
1198
|
return new MatInterval(this.tanLo(t.lo), this.tanHi(t.hi));
|
|
992
1199
|
},
|
|
993
1200
|
|
|
1201
|
+
/**
|
|
1202
|
+
* @param {JXG.Math.Interval} x
|
|
1203
|
+
* @returns JXG.Math.Interval
|
|
1204
|
+
*/
|
|
994
1205
|
asin: function(x) {
|
|
995
1206
|
var lo, hi;
|
|
996
1207
|
if (this.isEmpty(x) || x.hi < -1 || x.lo > 1) {
|
|
@@ -1001,6 +1212,10 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
1001
1212
|
return new MatInterval(lo, hi);
|
|
1002
1213
|
},
|
|
1003
1214
|
|
|
1215
|
+
/**
|
|
1216
|
+
* @param {JXG.Math.Interval} x
|
|
1217
|
+
* @returns JXG.Math.Interval
|
|
1218
|
+
*/
|
|
1004
1219
|
acos: function(x) {
|
|
1005
1220
|
var lo, hi;
|
|
1006
1221
|
if (this.isEmpty(x) || x.hi < -1 || x.lo > 1) {
|
|
@@ -1011,6 +1226,10 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
1011
1226
|
return new MatInterval(lo, hi);
|
|
1012
1227
|
},
|
|
1013
1228
|
|
|
1229
|
+
/**
|
|
1230
|
+
* @param {JXG.Math.Interval} x
|
|
1231
|
+
* @returns JXG.Math.Interval
|
|
1232
|
+
*/
|
|
1014
1233
|
atan: function(x) {
|
|
1015
1234
|
if (this.isEmpty(x)) {
|
|
1016
1235
|
return this.EMPTY.clone();
|
|
@@ -1018,6 +1237,10 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
1018
1237
|
return new MatInterval(this.atanLo(x.lo), this.atanHi(x.hi));
|
|
1019
1238
|
},
|
|
1020
1239
|
|
|
1240
|
+
/**
|
|
1241
|
+
* @param {JXG.Math.Interval} x
|
|
1242
|
+
* @returns JXG.Math.Interval
|
|
1243
|
+
*/
|
|
1021
1244
|
sinh: function(x) {
|
|
1022
1245
|
if (this.isEmpty(x)) {
|
|
1023
1246
|
return this.EMPTY.clone();
|
|
@@ -1025,6 +1248,10 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
1025
1248
|
return new MatInterval(this.sinhLo(x.lo), this.sinhHi(x.hi));
|
|
1026
1249
|
},
|
|
1027
1250
|
|
|
1251
|
+
/**
|
|
1252
|
+
* @param {JXG.Math.Interval} x
|
|
1253
|
+
* @returns JXG.Math.Interval
|
|
1254
|
+
*/
|
|
1028
1255
|
cosh: function(x) {
|
|
1029
1256
|
if (this.isEmpty(x)) {
|
|
1030
1257
|
return this.EMPTY.clone();
|
|
@@ -1038,6 +1265,10 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
1038
1265
|
return new MatInterval(1, this.coshHi(-x.lo > x.hi ? x.lo : x.hi));
|
|
1039
1266
|
},
|
|
1040
1267
|
|
|
1268
|
+
/**
|
|
1269
|
+
* @param {JXG.Math.Interval} x
|
|
1270
|
+
* @returns JXG.Math.Interval
|
|
1271
|
+
*/
|
|
1041
1272
|
tanh: function(x) {
|
|
1042
1273
|
if (this.isEmpty(x)) {
|
|
1043
1274
|
return this.EMPTY.clone();
|
|
@@ -1049,6 +1280,11 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
1049
1280
|
* Relational
|
|
1050
1281
|
*/
|
|
1051
1282
|
|
|
1283
|
+
/**
|
|
1284
|
+
* @param {JXG.Math.Interval} x
|
|
1285
|
+
* @param {JXG.Math.Interval} y
|
|
1286
|
+
* @returns Boolean
|
|
1287
|
+
*/
|
|
1052
1288
|
equal: function(x, y) {
|
|
1053
1289
|
if (this.isEmpty(x)) {
|
|
1054
1290
|
return this.isEmpty(y);
|
|
@@ -1063,6 +1299,11 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
1063
1299
|
// assertEps(x[1], y[1])
|
|
1064
1300
|
// },
|
|
1065
1301
|
|
|
1302
|
+
/**
|
|
1303
|
+
* @param {JXG.Math.Interval} x
|
|
1304
|
+
* @param {JXG.Math.Interval} y
|
|
1305
|
+
* @returns Boolean
|
|
1306
|
+
*/
|
|
1066
1307
|
notEqual: function(x, y) {
|
|
1067
1308
|
if (this.isEmpty(x)) {
|
|
1068
1309
|
return !this.isEmpty(y);
|
|
@@ -1070,6 +1311,11 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
1070
1311
|
return this.isEmpty(y) || x.hi < y.lo || x.lo > y.hi;
|
|
1071
1312
|
},
|
|
1072
1313
|
|
|
1314
|
+
/**
|
|
1315
|
+
* @param {JXG.Math.Interval} x
|
|
1316
|
+
* @param {JXG.Math.Interval} y
|
|
1317
|
+
* @returns Boolean
|
|
1318
|
+
*/
|
|
1073
1319
|
lt: function(x, y) {
|
|
1074
1320
|
if (Type.isNumber(x)) {
|
|
1075
1321
|
x = this.Interval(x);
|
|
@@ -1083,6 +1329,11 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
1083
1329
|
return x.hi < y.lo;
|
|
1084
1330
|
},
|
|
1085
1331
|
|
|
1332
|
+
/**
|
|
1333
|
+
* @param {JXG.Math.Interval} x
|
|
1334
|
+
* @param {JXG.Math.Interval} y
|
|
1335
|
+
* @returns Boolean
|
|
1336
|
+
*/
|
|
1086
1337
|
gt: function(x, y) {
|
|
1087
1338
|
if (Type.isNumber(x)) {
|
|
1088
1339
|
x = this.Interval(x);
|
|
@@ -1096,6 +1347,11 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
1096
1347
|
return x.lo > y.hi;
|
|
1097
1348
|
},
|
|
1098
1349
|
|
|
1350
|
+
/**
|
|
1351
|
+
* @param {JXG.Math.Interval} x
|
|
1352
|
+
* @param {JXG.Math.Interval} y
|
|
1353
|
+
* @returns Boolean
|
|
1354
|
+
*/
|
|
1099
1355
|
leq: function(x, y) {
|
|
1100
1356
|
if (Type.isNumber(x)) {
|
|
1101
1357
|
x = this.Interval(x);
|
|
@@ -1109,6 +1365,11 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
1109
1365
|
return x.hi <= y.lo;
|
|
1110
1366
|
},
|
|
1111
1367
|
|
|
1368
|
+
/**
|
|
1369
|
+
* @param {JXG.Math.Interval} x
|
|
1370
|
+
* @param {JXG.Math.Interval} y
|
|
1371
|
+
* @returns Boolean
|
|
1372
|
+
*/
|
|
1112
1373
|
geq: function(x, y) {
|
|
1113
1374
|
if (Type.isNumber(x)) {
|
|
1114
1375
|
x = this.Interval(x);
|
|
@@ -1239,11 +1500,19 @@ define(['jxg', 'math/math', 'utils/type'], function (JXG, Mat, Type) {
|
|
|
1239
1500
|
return y;
|
|
1240
1501
|
},
|
|
1241
1502
|
|
|
1503
|
+
/**
|
|
1504
|
+
* @ignore
|
|
1505
|
+
* @private
|
|
1506
|
+
*/
|
|
1242
1507
|
disable: function() {
|
|
1243
1508
|
this.next = this.prev = this.identity;
|
|
1244
1509
|
},
|
|
1245
1510
|
|
|
1246
|
-
|
|
1511
|
+
/**
|
|
1512
|
+
* @ignore
|
|
1513
|
+
* @private
|
|
1514
|
+
*/
|
|
1515
|
+
enable: function() {
|
|
1247
1516
|
this.prev = function(v) {
|
|
1248
1517
|
return this._prev(v);
|
|
1249
1518
|
};
|
package/src/math/math.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
Copyright 2008-
|
|
2
|
+
Copyright 2008-2022
|
|
3
3
|
Matthias Ehmann,
|
|
4
4
|
Michael Gerhaeuser,
|
|
5
5
|
Carsten Miller,
|
|
@@ -1053,6 +1053,35 @@ define(['jxg', 'utils/type'], function (JXG, Type) {
|
|
|
1053
1053
|
}
|
|
1054
1054
|
|
|
1055
1055
|
return v;
|
|
1056
|
+
},
|
|
1057
|
+
|
|
1058
|
+
/**
|
|
1059
|
+
* Theorem of Vieta: Given a set of simple zeroes x_0, ..., x_n
|
|
1060
|
+
* of a polynomial f, compute the coefficients s_k, (k=0,...,n-1)
|
|
1061
|
+
* of the polynomial of the form. See {@link https://de.wikipedia.org/wiki/Elementarsymmetrisches_Polynom}.
|
|
1062
|
+
* <p>
|
|
1063
|
+
* f(x) = (x-x_0)*...*(x-x_n) =
|
|
1064
|
+
* x^n + sum_{k=1}^{n} (-1)^(k) s_{k-1} x^(n-k)
|
|
1065
|
+
* </p>
|
|
1066
|
+
* @param {Array} x Simple zeroes of the polynomial.
|
|
1067
|
+
* @returns {Array} Coefficients of the polynomial.
|
|
1068
|
+
*
|
|
1069
|
+
*/
|
|
1070
|
+
Vieta: function(x) {
|
|
1071
|
+
var n = x.length,
|
|
1072
|
+
s = [],
|
|
1073
|
+
m, k, y;
|
|
1074
|
+
|
|
1075
|
+
s = x.slice();
|
|
1076
|
+
for (m = 1; m < n; ++m) {
|
|
1077
|
+
y = s[m];
|
|
1078
|
+
s[m] *= s[m - 1];
|
|
1079
|
+
for (k = m - 1; k >= 1; --k) {
|
|
1080
|
+
s[k] += s[k - 1] * y;
|
|
1081
|
+
}
|
|
1082
|
+
s[0] += y;
|
|
1083
|
+
}
|
|
1084
|
+
return s;
|
|
1056
1085
|
}
|
|
1057
1086
|
};
|
|
1058
1087
|
|
package/src/math/metapost.js
CHANGED