Improve vector and quaternion libraries

Make the order or basic methods consistent between Vector and Quaternion.
Remove `ZYX` from Euler method names as this is standard for robotics.
Rename angular rates to rotation vector, which is more correct.
Make rotation methods static, to keep the arguments order consistent.
Make `Quaternion::fromAxisAngle` accept Vector for axis.
Minor fixes.
This commit is contained in:
Oleg Kalachev
2025-05-31 04:17:00 +03:00
parent 929bdd1f35
commit 6b7601c0bd
6 changed files with 74 additions and 67 deletions

View File

@@ -13,14 +13,18 @@ public:
Vector(float x, float y, float z): x(x), y(y), z(z) {};
float norm() const {
return sqrt(x * x + y * y + z * z);
}
bool zero() const {
return x == 0 && y == 0 && z == 0;
}
bool finite() const {
return isfinite(x) && isfinite(y) && isfinite(z);
}
float norm() const {
return sqrt(x * x + y * y + z * z);
}
void normalize() {
float n = norm();
x /= n;
@@ -74,10 +78,6 @@ public:
return !(*this == b);
}
bool finite() const {
return isfinite(x) && isfinite(y) && isfinite(z);
}
static float dot(const Vector& a, const Vector& b) {
return a.x * b.x + a.y * b.y + a.z * b.z;
}
@@ -86,18 +86,18 @@ public:
return Vector(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);
}
static float angleBetweenVectors(const Vector& a, const Vector& b) {
static float angleBetween(const Vector& a, const Vector& b) {
return acos(constrain(dot(a, b) / (a.norm() * b.norm()), -1, 1));
}
static Vector angularRatesBetweenVectors(const Vector& a, const Vector& b) {
static Vector rotationVectorBetween(const Vector& a, const Vector& b) {
Vector direction = cross(a, b);
if (direction.zero()) {
// vectors are opposite, return any perpendicular vector
return cross(a, Vector(1, 0, 0));
}
direction.normalize();
float angle = angleBetweenVectors(a, b);
float angle = angleBetween(a, b);
return direction * angle;
}