generator_random.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /*
  2. * .þÛÛþ þ þ þÛÛþ. þ þ þÛÛÛþ. þÛÛÛþ .þÛÛþ. þ þ
  3. * .þ Û Ûþ. Û Û þ. Û Û Û þ Û. Û. Û Ûþ. Û
  4. * Û Û Û Û Û Û Û Û þ. Û. Û Û Û Û Û Û Û
  5. * .þþÛÛÛÛþ Û Û Û þÛÛÛÛþþ. þþÛÛ. þþÛÛþ. þÛ Û Û Û Û Û
  6. * .Û Û Û .þÛ Û Û. Û Û Û Û Û. þ. Û Û .þÛ
  7. * þ. þ þ þ þ .þ þ .þ þ .þ þÛÛÛþ .þÛÛþ. þ þ
  8. *
  9. * AGE (C) AnakreoN
  10. * Martin Stransky <stransky@anakreon.cz>
  11. *
  12. * This program is free software; you can redistribute it and/or modify
  13. * it under the terms of the GNU General Public License as published by
  14. * the Free Software Foundation; either version 2 of the License, or
  15. * (at your option) any later version.
  16. *
  17. * This program is distributed in the hope that it will be useful,
  18. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20. * GNU General Public License for more details.
  21. *
  22. * You should have received a copy of the GNU General Public License
  23. * along with this program; if not, write to the Free Software
  24. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  25. *
  26. */
  27. #include <stdlib.h>
  28. #include <math.h>
  29. #include "generator_random.h"
  30. /*
  31. Random number generator
  32. range is 0...1
  33. */
  34. float random_generator::generator_rand(void)
  35. {
  36. return((float)rand()/(float)RAND_MAX);
  37. }
  38. /*
  39. Random number generator
  40. center is 0.0
  41. range is +- 1.0
  42. */
  43. float random_generator::generator_rand_0(void)
  44. {
  45. return(generator_rand()*2.0f-1.0f);
  46. }
  47. /*
  48. Gauss random number generator
  49. center is 0.5
  50. range is +- 0.5
  51. */
  52. float random_generator::generator_gauss(void)
  53. {
  54. #define ITERATIONS 10
  55. float sum = 0;
  56. int i;
  57. for(i = 0; i < ITERATIONS; i++)
  58. sum += (float)rand() / (float)RAND_MAX;
  59. return(sum / ITERATIONS);
  60. }
  61. /*
  62. Gauss random number generator
  63. center is 0.0
  64. range is +- 1.0
  65. */
  66. float random_generator::generator_gauss_0(void)
  67. {
  68. return(2.0f*(generator_gauss() - 0.5f));
  69. }
  70. /*
  71. Gauss random number generator
  72. center (and maximum) is 1.0
  73. range is 1.0 - 0.0
  74. */
  75. float random_generator::generator_gauss_1(void)
  76. {
  77. return(1.0f - fabs(generator_gauss_0()));
  78. }
  79. float random_generator::generate_scattering(RANDOM_GENERATOR_TYPE generator_type)
  80. {
  81. // Calculate a scattering
  82. float scattering = 0.0f;
  83. switch(generator_type) {
  84. case GENERATOR_RAND:
  85. scattering = random_generator::generator_rand_0();
  86. break;
  87. case GENERATOR_GAUSS:
  88. scattering = random_generator::generator_gauss_0();
  89. break;
  90. }
  91. return(scattering);
  92. }
  93. /*
  94. * Random generator fractal
  95. */
  96. random_generator_fractal::random_generator_fractal(void)
  97. {
  98. generator_center = 0.0f;
  99. generator_delta = 1.0f;
  100. generator_hurst = 0.6f;
  101. }
  102. float random_generator_fractal::generate_height(int iteration)
  103. {
  104. float d = generator_delta/(powf(2.0f, 2.0f*generator_hurst*iteration));
  105. float height_change = generator_gauss()*d - d / 2.0f + generator_center;
  106. return(height_change);
  107. }
  108. float random_generator_fractal::generate_height(int iteration, float hurst, float center, float delta)
  109. {
  110. float d = delta/(powf(2.0f, 2.0f*hurst*iteration));
  111. float height_change = generator_gauss()*d - d / 2.0f + center;
  112. /*
  113. if(iteration == 0)
  114. return(1);
  115. else
  116. return(0);
  117. */
  118. return(height_change);
  119. }