Why C++?
Well,
- It's been around forever
- It's easier to write cross platform applications
- Unlike C it's object oriented out of the box
- Pointers are fun
- I like it. Whatever, I know someone who puts garlic on their peanut butter sandwiches, go bother him.
Let's get started! First we'll need a vector class. A few actually so let's start with a 2D vector with floating point elements.
vector2f.h
#ifndef _VECTOR2F_H_
#define _VECTOR2F_H_
class vector2f
{
private:
float elements[2];
public:
vector2f(float x = 0.0f, float y = 0.0f);
vector2f(const vector2f& other);
float length() const;
static float dot(const vector2f& vector1, const vector2f& vector2);
vector2f operator-();
vector2f operator*(float scalar);
friend operator*(float scalar, const vector2f& vector);
friend operator/(const vector2f& vector, float scalar);
friend operator+(const vector2f& vector1, const vector2f& vector2);
friend operator-(const vector2f& vector1, const vector2f& vector2);
vector2f& operator=(const vector2f& other);
float& operator[](int index);
friend bool operator==(const vector2f& vector1, const vector2f& vector2);
friend bool operator!=(const vector2f& vector1, const vector2f& vector2);
};
#endif
That's good for now but we'll probably add more to this class later. Let's take a look at the source code.
vector2f.cpp
#include "vector2f.h"
#include <cmath>
vector2f::vector2f(float x, float y)
{
elements[0] = x;
elements[1] = y;
}
vector2f::vector2f(const vector2f& other)
{
elements[0] = other.elements[0];
elements[1] = other.elements[1];
}
float vector2f::length() const
{
return std::sqrt(elements[0] * elements[0] + elements[1] * elements[1]);
}
float vector2f::dot(const vector2f& vector1, const vector2f& vector2)
{
return vector1.elements[0] * vector2.elements[0] + vector1.elements[1] * vector2.elements[1];
}
vector2f vector2f::operator-()
{
return vector2f(-elements[0], -elements[1]);
}
vector2f vector2f::operator*(float scalar)
{
return vector2f(scalar * elements[0], scalar * elements[1]);
}
vector2f operator*(float scalar, const vector2f& vector)
{
return vector2f(scalar * vector.elements[0], scalar * vector.elements[1]);
}
vector2f operator/(const vector2f& vector, float scalar)
{
return vector2f(vector.elements[0] / scalar, vector.elements[1] / scalar);
}
vector2f operator+(const vector2f& vector1, const vector2f& vector2)
{
return vector2f(vector1.elements[0] + vector2.elements[0], vector1.elements[1] + vector2.elements[1]);
}
vector2f operator-(const vector2f& vector1, const vector2f& vector2)
{
return vector2f(vector1.elements[0] - vector2.elements[0], vector1.elements[1] - vector2.elements[1]);
}
vector2f& vector2f::operator=(const vector2f& other)
{
if (this != &other)
{
elements[0] = other.elements[0];
elements[1] = other.elements[1];
}
return *this;
}
float& vector2f::operator[](int index)
{
//unsafe! TODO: add bounds checking
return elements[index];
}
bool operator==(const vector2f& vector1, const vector2f& vector2)
{
return (vector1.elements[0] == vector2.elements[0] &&
vector1.elements[1] == vector2.elements[1]);
}
bool operator!=(const vector2f& vector1, const vector2f& vector2)
{
return (vector1.elements[0] != vector2.elements[0] ||
vector1.elements[1] != vector2.elements[1]);
}
Hey, alright! That should be pretty good for now. This is pretty basic stuff but I thought someone might benefit from seeing how it's done. Later we'll add matrix classes and even a quaternion class for rotation.
That's it for now, though!
next: part 2
No comments :
Post a Comment