*** empty log message ***
This commit is contained in:
		
							parent
							
								
									faf719660c
								
							
						
					
					
						commit
						086c2202be
					
				
							
								
								
									
										197
									
								
								vecmat3.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								vecmat3.cc
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,197 @@ | |||||||
|  | /*
 | ||||||
|  |     LA: linear algebra C++ interface library | ||||||
|  |     Copyright (C) 2008-2020 Jiri Pittner <jiri.pittner@jh-inst.cas.cz> or <jiri@pittnerovi.com> | ||||||
|  | 
 | ||||||
|  |     This program is free software: you can redistribute it and/or modify | ||||||
|  |     it under the terms of the GNU General Public License as published by | ||||||
|  |     the Free Software Foundation, either version 3 of the License, or | ||||||
|  |     (at your option) any later version. | ||||||
|  | 
 | ||||||
|  |     This program is distributed in the hope that it will be useful, | ||||||
|  |     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |     GNU General Public License for more details. | ||||||
|  | 
 | ||||||
|  |     You should have received a copy of the GNU General Public License | ||||||
|  |     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | #include "vecmat3.h" | ||||||
|  | #include <ctype.h> | ||||||
|  | 
 | ||||||
|  | using namespace LA_Vecmat3; | ||||||
|  | 
 | ||||||
|  | //cf. https://en.wikipedia.org/wiki/Euler_angles
 | ||||||
|  | template<typename T> | ||||||
|  | void euler2rotmat(const Vec3<T> &eul, Mat3<T> a, char *type, bool transpose, bool direction, bool reverse) | ||||||
|  | { | ||||||
|  | T c2=cos(eul[1]);  | ||||||
|  | T s2=sin(eul[1]); | ||||||
|  | T c1=cos(eul[reverse?2:0]); | ||||||
|  | T s1=sin(eul[reverse?2:0]); | ||||||
|  | T c3=cos(eul[reverse?0:2]); | ||||||
|  | T s3=sin(eul[reverse?0:2]); | ||||||
|  | 
 | ||||||
|  | if(direction) {s1= -s1; s2= -s2; s3= -s3;} | ||||||
|  | 
 | ||||||
|  | if(tolower(type[0])=='x' && tolower(type[1])=='z'  && tolower(type[2])=='x') | ||||||
|  | 	{ | ||||||
|  | 	a[0][0]= c2; | ||||||
|  | 	a[0][1]= -c3*s2; | ||||||
|  | 	a[0][2]= s2*s3; | ||||||
|  | 	a[1][0]= c1*s2; | ||||||
|  | 	a[1][1]= c1*c2*c3-s1*s3; | ||||||
|  | 	a[1][2]= -c3*s1-c1*c2*s3;  | ||||||
|  | 	a[2][0]= s1*s2;  | ||||||
|  | 	a[2][1]= c1*s3+c2*c3*s1;  | ||||||
|  | 	a[2][2]= c1*c3-c2*s1*s3; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | if(tolower(type[0])=='x' && tolower(type[1])=='y'  && tolower(type[2])=='x') | ||||||
|  | 	{ | ||||||
|  | 	a[0][0]= c2; | ||||||
|  | 	a[0][1]= s2*s3; | ||||||
|  | 	a[0][2]= c3*s2; | ||||||
|  | 	a[1][0]= s1*s2; | ||||||
|  | 	a[1][1]= c1*c3-c2*s1*s3; | ||||||
|  | 	a[1][2]=  -c1*s3-c2*c3*s1; | ||||||
|  | 	a[2][0]=  -c1*s2; | ||||||
|  | 	a[2][1]=  c3*s1+c1*c2*s3; | ||||||
|  | 	a[2][2]=  c1*c2*c3-s1*s3; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | if(tolower(type[0])=='y' && tolower(type[1])=='x'  && tolower(type[2])=='y') | ||||||
|  |         { | ||||||
|  |         a[0][0]= c1*c3-c2*s1*s3; | ||||||
|  |         a[0][1]= s1*s2; | ||||||
|  |         a[0][2]= c1*s3+c2*c3*s1; | ||||||
|  |         a[1][0]= s2*s3; | ||||||
|  |         a[1][1]= c2; | ||||||
|  |         a[1][2]= -c3*s2; | ||||||
|  |         a[2][0]= -c3*s1-c1*c2*s3; | ||||||
|  |         a[2][1]= c1*s2; | ||||||
|  |         a[2][2]= c1*c2*c3-s1*s3; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | if(tolower(type[0])=='y' && tolower(type[1])=='z'  && tolower(type[2])=='y') | ||||||
|  |         { | ||||||
|  |         a[0][0]= c1*c2*c3-s1*s3; | ||||||
|  |         a[0][1]= -c1*s2; | ||||||
|  |         a[0][2]= c3*s1+c1*c2*s3; | ||||||
|  |         a[1][0]= c3*s2; | ||||||
|  |         a[1][1]= c2; | ||||||
|  |         a[1][2]= s2*s3; | ||||||
|  |         a[2][0]= -c1*s3; | ||||||
|  |         a[2][1]= s1*s2; | ||||||
|  |         a[2][2]= c1*c3-c2*s1*s3; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | if(tolower(type[0])=='z' && tolower(type[1])=='y'  && tolower(type[2])=='z') | ||||||
|  |         { | ||||||
|  |         a[0][0]= c1*c2*c3-s1*s3; | ||||||
|  |         a[0][1]= -c3*s1; | ||||||
|  |         a[0][2]= c1*s2; | ||||||
|  |         a[1][0]= c1*s3+c2*c3*s1; | ||||||
|  |         a[1][1]= c1*c3-c2*s1*s3; | ||||||
|  |         a[1][2]= s1*s2; | ||||||
|  |         a[2][0]= -c3*s2; | ||||||
|  |         a[2][1]= s2*s3; | ||||||
|  |         a[2][2]= c2; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | if(tolower(type[0])=='z' && tolower(type[1])=='x'  && tolower(type[2])=='z') | ||||||
|  |         { | ||||||
|  |         a[0][0]= c1*c3-c2*s1*s3; | ||||||
|  |         a[0][1]= -c1*s3-c2*c3*s1; | ||||||
|  |         a[0][2]= s1*s2; | ||||||
|  |         a[1][0]= c3*s1+c1*c2*s3; | ||||||
|  |         a[1][1]= c1*c2*c3-s1*s3; | ||||||
|  |         a[1][2]= -c1*s2; | ||||||
|  |         a[2][0]= s2*s3; | ||||||
|  |         a[2][1]= c3*s2; | ||||||
|  |         a[2][2]= c2; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | //improper angles Tait-Bryan
 | ||||||
|  | 
 | ||||||
|  | if(tolower(type[0])=='x' && tolower(type[1])=='z'  && tolower(type[2])=='y') | ||||||
|  |         { | ||||||
|  |         a[0][0]= c2*c3; | ||||||
|  |         a[0][1]= -s2; | ||||||
|  |         a[0][2]= c2*s3; | ||||||
|  |         a[1][0]= s1*s3+c1*c3*s2; | ||||||
|  |         a[1][1]= c1*c2; | ||||||
|  |         a[1][2]= c1*s2*s3-c3*s1; | ||||||
|  |         a[2][0]= c3*s1*s2-c1*s3; | ||||||
|  |         a[2][1]= c2*s1; | ||||||
|  |         a[2][2]= c1*c3+s1*s2*s3; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | if(tolower(type[0])=='x' && tolower(type[1])=='y'  && tolower(type[2])=='z') | ||||||
|  |         { | ||||||
|  |         a[0][0]= c2*c3; | ||||||
|  |         a[0][1]= -c2*s3; | ||||||
|  |         a[0][2]= s2; | ||||||
|  |         a[1][0]= c1*s3+c3*s1*s2; | ||||||
|  |         a[1][1]= c1*c3-s1*s2*s3; | ||||||
|  |         a[1][2]= -c2*s1; | ||||||
|  |         a[2][0]= s1*s3-c1*c3*s2; | ||||||
|  |         a[2][1]= c3*s1+c1*s2*s3; | ||||||
|  |         a[2][2]= c1*c2; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | if(tolower(type[0])=='y' && tolower(type[1])=='x'  && tolower(type[2])=='z') | ||||||
|  |         { | ||||||
|  |         a[0][0]= c1*c3+s1*s2*s3; | ||||||
|  |         a[0][1]= c3*s1*s2-c1*s3; | ||||||
|  |         a[0][2]= c2*s1; | ||||||
|  |         a[1][0]= c2*s3; | ||||||
|  |         a[1][1]= c2*c3; | ||||||
|  |         a[1][2]= -s2; | ||||||
|  |         a[2][0]= c1*s2*s3-c3*s1; | ||||||
|  |         a[2][1]= c1*c3*s2+s1*s3; | ||||||
|  |         a[2][2]= c1*c2; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | if(tolower(type[0])=='y' && tolower(type[1])=='z'  && tolower(type[2])=='x') | ||||||
|  |         { | ||||||
|  |         a[0][0]= c1*c2; | ||||||
|  |         a[0][1]= s1*s3-c1*c3*s2; | ||||||
|  |         a[0][2]= c3*s1+c1*s2*s3; | ||||||
|  |         a[1][0]= s2; | ||||||
|  |         a[1][1]= c2*c3; | ||||||
|  |         a[1][2]= -c2*s3; | ||||||
|  |         a[2][0]= -c2*s1; | ||||||
|  |         a[2][1]= c1*s3+c3*s1*s2; | ||||||
|  |         a[2][2]= c1*c3-s1*s2*s3; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | if(tolower(type[0])=='z' && tolower(type[1])=='y'  && tolower(type[2])=='x') | ||||||
|  |         { | ||||||
|  |         a[0][0]= c1*c2; | ||||||
|  |         a[0][1]= c1*s2*s3-c3*s1; | ||||||
|  |         a[0][2]= s1*s2+c1*c3*s2; | ||||||
|  |         a[1][0]= c2*s1; | ||||||
|  |         a[1][1]= c1*c3+s1*s2*s3; | ||||||
|  |         a[1][2]= c3*s1*s2-c1*s3; | ||||||
|  |         a[2][0]= -s2; | ||||||
|  |         a[2][1]= c2*s3; | ||||||
|  |         a[2][2]= c2*c3; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | if(tolower(type[0])=='z' && tolower(type[1])=='x'  && tolower(type[2])=='y') | ||||||
|  |         { | ||||||
|  |         a[0][0]= c1*c3-s1*s2*s3; | ||||||
|  |         a[0][1]= -c2*s1; | ||||||
|  |         a[0][2]= c1*s3+c3*s1*s2; | ||||||
|  |         a[1][0]= c3*s1+c1*s2*s3; | ||||||
|  |         a[1][1]= c1*c2; | ||||||
|  |         a[1][2]= s1*s3-c1*c3*s2; | ||||||
|  |         a[2][0]= -c2*s3; | ||||||
|  |         a[2][1]= s2; | ||||||
|  |         a[2][2]= c2*c3; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | if(transpose) a.transposeme(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user