bugfixes in quaternion

This commit is contained in:
jiri committed 2026-10-28 23:06:08 +01:00
1 parent a95c7bfefe
commit dc7f9bef93
2 files changed
+19 -5

No files matched your search

+15 -1
View File
@@ -362,7 +362,7 @@ Quaternion<T> exp(const Quaternion<T> &x)
Quaternion<T> r; Quaternion<T> r;
T vnorm = sqrt(x[1]*x[1]+x[2]*x[2]+x[3]*x[3]); T vnorm = sqrt(x[1]*x[1]+x[2]*x[2]+x[3]*x[3]);
r[0] = cos(vnorm); r[0] = cos(vnorm);
vnorm = sin(vnorm)/vnorm; vnorm = vnorm==0 ? (T)1 : sin(vnorm)/vnorm; //limit for a real quaternion
r[1] = x[1] * vnorm; r[1] = x[1] * vnorm;
r[2] = x[2] * vnorm; r[2] = x[2] * vnorm;
r[3] = x[3] * vnorm; r[3] = x[3] * vnorm;
@@ -378,6 +378,13 @@ Quaternion<T> log(const Quaternion<T> &x)
{ {
Quaternion<T> r; Quaternion<T> r;
T vnorm = x[1]*x[1]+x[2]*x[2]+x[3]*x[3]; T vnorm = x[1]*x[1]+x[2]*x[2]+x[3]*x[3];
if(vnorm==0) //real quaternion; for a negative one the i axis is chosen (as for complex numbers)
{
r[0] = ::log(x[0]<0? -x[0] : x[0]);
r[1] = x[0]<0? (T)M_PI : (T)0;
r[2] = r[3] = 0;
return r;
}
T xnorm = vnorm + x[0]*x[0]; T xnorm = vnorm + x[0]*x[0];
vnorm = sqrt(vnorm); vnorm = sqrt(vnorm);
xnorm = sqrt(xnorm); xnorm = sqrt(xnorm);
@@ -395,6 +402,13 @@ Quaternion<T> pow(const Quaternion<T> &x, const T &y)
{ {
Quaternion<T> r; Quaternion<T> r;
T vnorm = x[1]*x[1]+x[2]*x[2]+x[3]*x[3]; T vnorm = x[1]*x[1]+x[2]*x[2]+x[3]*x[3];
if(vnorm==0) //real quaternion; for a negative one the i axis is chosen (as for complex numbers)
{
if(x[0]>=0) {r[0] = ::pow(x[0],y); r[1]=0;}
else {T a = ::pow(-x[0],y); r[0] = a*cos((T)M_PI*y); r[1] = a*sin((T)M_PI*y);}
r[2] = r[3] = 0;
return r;
}
T xnorm = vnorm + x[0]*x[0]; T xnorm = vnorm + x[0]*x[0];
vnorm = sqrt(vnorm); vnorm = sqrt(vnorm);
xnorm = sqrt(xnorm); xnorm = sqrt(xnorm);
+4 -4
View File
@@ -131,8 +131,8 @@ public:
//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]);};
int sprintf(char *f, const char *format) const {return ::sprintf(f,format,q[0],q[1],q[2],q[3]);}; int sprintf(char *f, const char *format) const {return ::sprintf(f,format,q[0],q[1],q[2],q[3]);};
int fscanf(FILE *f, const char *format) const {return ::fscanf(f,format,q[0],q[1],q[2],q[3]);}; int fscanf(FILE *f, const char *format) {return ::fscanf(f,format,&q[0],&q[1],&q[2],&q[3]);};
int sscanf(char *f, const char *format) const {return ::sscanf(f,format,q[0],q[1],q[2],q[3]);}; int sscanf(const char *f, const char *format) {return ::sscanf(f,format,&q[0],&q[1],&q[2],&q[3]);};
}; };
@@ -206,8 +206,8 @@ T q23= q[2]*q[3];
if(transpose) //effectively sign change of the temporaries if(transpose) //effectively sign change of the temporaries
{ {
q01 = -q01; q01 = -q01;
q02 = -q03; q02 = -q02;
q03 = -q02; q03 = -q03;
} }
a[0][1] = 2*(q12+q03); a[0][1] = 2*(q12+q03);
a[1][0] = 2*(q12-q03); a[1][0] = 2*(q12-q03);