Hello people! I hope you are well!
In this article I would like to present you a simple C++ 3D vector library. This is just a prototype and I am sure you can find other better and more complete alternatives. So, we are just dealing here with a “Yet Another 3D Vector Library”.
I created this library because I wanted to reuse some 3D vector operations in various OpenGL computer graphics exercise programs (from my M.Sc. studies). Of course, I could use an already existing library. However, I wanted also to understand how some basic 3D vector operations work.
So, these two reasons led me to create the library.
The operations the library contains are the following:
- add two vectors
- subtract two vectors
- multiple a vector with a scalar value
- divide a vector with a scalar value
- normalize a vector
- calculate the cross product of two vectors
- calculate the inner product of two vectors
- calculate the length of a vector
- calculate the opposite of a vector
These were the vector operations that I needed for my programs.
Now, let me show you the header of the library:
#ifndef _VECTOR_3F_H_ #define _VECTOR_3F_H_ class Vector3f { private: float x, y, z; public: Vector3f(); Vector3f(const float x, const float y, const float z); float getX() const; float getY() const; float getZ() const; void setX(const float value); void setY(const float value); void setZ(const float value); void setValues(const float x, const float y, const float z); Vector3f operator + (const Vector3f & vector) const; Vector3f operator - (const Vector3f & vector) const; Vector3f operator * (const float scale) const; Vector3f operator / (const float scale) const; Vector3f crossProduct(const Vector3f & vector) const; float innerProduct(const Vector3f & vector) const; float length() const; Vector3f operator - () const; void opposite (); Vector3f normalized() const; void normalize(); }; #endif // _VECTOR_3F_H_
Here is the implementation of the library:
#include <cmath> #include "Vector3f.h" Vector3f::Vector3f() : Vector3f(0, 0, 0) { } Vector3f::Vector3f(const float x, const float y, const float z) { setValues(x, y, z); } float Vector3f::getX() const { return x; } float Vector3f::getY() const { return y; } float Vector3f::getZ() const { return z; } void Vector3f::setX(const float value) { x = value; } void Vector3f::setY(const float value) { y = value; } void Vector3f::setZ(const float value) { z = value; } void Vector3f::setValues(const float x, const float y, const float z) { setX(x); setY(y); setZ(z); } Vector3f Vector3f::operator + (const Vector3f & vector) const { return Vector3f(x + vector.getX(), y + vector.getY(), z + vector.getZ()); } Vector3f Vector3f::operator - (const Vector3f & vector) const { return Vector3f(x - vector.getX(), y - vector.getY(), z - vector.getZ()); } Vector3f Vector3f::operator * (const float scale) const { return Vector3f(x * scale, y * scale, z * scale); } Vector3f Vector3f::operator / (const float scale) const { return Vector3f(x / scale, y / scale, z / scale); } Vector3f Vector3f::crossProduct(const Vector3f & vector) const { return Vector3f(y * vector.getZ() - z * vector.getY(), z * vector.getX() - x * vector.getZ(), x * vector.getY() - y * vector.getX()); } float Vector3f::innerProduct(const Vector3f & vector) const { return (x * vector.getX() + y * vector.getY() + z * vector.getZ()); } float Vector3f::length() const { return sqrt(x*x + y*y + z*z); } Vector3f Vector3f::operator - () const { return Vector3f(-x, -y, -z); } void Vector3f::opposite() { setValues(-x, -y, -z); } Vector3f Vector3f::normalized() const { const float distance = length(); return Vector3f(x / distance, y / distance, z / distance); } void Vector3f::normalize() { const float distance = length(); setValues(x / distance, y / distance, z / distance); }
Have a nice weekend!