Olympe Engine 2.0
2D Game Engine with ECS Architecture
Loading...
Searching...
No Matches
vector.h
Go to the documentation of this file.
1/*
2 Vector.h
3 Nicolas Chereau 2006
4 Olympe Engine ::2D Game Editor ::olympe.editor@gmail.com
5 nchereau@gmail.com
6*/
7
8#pragma once
9
10#include "math.h"
11#include <ostream>
12#include <SDL_rect.h>
13
14using namespace std;
15
16// Forward declaration for ImGui integration
17struct ImVec2;
18
19class Vector;
20 Vector vBlend ( Vector& , Vector& , float );
21 float fDist ( Vector& , Vector&);
22
23class Vector
24{
25public:
26
27 float x,y,z;
28 Vector(void) { x = 0.0f; y = 0.0f; z = 0.0f;} // default constructor
29 Vector(const Vector &v) { x = v.x; y = v.y; z = v.z;}// constructor by copy
30 Vector(float _x, float _y = 0.f, float _z = 0.f) { x = _x; y = _y; z = _z;}
31 virtual ~Vector () {}
32
33 friend ostream &operator<<(ostream &os, const Vector &v);
34
35 inline Vector& operator = (const Vector &v) { x = v.x; y = v.y; z = v.z; return *this;}
36 inline Vector& operator = (const float &f) { x = f; y = f; z = f; return *this;}
37 inline Vector operator - (const Vector &v) { return Vector(x-v.x, y-v.y, z-v.z); }
38 inline Vector operator + (const Vector &v) { return Vector(x+v.x, y+v.y, z+v.z); }
39 inline Vector operator * (float scalar) { return Vector(x*scalar, y*scalar, z*scalar); }
40 inline Vector& operator / (float scalar) { x/=scalar; y/=scalar; z/=scalar; return *this; }
41
42 bool operator < (const Vector &v);
43 bool operator <= (const Vector &v);
44 bool operator > (const Vector &v);
45 bool operator >= (const Vector &v);
46
47 inline Vector& operator -= (const Vector &v) { x-=v.x; y-=v.y; z-=v.z; return *this; }
48 inline Vector& operator -= (float scalar) { x-=scalar; y-=scalar; z-=scalar; return *this; }
49 inline Vector& operator += (const Vector &v) { x+=v.x; y+=v.y; z+=v.z; return *this; }
50 inline Vector& operator += (float scalar) { x+=scalar; y+=scalar; z+=scalar; return *this; }
51 inline Vector& operator *= (float scalar) { x*=scalar; y*=scalar; z*=scalar; return *this; }
52 inline Vector& operator /= (float scalar) { x/=scalar; y/=scalar; z/=scalar; return *this; }
53
54
55 inline Vector operator- () { return Vector(-x, -y, -z); }
56 inline bool operator== (const Vector &v) { return (x==v.x && y==v.y && z==v.z); }
57 inline bool operator!= (const Vector &v) { return (x!=v.x || y!=v.y || z!=v.z); }
58
59 inline SDL_FPoint ToFPoint() const { SDL_FPoint p = { x, y }; return p; }
60 inline SDL_Point ToPoint() const { SDL_Point p = { (int)x, (int)y }; return p; }
61
62 // ImGui conversion helpers (requires ImVec2 definition - include imgui.h before using these)
63 inline ImVec2 ToImVec2() const;
64 static inline Vector FromImVec2(const ImVec2& v);
65
66 inline float Norm() const { return sqrtf(x*x + y*y + z*z); }
67 inline float operator ^ (const Vector &V) const// cross product
68 { return (x * V.y) - (y * V.x) - (z * V.z); }
69 inline float operator * (const Vector &V) const// dot product
70 { return (x*V.x) + (y*V.y) + (z*V.z); }
71
72 inline Vector& Normalize() { float rc=1/Norm(); x*=rc; y*=rc; z*=rc; return *this; }
73 inline float Length() const { return Norm(); }
74 inline float Magnitude() const { return Norm(); }
75
76 inline bool bIsNull(void){ return ((x + y + z) == 0.0f); }
77 inline float Dist (Vector&);
78 inline float sqrDist(Vector&);
79
80 inline Vector& Set (float _x, float _y, float _z) { x = _x; y = _y; z = _z; return *this;}
81
82 inline float Angle (const Vector& xE)
83 {
84 float dot = (*this) * xE;
85 float cross = (*this) ^ xE;
86
87 // angle between segments
88 float angle = (float) -atan2(cross, dot);
89
90 return angle;
91 }
92
93 inline Vector& Rotate(float angle)
94 {
95 float tx = x;
96 x = x * cos(angle) - y * sin(angle);
97 y = tx * sin(angle) + y * cos(angle);
98
99 return *this;
100 }
101
102 inline Vector& Scale(const Vector& _v)
103 {
104 this->x *= _v.x;
105 this->y *= _v.y;
106 this->z *= _v.z;
107 return *this;
108 }
109
110 inline Vector& Scale(const float _x, float _y, float _z)
111 {
112 this->x *= _x;
113 this->y *= _y;
114 this->z *= _z;
115 return *this;
116 }
117
118
119 inline void Clamp(const Vector& min, const Vector& max)
120 {
121 x = (x < min.x)? min.x : (x > max.x)? max.x : x;
122 y = (y < min.y)? min.y : (y > max.y)? max.y : y;
123 z = (z < min.z)? min.z : (z > max.z)? max.z : z;
124 }
125
127 {
128 *this = vBlend( *this, _vDdest, _ffactor);
129 return *this;
130 }
131};
132
133//static Vector vector_null = Vector(0.0f, 0.0f, 0.0f);
134#define vector_null Vector(0.0f, 0.0f, 0.0f)
135#define vector_up Vector(0.0f, -1.0f, 0.0f)
136#define vector_down Vector(0.0f, 1.0f, 0.0f)
137#define vector_left Vector(-1.0f, 0.0f, 0.0f)
138#define vector_right Vector(1.0f, 0.0f, 0.0f)
139#define vector_identity Vector(1.0f, 1.0f, 1.0f)
140
141Vector vBlend ( Vector& _v1, Vector& _v2, float _fc);
142
143inline float fDist ( Vector& _v1, Vector& _v2)
144{
145 float fd;
146
147 fd = (float)pow((_v2.x - _v1.x), 2);
148 fd += (float)pow((_v2.y - _v1.y), 2);
149 fd += (float)pow((_v2.z - _v1.z), 2);
150
151 return (float)sqrt(fd);
152}
153
154inline float fDist2 ( Vector& _v1, Vector& _v2)
155{
156 float fd;
157
158 fd = (float)pow((_v2.x - _v1.x), 2);
159 fd += (float)pow((_v2.y - _v1.y), 2);
160 fd += (float)pow((_v2.z - _v1.z), 2);
161
162 return fd;
163}
164
165inline Vector vNormal ( Vector& _v1, bool bLeftSide = true)
166{
167 Vector v;
168 if (bLeftSide)
169 {
170 v.x = _v1.y;
171 v.y = -_v1.x;
172 }
173 else
174 {
175 v.x = -_v1.y;
176 v.y = _v1.x;
177 }
178 v = v.Normalize();
179 return v;
180}
181
182inline float fAngle ( Vector& _v1, Vector& _v2)
183{
184 float dot = _v1 * _v2;
185 float cross = _v1 ^ _v2;
186
187 // angle between segments
188 float angle = (float) -atan2(cross, dot);
189
190 return angle;
191}
ComponentTypeID GetComponentTypeID_Static()
Definition ECS_Entity.h:56
Vector & Rotate(float angle)
Definition vector.h:93
SDL_FPoint ToFPoint() const
Definition vector.h:59
float z
Definition vector.h:27
void Clamp(const Vector &min, const Vector &max)
Definition vector.h:119
SDL_Point ToPoint() const
Definition vector.h:60
Vector Blend(Vector &_vDdest, float _ffactor)
Definition vector.h:126
float Norm() const
Definition vector.h:66
Vector & Scale(const float _x, float _y, float _z)
Definition vector.h:110
float operator^(const Vector &V) const
Definition vector.h:67
static Vector FromImVec2(const ImVec2 &v)
friend ostream & operator<<(ostream &os, const Vector &v)
Definition vector.cpp:48
bool bIsNull(void)
Definition vector.h:76
float Magnitude() const
Definition vector.h:74
Vector(const Vector &v)
Definition vector.h:29
Vector & operator*=(float scalar)
Definition vector.h:51
float y
Definition vector.h:27
float Dist(Vector &)
Definition vector.cpp:12
Vector & operator/=(float scalar)
Definition vector.h:52
bool operator!=(const Vector &v)
Definition vector.h:57
bool operator<(const Vector &v)
Definition vector.cpp:53
Vector & Scale(const Vector &_v)
Definition vector.h:102
bool operator<=(const Vector &v)
Definition vector.cpp:58
Vector operator*(float scalar)
Definition vector.h:39
Vector operator-()
Definition vector.h:55
bool operator==(const Vector &v)
Definition vector.h:56
Vector operator+(const Vector &v)
Definition vector.h:38
Vector & operator-=(const Vector &v)
Definition vector.h:47
Vector & Normalize()
Definition vector.h:72
Vector & operator+=(const Vector &v)
Definition vector.h:49
float x
Definition vector.h:27
ImVec2 ToImVec2() const
bool operator>(const Vector &v)
Definition vector.cpp:63
float Length() const
Definition vector.h:73
Vector(void)
Definition vector.h:28
virtual ~Vector()
Definition vector.h:31
float Angle(const Vector &xE)
Definition vector.h:82
Vector & operator/(float scalar)
Definition vector.h:40
Vector & operator=(const Vector &v)
Definition vector.h:35
bool operator>=(const Vector &v)
Definition vector.cpp:68
Vector & Set(float _x, float _y, float _z)
Definition vector.h:80
Vector(float _x, float _y=0.f, float _z=0.f)
Definition vector.h:30
float sqrDist(Vector &)
Definition vector.cpp:24
Vector vNormal(Vector &_v1, bool bLeftSide=true)
Definition vector.h:165
float fDist(Vector &, Vector &)
Definition vector.h:143
float fDist2(Vector &_v1, Vector &_v2)
Definition vector.h:154
Vector vBlend(Vector &, Vector &, float)
Definition vector.cpp:36
float fAngle(Vector &_v1, Vector &_v2)
Definition vector.h:182