implemented uniformly random rotation quaternion
This commit is contained in:
		
							parent
							
								
									4a8e008811
								
							
						
					
					
						commit
						f368a6dd50
					
				| @ -408,6 +408,33 @@ r *= ::pow(xnorm,y); | |||||||
| return r; | return r; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | #ifndef QUAT_NO_RANDOM | ||||||
|  | //method to efficiently generate a uniformly random point on a unit 4-sphere by G. Marsaglia, Ann. Math. Stat. 43, 645 (1972)
 | ||||||
|  | template<typename T> | ||||||
|  | void Quaternion<T>::random_rotation() | ||||||
|  | { | ||||||
|  | T  s1,s2,s; | ||||||
|  | do | ||||||
|  | 	{ | ||||||
|  | 	q[0]=2.*random()/(1. + RAND_MAX) - 1.; | ||||||
|  | 	q[1]=2.*random()/(1. + RAND_MAX) - 1.; | ||||||
|  | 	s1 = q[0]*q[0] + q[1]*q[1]; | ||||||
|  | 	} | ||||||
|  | 	while(s1>1); | ||||||
|  | do | ||||||
|  |         { | ||||||
|  |         q[2]=2.*random()/(1. + RAND_MAX) - 1.; | ||||||
|  |         q[3]=2.*random()/(1. + RAND_MAX) - 1.; | ||||||
|  |         s2 = q[2]*q[2] + q[3]*q[3]; | ||||||
|  |         } | ||||||
|  |         while(s2>1); | ||||||
|  | s = sqrt((1-s1)/s2); | ||||||
|  | q[2] *= s; | ||||||
|  | q[3] *= s; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| //force instantization
 | //force instantization
 | ||||||
| #define INSTANTIZE(T) \ | #define INSTANTIZE(T) \ | ||||||
| template class Quaternion<T>; \ | template class Quaternion<T>; \ | ||||||
|  | |||||||
| @ -124,6 +124,7 @@ public: | |||||||
| 	void axis2normquat(const T *axis, const T &angle); | 	void axis2normquat(const T *axis, const T &angle); | ||||||
| 	void normquat2axis(T *axis,  T &angle) const; | 	void normquat2axis(T *axis,  T &angle) const; | ||||||
| 	 | 	 | ||||||
|  | 	void random_rotation(); //generate uniformly random unit quaternion
 | ||||||
| 
 | 
 | ||||||
| 	//C-style IO
 | 	//C-style IO
 | ||||||
| 	int fprintf(FILE *f, const char *format) const {return ::fprintf(f,format,q[0],q[1],q[2],q[3]);}; | 	int fprintf(FILE *f, const char *format) const {return ::fprintf(f,format,q[0],q[1],q[2],q[3]);}; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user