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