bugfixes in vecmat3 and quaternion

This commit is contained in:
jiri committed 2026-10-29 21:27:58 +01:00
1 parent e9fa634843
commit a808045360
2 files changed
+34 -33

No files matched your search

+33 -33
View File
@@ -223,90 +223,90 @@ switch(Euler_case(type[0],type[1],type[2]))
case Euler_case('x','z','x'): case Euler_case('x','z','x'):
{ {
q[0] = c2*(c1*c3-s1*s3); q[0] = c2*(c1*c3-s1*s3);
q[1] = c2*(s1*c3+c1*s3); q[1] = -c2*(s1*c3+c1*s3);
q[2] = -s2*(s1*c3-c1*s3); q[2] = s2*(s1*c3-c1*s3);
q[3] = s2*(c1*c3+s1*s3); q[3] = -s2*(c1*c3+s1*s3);
} }
break; break;
case Euler_case('x','y','x'): case Euler_case('x','y','x'):
{ {
q[0] = c2*(c1*c3-s1*s3); q[0] = c2*(c1*c3-s1*s3);
q[1] = c2*(s1*c3+c1*s3); q[1] = -c2*(s1*c3+c1*s3);
q[2] = s2*(c1*c3+s1*s3); q[2] = -s2*(c1*c3+s1*s3);
q[3] = s2*(s1*c3-c1*s3); q[3] = -s2*(s1*c3-c1*s3);
} }
break; break;
case Euler_case('y','x','y'): case Euler_case('y','x','y'):
{ {
q[0] = c2*(c1*c3-s1*s3); q[0] = c2*(c1*c3-s1*s3);
q[1] = s2*(c1*c3+s1*s3); q[1] = -s2*(c1*c3+s1*s3);
q[2] = c2*(s1*c3+c1*s3); q[2] = -c2*(s1*c3+c1*s3);
q[3] = -s2*(s1*c3-c1*s3); q[3] = s2*(s1*c3-c1*s3);
} }
break; break;
case Euler_case('y','z','y'): case Euler_case('y','z','y'):
{ {
q[0] = c2*(c1*c3-s1*s3); q[0] = c2*(c1*c3-s1*s3);
q[1] = s2*(s1*c3-c1*s3); q[1] = -s2*(s1*c3-c1*s3);
q[2] = c2*(s1*c3+c1*s3); q[2] = -c2*(s1*c3+c1*s3);
q[3] = s2*(c1*c3+s1*s3); q[3] = -s2*(c1*c3+s1*s3);
} }
break; break;
case Euler_case('z','y','z'): case Euler_case('z','y','z'):
{ {
q[0] = c2*(c1*c3-s1*s3); q[0] = c2*(c1*c3-s1*s3);
q[1] = -s2*(s1*c3-c1*s3); q[1] = s2*(s1*c3-c1*s3);
q[2] = s2*(c1*c3+s1*s3); q[2] = -s2*(c1*c3+s1*s3);
q[3] = c2*(s1*c3+c1*s3); q[3] = -c2*(s1*c3+c1*s3);
} }
break; break;
case Euler_case('z','x','z'): case Euler_case('z','x','z'):
{ {
q[0] = c2*(c1*c3-s1*s3); q[0] = c2*(c1*c3-s1*s3);
q[1] = s2*(c1*c3+s1*s3); q[1] = -s2*(c1*c3+s1*s3);
q[2] = s2*(s1*c3-c1*s3); q[2] = -s2*(s1*c3-c1*s3);
q[3] = c2*(s1*c3+c1*s3); q[3] = -c2*(s1*c3+c1*s3);
} }
break; break;
case Euler_case('x','z','y'): case Euler_case('x','z','y'):
{ {
q[0] = s1*s2*s3 +c1*c2*c3; q[0] = s1*s2*s3 +c1*c2*c3;
q[1] = s1*c2*c3 - c1*s2*s3; q[1] = -(s1*c2*c3 - c1*s2*s3);
q[2] = -s1*s2*c3+c1*c2*s3; q[2] = -(-s1*s2*c3+c1*c2*s3);
q[3] = s1*c2*s3 +c1*s2*c3; q[3] = -(s1*c2*s3 +c1*s2*c3);
} }
break; break;
case Euler_case('x','y','z'): case Euler_case('x','y','z'):
{ {
q[0] = -s1*s2*s3 + c1*c2*c3; q[0] = -s1*s2*s3 + c1*c2*c3;
q[1] = s1*c2*c3 +c1*s2*s3; q[1] = -(s1*c2*c3 +c1*s2*s3);
q[2] = -s1*c2*s3 + c1*s2*c3; q[2] = -(-s1*c2*s3 + c1*s2*c3);
q[3] = s1*s2*c3 + c1*c2*s3; q[3] = -(s1*s2*c3 + c1*c2*s3);
} }
break; break;
case Euler_case('y','x','z'): case Euler_case('y','x','z'):
{ {
q[0] = s1*s2*s3 + c1*c2*c3; q[0] = s1*s2*s3 + c1*c2*c3;
q[1] = s1*c2*s3 + c1*s2*c3; q[1] = -(s1*c2*s3 + c1*s2*c3);
q[2] = s1*c2*c3 - c1*s2*s3; q[2] = -(s1*c2*c3 - c1*s2*s3);
q[3] = -s1*s2*c3 + c1*c2*s3; q[3] = -(-s1*s2*c3 + c1*c2*s3);
} }
break; break;
case Euler_case('y','z','x'): case Euler_case('y','z','x'):
{ {
q[0] = -s1*s2*s3 + c1*c2*c3; q[0] = -s1*s2*s3 + c1*c2*c3;
q[1] = s1*s2*c3 + c1*c2*s3; q[1] = -(s1*s2*c3 + c1*c2*s3);
q[2] = s1*c2*c3 + c1*s2*s3; q[2] = -(s1*c2*c3 + c1*s2*s3);
q[3] = -s1*c2*s3 + c1*s2*c3; q[3] = -(-s1*c2*s3 + c1*s2*c3);
} }
break; break;
@@ -322,9 +322,9 @@ case Euler_case('z','y','x'):
case Euler_case('z','x','y'): case Euler_case('z','x','y'):
{ {
q[0] = -s1*s2*s3 + c1*c2*c3; q[0] = -s1*s2*s3 + c1*c2*c3;
q[1] = -s1*c2*s3 + c1*s2*c3; q[1] = -(-s1*c2*s3 + c1*s2*c3);
q[2] = s1*s2*c3 + c1*c2*s3; q[2] = -(s1*s2*c3 + c1*c2*s3);
q[3] = s1*c2*c3 + c1*s2*s3; q[3] = -(s1*c2*c3 + c1*s2*s3);
} }
break; break;
}//switch }//switch
+1
View File
@@ -1205,6 +1205,7 @@ void Mat3<T>::svd(Mat3 &u, Vec3<T> &w, Mat3 &v, bool proper_rotations) const
Mat3 ata= this->Ttimes(*this); Mat3 ata= this->Ttimes(*this);
Vec3<T> ww; //actually not needed squares of singular values Vec3<T> ww; //actually not needed squares of singular values
ata.eivec_sym(ww,v,true); ata.eivec_sym(ww,v,true);
if(proper_rotations && v.determinant()<0) {v[0][2]= -v[0][2]; v[1][2]= -v[1][2]; v[2][2]= -v[2][2];} //det v = +1, the sign goes to w[2]
Mat3 uw = (*this)*v; Mat3 uw = (*this)*v;
Mat3 r; Mat3 r;
uw.qrd(u,r); uw.qrd(u,r);