_base.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. // AMD-ID "dojox/math/_base"
  2. define("dojox/math/_base", ["dojo", "dojox"], function(dojo, dojox) {
  3. dojo.getObject("math", true, dojox);
  4. var m = dojox.math;
  5. dojo.mixin(dojox.math, {
  6. toRadians: function(/* Number */n){
  7. // summary:
  8. // Convert the passed number to radians.
  9. return (n*Math.PI)/180; // Number
  10. },
  11. toDegrees: function(/* Number */n){
  12. // summary:
  13. // Convert the passed number to degrees.
  14. return (n*180)/Math.PI; // Number
  15. },
  16. degreesToRadians: function(/* Number */n){
  17. // summary:
  18. // Deprecated. Use dojox.math.toRadians.
  19. return m.toRadians(n); // Number
  20. },
  21. radiansToDegrees: function(/* Number */n){
  22. // summary:
  23. // Deprecated. Use dojox.math.toDegrees.
  24. return m.toDegrees(n); // Number
  25. },
  26. _gamma: function(z){
  27. // summary:
  28. // Compute the gamma function for the passed number.
  29. // Approximately 14 dijits of precision with non-integers.
  30. var answer = 1; // 0!
  31. // gamma(n+1) = n * gamma(n)
  32. while (--z >= 1){
  33. answer *= z;
  34. }
  35. if(z == 0){ return answer; } // normal integer quick return
  36. if(Math.floor(z) == z){ return NaN; } // undefined at nonpositive integers since sin() below will return 0
  37. // assert: z < 1, remember this z is really z-1
  38. if(z == -0.5){ return Math.sqrt(Math.PI); } // popular gamma(1/2)
  39. if(z < -0.5){ // remember this z is really z-1
  40. return Math.PI / (Math.sin(Math.PI * (z + 1)) * this._gamma(-z)); // reflection
  41. }
  42. // assert: -0.5 < z < 1
  43. // Spouge approximation algorithm
  44. var a = 13;
  45. // c[0] = sqrt(2*PI) / exp(a)
  46. // var kfact = 1
  47. // for (var k=1; k < a; k++){
  48. // c[k] = pow(-k + a, k - 0.5) * exp(-k) / kfact
  49. // kfact *= -k // (-1)^(k-1) * (k-1)!
  50. // }
  51. var c = [ // precomputed from the above algorithm
  52. 5.6658056015186327e-6,
  53. 1.2743717663379679,
  54. -4.9374199093155115,
  55. 7.8720267032485961,
  56. -6.6760503749436087,
  57. 3.2525298444485167,
  58. -9.1852521441026269e-1,
  59. 1.4474022977730785e-1,
  60. -1.1627561382389853e-2,
  61. 4.0117980757066622e-4,
  62. -4.2652458386405744e-6,
  63. 6.6651913290336086e-9,
  64. -1.5392547381874824e-13
  65. ];
  66. var sum = c[0];
  67. for (var k=1; k < a; k++){
  68. sum += c[k] / (z + k);
  69. }
  70. return answer * Math.pow(z + a, z + 0.5) / Math.exp(z) * sum;
  71. },
  72. factorial: function(/* Number */n){
  73. // summary:
  74. // Return the factorial of n
  75. return this._gamma(n+1); // Number
  76. },
  77. permutations: function(/* Number */n, /* Number */k){
  78. // summary:
  79. // TODO
  80. if(n==0 || k==0){
  81. return 1; // Number
  82. }
  83. return this.factorial(n) / this.factorial(n-k);
  84. },
  85. combinations: function(/* Number */n, /* Number */r){
  86. // summary:
  87. // TODO
  88. if(n==0 || r==0){
  89. return 1; // Number
  90. }
  91. return this.factorial(n) / (this.factorial(n-r) * this.factorial(r)); // Number
  92. },
  93. bernstein: function(/* Number */t, /* Number */n, /* Number */ i){
  94. // summary:
  95. // TODO
  96. return this.combinations(n, i) * Math.pow(t, i) * Math.pow(1-t, n-i); // Number
  97. },
  98. gaussian: function(){
  99. // summary:
  100. // Return a random number based on the Gaussian algo.
  101. var k=2;
  102. do{
  103. var i=2*Math.random()-1;
  104. var j=2*Math.random()-1;
  105. k = i*i+j*j;
  106. }while(k>=1);
  107. return i * Math.sqrt((-2*Math.log(k))/k); // Number
  108. },
  109. // create a range of numbers
  110. range: function(/* Number */a, /* Number? */b, /* Number? */step){
  111. // summary:
  112. // Create a range of numbers based on the parameters.
  113. if(arguments.length<2){
  114. b=a,a=0;
  115. }
  116. var range=[], s=step||1, i;
  117. if(s>0){
  118. for(i=a; i<b; i+=s){
  119. range.push(i);
  120. }
  121. }else{
  122. if(s<0){
  123. for(i=a; i>b; i+=s){
  124. range.push(i);
  125. }
  126. }else{
  127. throw new Error("dojox.math.range: step must not be zero.");
  128. }
  129. }
  130. return range; // Array
  131. },
  132. distance: function(/* Array */a, /* Array */b){
  133. // summary:
  134. // Calculate the distance between point A and point B
  135. return Math.sqrt(Math.pow(b[0]-a[0],2)+Math.pow(b[1]-a[1],2)); // Number
  136. },
  137. midpoint: function(/* Array */a, /* Array */b){
  138. // summary:
  139. // Calculate the midpoint between points A and B. A and B may be multidimensional.
  140. if(a.length!=b.length){
  141. console.error("dojox.math.midpoint: Points A and B are not the same dimensionally.", a, b);
  142. }
  143. var m=[];
  144. for(var i=0; i<a.length; i++){
  145. m[i]=(a[i]+b[i])/2;
  146. }
  147. return m; // Array
  148. }
  149. });
  150. return dojox.math;
  151. });