gtc_random.cpp 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2. // OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
  3. ///////////////////////////////////////////////////////////////////////////////////////////////////
  4. // Created : 2011-09-19
  5. // Updated : 2011-09-19
  6. // Licence : This source is under MIT licence
  7. // File : test/gtc/random.cpp
  8. ///////////////////////////////////////////////////////////////////////////////////////////////////
  9. #include <glm/gtc/random.hpp>
  10. #include <glm/gtc/epsilon.hpp>
  11. #include <iostream>
  12. #if(GLM_LANG & GLM_LANG_CXX0X_FLAG)
  13. # include <array>
  14. #endif
  15. int test_linearRand()
  16. {
  17. int Error = 0;
  18. glm::int32 const Min = 16;
  19. glm::int32 const Max = 32;
  20. {
  21. glm::u8vec2 AMin(std::numeric_limits<glm::u8>::max());
  22. glm::u8vec2 AMax(std::numeric_limits<glm::u8>::min());
  23. {
  24. for(std::size_t i = 0; i < 100000; ++i)
  25. {
  26. glm::u8vec2 A = glm::linearRand(glm::u8vec2(Min), glm::u8vec2(Max));
  27. AMin = glm::min(AMin, A);
  28. AMax = glm::max(AMax, A);
  29. if(!glm::all(glm::lessThanEqual(A, glm::u8vec2(Max))))
  30. ++Error;
  31. if(!glm::all(glm::greaterThanEqual(A, glm::u8vec2(Min))))
  32. ++Error;
  33. assert(!Error);
  34. }
  35. Error += glm::all(glm::equal(AMin, glm::u8vec2(Min))) ? 0 : 1;
  36. Error += glm::all(glm::equal(AMax, glm::u8vec2(Max))) ? 0 : 1;
  37. assert(!Error);
  38. }
  39. glm::u16vec2 BMin(std::numeric_limits<glm::u16>::max());
  40. glm::u16vec2 BMax(std::numeric_limits<glm::u16>::min());
  41. {
  42. for(std::size_t i = 0; i < 100000; ++i)
  43. {
  44. glm::u16vec2 B = glm::linearRand(glm::u16vec2(Min), glm::u16vec2(Max));
  45. BMin = glm::min(BMin, B);
  46. BMax = glm::max(BMax, B);
  47. if(!glm::all(glm::lessThanEqual(B, glm::u16vec2(Max))))
  48. ++Error;
  49. if(!glm::all(glm::greaterThanEqual(B, glm::u16vec2(Min))))
  50. ++Error;
  51. assert(!Error);
  52. }
  53. Error += glm::all(glm::equal(BMin, glm::u16vec2(Min))) ? 0 : 1;
  54. Error += glm::all(glm::equal(BMax, glm::u16vec2(Max))) ? 0 : 1;
  55. assert(!Error);
  56. }
  57. glm::u32vec2 CMin(std::numeric_limits<glm::u32>::max());
  58. glm::u32vec2 CMax(std::numeric_limits<glm::u32>::min());
  59. {
  60. for(std::size_t i = 0; i < 100000; ++i)
  61. {
  62. glm::u32vec2 C = glm::linearRand(glm::u32vec2(Min), glm::u32vec2(Max));
  63. CMin = glm::min(CMin, C);
  64. CMax = glm::max(CMax, C);
  65. if(!glm::all(glm::lessThanEqual(C, glm::u32vec2(Max))))
  66. ++Error;
  67. if(!glm::all(glm::greaterThanEqual(C, glm::u32vec2(Min))))
  68. ++Error;
  69. assert(!Error);
  70. }
  71. Error += glm::all(glm::equal(CMin, glm::u32vec2(Min))) ? 0 : 1;
  72. Error += glm::all(glm::equal(CMax, glm::u32vec2(Max))) ? 0 : 1;
  73. assert(!Error);
  74. }
  75. glm::u64vec2 DMin(std::numeric_limits<glm::u64>::max());
  76. glm::u64vec2 DMax(std::numeric_limits<glm::u64>::min());
  77. {
  78. for(std::size_t i = 0; i < 100000; ++i)
  79. {
  80. glm::u64vec2 D = glm::linearRand(glm::u64vec2(Min), glm::u64vec2(Max));
  81. DMin = glm::min(DMin, D);
  82. DMax = glm::max(DMax, D);
  83. if(!glm::all(glm::lessThanEqual(D, glm::u64vec2(Max))))
  84. ++Error;
  85. if(!glm::all(glm::greaterThanEqual(D, glm::u64vec2(Min))))
  86. ++Error;
  87. assert(!Error);
  88. }
  89. Error += glm::all(glm::equal(DMin, glm::u64vec2(Min))) ? 0 : 1;
  90. Error += glm::all(glm::equal(DMax, glm::u64vec2(Max))) ? 0 : 1;
  91. assert(!Error);
  92. }
  93. }
  94. {
  95. glm::i8vec2 AMin(std::numeric_limits<glm::i8>::max());
  96. glm::i8vec2 AMax(std::numeric_limits<glm::i8>::min());
  97. {
  98. for(std::size_t i = 0; i < 100000; ++i)
  99. {
  100. glm::i8vec2 A = glm::linearRand(glm::i8vec2(Min), glm::i8vec2(Max));
  101. AMin = glm::min(AMin, A);
  102. AMax = glm::max(AMax, A);
  103. if(!glm::all(glm::lessThanEqual(A, glm::i8vec2(Max))))
  104. ++Error;
  105. if(!glm::all(glm::greaterThanEqual(A, glm::i8vec2(Min))))
  106. ++Error;
  107. assert(!Error);
  108. }
  109. Error += glm::all(glm::equal(AMin, glm::i8vec2(Min))) ? 0 : 1;
  110. Error += glm::all(glm::equal(AMax, glm::i8vec2(Max))) ? 0 : 1;
  111. assert(!Error);
  112. }
  113. glm::i16vec2 BMin(std::numeric_limits<glm::i16>::max());
  114. glm::i16vec2 BMax(std::numeric_limits<glm::i16>::min());
  115. {
  116. for(std::size_t i = 0; i < 100000; ++i)
  117. {
  118. glm::i16vec2 B = glm::linearRand(glm::i16vec2(Min), glm::i16vec2(Max));
  119. BMin = glm::min(BMin, B);
  120. BMax = glm::max(BMax, B);
  121. if(!glm::all(glm::lessThanEqual(B, glm::i16vec2(Max))))
  122. ++Error;
  123. if(!glm::all(glm::greaterThanEqual(B, glm::i16vec2(Min))))
  124. ++Error;
  125. assert(!Error);
  126. }
  127. Error += glm::all(glm::equal(BMin, glm::i16vec2(Min))) ? 0 : 1;
  128. Error += glm::all(glm::equal(BMax, glm::i16vec2(Max))) ? 0 : 1;
  129. assert(!Error);
  130. }
  131. glm::i32vec2 CMin(std::numeric_limits<glm::i32>::max());
  132. glm::i32vec2 CMax(std::numeric_limits<glm::i32>::min());
  133. {
  134. for(std::size_t i = 0; i < 100000; ++i)
  135. {
  136. glm::i32vec2 C = glm::linearRand(glm::i32vec2(Min), glm::i32vec2(Max));
  137. CMin = glm::min(CMin, C);
  138. CMax = glm::max(CMax, C);
  139. if(!glm::all(glm::lessThanEqual(C, glm::i32vec2(Max))))
  140. ++Error;
  141. if(!glm::all(glm::greaterThanEqual(C, glm::i32vec2(Min))))
  142. ++Error;
  143. assert(!Error);
  144. }
  145. Error += glm::all(glm::equal(CMin, glm::i32vec2(Min))) ? 0 : 1;
  146. Error += glm::all(glm::equal(CMax, glm::i32vec2(Max))) ? 0 : 1;
  147. assert(!Error);
  148. }
  149. glm::i64vec2 DMin(std::numeric_limits<glm::i64>::max());
  150. glm::i64vec2 DMax(std::numeric_limits<glm::i64>::min());
  151. {
  152. for(std::size_t i = 0; i < 100000; ++i)
  153. {
  154. glm::i64vec2 D = glm::linearRand(glm::i64vec2(Min), glm::i64vec2(Max));
  155. DMin = glm::min(DMin, D);
  156. DMax = glm::max(DMax, D);
  157. if(!glm::all(glm::lessThanEqual(D, glm::i64vec2(Max))))
  158. ++Error;
  159. if(!glm::all(glm::greaterThanEqual(D, glm::i64vec2(Min))))
  160. ++Error;
  161. assert(!Error);
  162. }
  163. Error += glm::all(glm::equal(DMin, glm::i64vec2(Min))) ? 0 : 1;
  164. Error += glm::all(glm::equal(DMax, glm::i64vec2(Max))) ? 0 : 1;
  165. assert(!Error);
  166. }
  167. }
  168. for(std::size_t i = 0; i < 100000; ++i)
  169. {
  170. glm::f32vec2 const A(glm::linearRand(glm::f32vec2(Min), glm::f32vec2(Max)));
  171. if(!glm::all(glm::lessThanEqual(A, glm::f32vec2(Max))))
  172. ++Error;
  173. if(!glm::all(glm::greaterThanEqual(A, glm::f32vec2(Min))))
  174. ++Error;
  175. glm::f64vec2 const B(glm::linearRand(glm::f64vec2(Min), glm::f64vec2(Max)));
  176. if(!glm::all(glm::lessThanEqual(B, glm::f64vec2(Max))))
  177. ++Error;
  178. if(!glm::all(glm::greaterThanEqual(B, glm::f64vec2(Min))))
  179. ++Error;
  180. assert(!Error);
  181. }
  182. {
  183. float ResultFloat = 0.0f;
  184. double ResultDouble = 0.0f;
  185. for(std::size_t i = 0; i < 100000; ++i)
  186. {
  187. ResultFloat += glm::linearRand(-1.0f, 1.0f);
  188. ResultDouble += glm::linearRand(-1.0, 1.0);
  189. }
  190. Error += glm::epsilonEqual(ResultFloat, 0.0f, 0.0001f);
  191. Error += glm::epsilonEqual(ResultDouble, 0.0, 0.0001);
  192. assert(!Error);
  193. }
  194. return Error;
  195. }
  196. int test_circularRand()
  197. {
  198. int Error = 0;
  199. {
  200. std::size_t Max = 100000;
  201. float ResultFloat = 0.0f;
  202. double ResultDouble = 0.0f;
  203. double Radius = 2.0f;
  204. for(std::size_t i = 0; i < Max; ++i)
  205. {
  206. ResultFloat += glm::length(glm::circularRand(1.0f));
  207. ResultDouble += glm::length(glm::circularRand(Radius));
  208. }
  209. Error += glm::epsilonEqual(ResultFloat, float(Max), 0.01f) ? 0 : 1;
  210. Error += glm::epsilonEqual(ResultDouble, double(Max) * double(Radius), 0.01) ? 0 : 1;
  211. assert(!Error);
  212. }
  213. return Error;
  214. }
  215. int test_sphericalRand()
  216. {
  217. int Error = 0;
  218. {
  219. std::size_t Max = 100000;
  220. float ResultFloatA = 0.0f;
  221. float ResultFloatB = 0.0f;
  222. float ResultFloatC = 0.0f;
  223. double ResultDoubleA = 0.0f;
  224. double ResultDoubleB = 0.0f;
  225. double ResultDoubleC = 0.0f;
  226. for(std::size_t i = 0; i < Max; ++i)
  227. {
  228. ResultFloatA += glm::length(glm::sphericalRand(1.0f));
  229. ResultDoubleA += glm::length(glm::sphericalRand(1.0));
  230. ResultFloatB += glm::length(glm::sphericalRand(2.0f));
  231. ResultDoubleB += glm::length(glm::sphericalRand(2.0));
  232. ResultFloatC += glm::length(glm::sphericalRand(3.0f));
  233. ResultDoubleC += glm::length(glm::sphericalRand(3.0));
  234. }
  235. Error += glm::epsilonEqual(ResultFloatA, float(Max), 0.01f) ? 0 : 1;
  236. Error += glm::epsilonEqual(ResultDoubleA, double(Max), 0.0001) ? 0 : 1;
  237. Error += glm::epsilonEqual(ResultFloatB, float(Max * 2), 0.01f) ? 0 : 1;
  238. Error += glm::epsilonEqual(ResultDoubleB, double(Max * 2), 0.0001) ? 0 : 1;
  239. Error += glm::epsilonEqual(ResultFloatC, float(Max * 3), 0.01f) ? 0 : 1;
  240. Error += glm::epsilonEqual(ResultDoubleC, double(Max * 3), 0.01) ? 0 : 1;
  241. assert(!Error);
  242. }
  243. return Error;
  244. }
  245. int test_diskRand()
  246. {
  247. int Error = 0;
  248. {
  249. float ResultFloat = 0.0f;
  250. double ResultDouble = 0.0f;
  251. for(std::size_t i = 0; i < 100000; ++i)
  252. {
  253. ResultFloat += glm::length(glm::diskRand(2.0f));
  254. ResultDouble += glm::length(glm::diskRand(2.0));
  255. }
  256. Error += ResultFloat < 200000.f ? 0 : 1;
  257. Error += ResultDouble < 200000.0 ? 0 : 1;
  258. assert(!Error);
  259. }
  260. return Error;
  261. }
  262. int test_ballRand()
  263. {
  264. int Error = 0;
  265. {
  266. float ResultFloat = 0.0f;
  267. double ResultDouble = 0.0f;
  268. for(std::size_t i = 0; i < 100000; ++i)
  269. {
  270. ResultFloat += glm::length(glm::ballRand(2.0f));
  271. ResultDouble += glm::length(glm::ballRand(2.0));
  272. }
  273. Error += ResultFloat < 200000.f ? 0 : 1;
  274. Error += ResultDouble < 200000.0 ? 0 : 1;
  275. assert(!Error);
  276. }
  277. return Error;
  278. }
  279. /*
  280. #if(GLM_LANG & GLM_LANG_CXX0X_FLAG)
  281. int test_grid()
  282. {
  283. int Error = 0;
  284. typedef std::array<int, 8> colors;
  285. typedef std::array<int, 8 * 8> grid;
  286. grid Grid;
  287. colors Colors;
  288. grid GridBest;
  289. colors ColorsBest;
  290. while(true)
  291. {
  292. for(std::size_t i = 0; i < Grid.size(); ++i)
  293. Grid[i] = int(glm::linearRand(0.0, 8.0 * 8.0 * 8.0 - 1.0) / 64.0);
  294. for(std::size_t i = 0; i < Grid.size(); ++i)
  295. ++Colors[Grid[i]];
  296. bool Exit = true;
  297. for(std::size_t i = 0; i < Colors.size(); ++i)
  298. {
  299. if(Colors[i] == 8)
  300. continue;
  301. Exit = false;
  302. break;
  303. }
  304. if(Exit == true)
  305. break;
  306. }
  307. return Error;
  308. }
  309. #endif
  310. */
  311. int main()
  312. {
  313. int Error = 0;
  314. Error += test_linearRand();
  315. Error += test_circularRand();
  316. Error += test_sphericalRand();
  317. Error += test_diskRand();
  318. Error += test_ballRand();
  319. /*
  320. #if(GLM_LANG & GLM_LANG_CXX0X_FLAG)
  321. Error += test_grid();
  322. #endif
  323. */
  324. return Error;
  325. }