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