-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmy_point.cpp
More file actions
120 lines (100 loc) · 2.37 KB
/
my_point.cpp
File metadata and controls
120 lines (100 loc) · 2.37 KB
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
#include "my_point.h"
#include <math.h>
bool in_range(double val, double a, double b){
return (b-val)*(val-a) >= 0;
}
double distance(const my_point &a, const my_point &b){
double len = sqrt( pow(b.x - a.x, 2) + pow(b.y - a.y, 2));
return len;
}
double length(const my_point &a){
my_point zero{0,0};
return distance(zero, a);
}
double dot(const my_point &a, const my_point &b){
double dot_prod = a.x*b.x + a.y*b.y;
return dot_prod;
}
// get angle of vector; range: [0, 2pi)
// vector has start point in the origin
double get_angle(const my_point &a) {
if (is_zero(a)){
// cannot both be zero vector
return 0;
}
// y is reversed
double yy = -a.y; // reversed y
if(a.x == 0){
return (yy > 0) ? 0.5*M_PI : 1.5*M_PI;
} else if(yy == 0) {
return (a.x > 0) ? 0 : M_PI;
} else {
double absAngle = abs(atan(yy/a.x)); // (0, pi/2)
if(a.x > 0 && yy > 0){
// Quadrant I
return absAngle;
} else if(a.x < 0 && yy > 0){
// Quadrant II
return M_PI - absAngle;
} else if(a.x < 0 && yy < 0){
// Quadrant III
return absAngle + M_PI;
} else {
// Quadrant IV
return 2*M_PI - absAngle;
}
}
}
// get smallest angle to another vector
double get_angle_to(const my_point &a, const my_point &b) {
double angle1 = get_angle(a);
double angle2 = get_angle(b);
if(angle2 < angle1) angle2 += 2*M_PI;
double angleTo = angle2 - angle1;
if(angleTo > M_PI) {
angleTo = -(2*M_PI-angleTo);
}
if(abs(abs(angleTo) -0.5*M_PI) < 0.01){
angleTo = 0.5*M_PI;
}
return angleTo;
}
bool is_zero(const my_point &p){
if(p.x == 0 && p.y == 0){
return true;
}
return false;
}
bool operator ==(const my_point &a, const my_point &b){
return (a.x == b.x) && (a.y == b.y);
}
my_point operator -(const my_point &a, const my_point &b){
my_point new_p;
new_p.x = a.x - b.x;
new_p.y = a.y - b.y;
return new_p;
}
my_point operator +(const my_point &a, const my_point &b){
my_point new_p;
new_p.x = a.x + b.x;
new_p.y = a.y + b.y;
return new_p;
}
my_point operator *(const my_point &a, const double &b){
my_point new_p;
new_p.x = a.x * b;
new_p.y = a.y * b;
return new_p;
}
ostream& operator <<(ostream &o, const my_point &p){
o << "(" << p.x << ", " << p.y << ")";
return o;
}
ostream& operator <<(ostream &o, const vector<my_point> vec){
o << "[";
for (size_t i = 0; i < vec.size() -1; i++){
o << vec[i] << ", ";
}
o << vec.back() << "]" << endl;
return o;
}