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.
Files changed (90) hide show
  1. package/README.md +2 -2
  2. package/distrib/README.md +2 -2
  3. package/distrib/geogebra.min.js +3 -3
  4. package/distrib/geonext.min.js +3 -3
  5. package/distrib/index.d.ts +651 -448
  6. package/distrib/intergeo.min.js +3 -3
  7. package/distrib/jsxgraph.css +4 -13
  8. package/distrib/jsxgraphcore.js +9 -25
  9. package/distrib/jsxgraphsrc.js +28203 -25234
  10. package/distrib/sketch.min.js +3 -3
  11. package/package.json +11 -22
  12. package/src/base/board.js +674 -469
  13. package/src/base/chart.js +1 -1
  14. package/src/base/circle.js +23 -1
  15. package/src/base/composition.js +1 -1
  16. package/src/base/constants.js +32 -11
  17. package/src/base/coords.js +4 -4
  18. package/src/base/coordselement.js +51 -24
  19. package/src/base/curve.js +308 -117
  20. package/src/base/element.js +79 -50
  21. package/src/base/foreignobject.js +463 -0
  22. package/src/base/group.js +2 -2
  23. package/src/base/image.js +12 -15
  24. package/src/base/line.js +108 -21
  25. package/src/base/point.js +24 -28
  26. package/src/base/polygon.js +75 -18
  27. package/src/base/text.js +116 -63
  28. package/src/base/ticks.js +29 -11
  29. package/src/base/transformation.js +1 -1
  30. package/src/base/turtle.js +1 -1
  31. package/src/element/arc.js +1 -1
  32. package/src/element/button.js +29 -2
  33. package/src/element/checkbox.js +31 -1
  34. package/src/element/comb.js +5 -2
  35. package/src/element/composition.js +127 -19
  36. package/src/element/conic.js +46 -5
  37. package/src/element/input.js +32 -1
  38. package/src/element/locus.js +2 -2
  39. package/src/element/measure.js +9 -4
  40. package/src/element/sector.js +46 -12
  41. package/src/element/slider.js +17 -12
  42. package/src/element/slopetriangle.js +1 -1
  43. package/src/jsxgraph.js +28 -9
  44. package/src/jxg.js +4 -3
  45. package/src/loadjsxgraph.js +3 -2
  46. package/src/math/bst.js +1 -1
  47. package/src/math/clip.js +550 -345
  48. package/src/math/complex.js +1 -1
  49. package/src/math/extrapolate.js +1 -1
  50. package/src/math/geometry.js +155 -126
  51. package/src/math/ia.js +290 -21
  52. package/src/math/math.js +30 -1
  53. package/src/math/metapost.js +1 -1
  54. package/src/math/nlp.js +25 -5
  55. package/src/math/numerics.js +183 -4
  56. package/src/math/plot.js +4 -4
  57. package/src/math/poly.js +1 -1
  58. package/src/math/probfuncs.js +2 -1
  59. package/src/math/qdt.js +68 -62
  60. package/src/math/statistics.js +58 -7
  61. package/src/math/symbolic.js +1 -1
  62. package/src/options.js +377 -114
  63. package/src/parser/ca.js +1297 -1291
  64. package/src/parser/datasource.js +1 -1
  65. package/src/parser/geonext.js +6 -6
  66. package/src/parser/jessiecode.js +275 -79
  67. package/src/parser/jessiescript.js +1 -1
  68. package/src/reader/cinderella.js +1 -1
  69. package/src/reader/file.js +1 -1
  70. package/src/reader/geogebra.js +1 -1
  71. package/src/reader/geonext.js +1 -1
  72. package/src/reader/graph.js +1 -1
  73. package/src/reader/intergeo.js +1 -1
  74. package/src/reader/sketch.js +21 -13
  75. package/src/renderer/abstract.js +21 -6
  76. package/src/renderer/canvas.js +22 -15
  77. package/src/renderer/no.js +11 -4
  78. package/src/renderer/svg.js +76 -53
  79. package/src/renderer/vml.js +36 -32
  80. package/src/server/server.js +1 -1
  81. package/src/utils/base64.js +2 -2
  82. package/src/utils/color.js +148 -3
  83. package/src/utils/dump.js +21 -15
  84. package/src/utils/env.js +63 -104
  85. package/src/utils/event.js +1 -1
  86. package/src/utils/expect.js +1 -1
  87. package/src/utils/type.js +30 -19
  88. package/src/utils/xml.js +1 -1
  89. package/src/utils/zip.js +1 -1
  90. package/CHANGELOG.md +0 -1281
package/src/math/ia.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*
2
- Copyright 2008-2021
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
- * Object for interval arithmetic
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
- * @exports MatInterval as JXG.Math.Interval
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 arithmetic
276
- * @name JXG.Math.Interval
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
- sub: function(x, y) {
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
- mul: function(x, y) {
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
- div: function(x, y) {
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
- positive: function(x) {
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
- negative: function(x) {
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
- zeroIn: function(i) {
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
- hasValue: function(i, value) {
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
- hasInterval: function(x, y) {
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
- intervalsOverlap: function(x, y) {
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
- divPositive: function(x, v) {
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
- divNegative: function(x, v) {
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
- divZero: function(x) {
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
- sqrt: function(x) {
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
- enable: function() {
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-2021
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
 
@@ -1,5 +1,5 @@
1
1
  /*
2
- Copyright 2008-2021
2
+ Copyright 2008-2022
3
3
  Matthias Ehmann,
4
4
  Michael Gerhaeuser,
5
5
  Carsten Miller,