-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathVector2D.cpp
126 lines (103 loc) · 2.76 KB
/
Vector2D.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "Vector2D.h"
Vector2d::Vector2d()
{
x = 0.0;
y = 0.0;
}
Vector2d::Vector2d(double sourceX, double sourceY)
{
x = sourceX;
y = sourceY;
}
Vector2d Vector2d::operator+(const Vector2d &v) const
{
return Vector2d(x + v.x, y + v.y);
}
Vector2d Vector2d::operator-(const Vector2d &v) const
{
return Vector2d(x - v.x, y - v.y);
}
Vector2d Vector2d::operator*(const Vector2d &v) const
{
return Vector2d(x*v.x, y*v.y);
}
Vector2d Vector2d::operator/(const Vector2d &v) const
{
return Vector2d(x / v.x, y / v.y);
}
bool Vector2d::operator==(const Vector2d &v) const
{
return ((x == v.x) && (y == v.y));
}
bool Vector2d::operator>(const Vector2d &v) const
{
return (x*x + y*y) > (v.x*v.x + v.y*v.y);
}
bool Vector2d::operator<(const Vector2d &v) const
{
return (x*x + y*y) < (v.x*v.x + v.y*v.y);
}
bool Vector2d::operator>=(const Vector2d &v) const
{
return (x*x + y*y) > (v.x*v.x + v.y*v.y) ||
(x*x + y*y) == (v.x*v.x + v.y*v.y);
}
bool Vector2d::operator<=(const Vector2d &v) const
{
return (x*x + y*y) < (v.x*v.x + v.y*v.y) ||
(x*x + y*y) == (v.x*v.x + v.y*v.y);
}
Vector2d Vector2d::operator-() const
{
return Vector2d(-x, -y);
}
Vector2d Vector2d::operator*(const float& scalar) const
{
return Vector2d(x*scalar, y*scalar);
}
Vector2d Vector2d::operator/(const float& scalar) const
{
return Vector2d(x / scalar, y / scalar);
}
double Vector2d::DotProduct(const Vector2d &a, const Vector2d &b)
{
return ((a.x * b.x) + (a.y * b.y));
}
double Vector2d::CrossProduct(const Vector2d &a, const Vector2d &b)
{
return ((a.x * b.y) - (a.y * b.x));
}
double Vector2d::Magnitude()
{
return sqrt((this->x * this->x) + (this->y * this->y));
}
Vector2d Vector2d::Normal(Vector2d v)
{
double magnitude = v.Magnitude();
return Vector2d(v.x / magnitude, v.y / magnitude);
}
Vector2d Vector2d::Perpendicular(const Vector2d &v)
{
return Vector2d(v.y, -v.x);
}
bool Vector2d::Intersect(const Vector2d &aa, const Vector2d &ab, const Vector2d &ba, const Vector2d &bb)
{
Vector2d p = aa;
Vector2d r = ab - aa;
Vector2d q = ba;
Vector2d s = bb - ba;
double t = CrossProduct((q - p), s) / CrossProduct(r, s);
double u = CrossProduct((q - p), r) / CrossProduct(r, s);
return (0.0 <= t && t <= 1.0) &&
(0.0 <= u && u <= 1.0);
}
Vector2d Vector2d::GetIntersect(const Vector2d &aa, const Vector2d &ab, const Vector2d &ba, const Vector2d &bb)
{
double pX = (aa.x*ab.y - aa.y*ab.x)*(ba.x - bb.x) -
(ba.x*bb.y - ba.y*bb.x)*(aa.x - ab.x);
double pY = (aa.x*ab.y - aa.y*ab.x)*(ba.y - bb.y) -
(ba.x*bb.y - ba.y*bb.x)*(aa.y - ab.y);
double denominator = (aa.x - ab.x)*(ba.y - bb.y) -
(aa.y - ab.y)*(ba.x - bb.x);
return Vector2d(pX / denominator, pY / denominator);
}