Browse Source

Added disk and ball rand implementations

Christophe Riccio 14 years ago
parent
commit
c7e5c17898
2 changed files with 125 additions and 11 deletions
  1. 30 5
      glm/gtc/random.hpp
  2. 95 6
      glm/gtc/random.inl

+ 30 - 5
glm/gtc/random.hpp

@@ -65,21 +65,46 @@ namespace glm
 		genType const & Max);
 		genType const & Max);
 
 
 	/// Generate random numbers in the interval [Min, Max], according a gaussian distribution 
 	/// Generate random numbers in the interval [Min, Max], according a gaussian distribution 
-	/// (From GLM_GTX_random extension)
+	/// 
+	/// @param Mean
+	/// @param Deviation
+	/// @see gtc_random
 	template <typename genType>
 	template <typename genType>
 	genType gaussRand(
 	genType gaussRand(
 		genType const & Mean, 
 		genType const & Mean, 
 		genType const & Deviation);
 		genType const & Deviation);
 	
 	
 	/// Generate a random 2D vector which coordinates are regulary distributed on a circle of a given radius
 	/// Generate a random 2D vector which coordinates are regulary distributed on a circle of a given radius
-	/// (From GLM_GTX_random extension)
+	/// 
+	/// @param Radius 
+	/// @see gtc_random
 	template <typename T> 
 	template <typename T> 
-	detail::tvec2<T> circularRand(T const & Radius); 
+	detail::tvec2<T> circularRand(
+		T const & Radius); 
 	
 	
 	/// Generate a random 3D vector which coordinates are regulary distributed on a sphere of a given radius
 	/// Generate a random 3D vector which coordinates are regulary distributed on a sphere of a given radius
-	/// (From GLM_GTX_random extension)
+	/// 
+	/// @param Radius
+	/// @see gtc_random
 	template <typename T> 
 	template <typename T> 
-	detail::tvec3<T> sphericalRand(T const & Radius); 
+	detail::tvec3<T> sphericalRand(
+		T const & Radius); 
+	
+	/// Generate a random 2D vector which coordinates are regulary distributed within the area of a disk of a given radius
+	/// 
+	/// @param Radius
+	/// @see gtc_random
+	template <typename T> 
+	detail::tvec2<T> diskRand(
+		T const & Radius); 
+	
+	/// Generate a random 3D vector which coordinates are regulary distributed within the volume of a ball of a given radius
+	/// 
+	/// @param Radius
+	/// @see gtc_random
+	template <typename T>
+	GLM_FUNC_QUALIFIER detail::tvec3<T> ballRand(
+		T const & Radius);
 	
 	
 	/// @}
 	/// @}
 }//namespace glm
 }//namespace glm

+ 95 - 6
glm/gtc/random.inl

@@ -81,16 +81,105 @@ GLM_FUNC_QUALIFIER detail::tvec4<T> linearRand
 		linearRand(Min.w, Max.w));
 		linearRand(Min.w, Max.w));
 }
 }
 
 
-template <>
-half gaussRand
+template <typename genType> 
+GLM_FUNC_QUALIFIER genType gaussRand
 (
 (
-	half const & Mean,	
-	half const & Deviation
+	genType const & Mean,	
+	genType const & Deviation
 )
 )
 {
 {
+    genType w, x1, x2;
+	
+    do
+    {
+        x1 = compRand1(genType(-1), genType(1));
+        x2 = compRand1(genType(-1), genType(1));
+		
+        w = x1 * x1 + x2 * x2;
+    } while(w > genType(1));
+	
+    return x2 * std_deviation * std_deviation * sqrt((genType(-2) * log(w)) / w) + mean;
+}
 
 
+template <typename T>
+GLM_FUNC_QUALIFIER detail::tvec2<T> gaussRand
+(
+	detail::tvec2<T> const & Min, 
+	detail::tvec2<T> const & Max
+)
+{
+	return detail::tvec2<T>(
+		gaussRand(Min.x, Max.x),
+		gaussRand(Min.y, Max.y));
+}
+	
+template <typename T>
+GLM_FUNC_QUALIFIER detail::tvec3<T> gaussRand
+(
+	detail::tvec3<T> const & Min, 
+	detail::tvec3<T> const & Max
+)
+{
+	return detail::tvec3<T>(
+		gaussRand(Min.x, Max.x),
+		gaussRand(Min.y, Max.y),
+		gaussRand(Min.z, Max.z));
+}
+	
+template <typename T>
+GLM_FUNC_QUALIFIER detail::tvec4<T> gaussRand
+(
+	detail::tvec4<T> const & Min, 
+	detail::tvec4<T> const & Max
+)
+{
+	return detail::tvec4<T>(
+		gaussRand(Min.x, Max.x),
+		gaussRand(Min.y, Max.y),
+		gaussRand(Min.z, Max.z),
+		gaussRand(Min.w, Max.w));
+}
+	
+template <typename T>
+GLM_FUNC_QUALIFIER detail::tvec3<T> diskRand
+(
+	T const & Radius
+)
+{		
+	detail::tvec2<T> Result(T(0));
+	T LenRadius(T(0));
+		
+	do
+	{
+		Result = compRand2(-Radius, Radius);
+		LenRadius = length(Result);
+	}
+	while(LenRadius > Radius);
+		
+	return Result;
+}
+	
+template <typename T>
+GLM_FUNC_QUALIFIER detail::tvec3<T> ballRand
+(
+	T const & Radius
+)
+{		
+	detail::tvec3<T> Result(T(0));
+	T LenRadius(T(0));
+		
+	do
+	{
+		Result = compRand3(-Radius, Radius);
+		LenRadius = length(Result);
+	}
+	while(LenRadius > Radius);
+		
+	return Result;
+}
+	
 template <typename T> 
 template <typename T> 
-detail::tvec2<T> circularRand
+GLM_FUNC_QUALIFIER detail::tvec2<T> circularRand
 (
 (
 	T const & Radius
 	T const & Radius
 )
 )
@@ -100,7 +189,7 @@ detail::tvec2<T> circularRand
 }
 }
 	
 	
 template <typename T> 
 template <typename T> 
-detail::tvec3<T> sphericalRand
+GLM_FUNC_QUALIFIER detail::tvec3<T> sphericalRand
 (
 (
 	T const & Radius
 	T const & Radius
 )
 )