-
Notifications
You must be signed in to change notification settings - Fork 0
/
ellipse.cpp
82 lines (71 loc) · 2.34 KB
/
ellipse.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
#include "ellipse.h"
ellipse::ellipse() {
origin = complex(0,0);
end = complex(0,0);
r=0.0;
g=0.0;
b=0.0;
minor = 0.5;
}
ellipse::ellipse(complex const& _origin) {
origin = complex(_origin.re, _origin.im);
end = complex(0,0);
r=0.0;
g=0.0;
b=0.0;
minor = 0.5;
}
ellipse::ellipse(complex const& _origin, complex const& _end) {
origin = _origin;
end = _end;
r=0.0;
g=0.0;
b=0.0;
minor = 0.5;
double major = sqrt(pow(end.re-origin.re,2)+pow(end.im-origin.im,2));
double angle = atan2(end.im-origin.im, end.re-origin.re);
complex rot(cos(angle), sin(angle));
for (double degree = 0; degree <= 360; degree++) {
complex temp(major*cos(degree*2*3.1415/360), minor*sin(degree*2*3.1415/360));
vertices.push_back(temp*rot+origin);
}
}
void ellipse::resize(complex const& _end) {
vertices.clear();
end = _end;
double major = sqrt(pow(end.re-origin.re,2)+pow(end.im-origin.im,2));
double angle = atan2(end.im-origin.im, end.re-origin.re);
complex rot(cos(angle), sin(angle));
for (double degree = 0; degree <= 360; degree++) {
complex temp(major*cos(degree*2*3.1415/360), minor*sin(degree*2*3.1415/360));
vertices.push_back(temp*rot+origin);
}
}
void ellipse::resize(double scale) {
std::cout << minor << "!!" << std::endl;
vertices.clear();
std::cout << minor << "!!" << std::endl;
minor = minor*scale;
std::cout << minor << "!!" << std::endl;
double major = sqrt(pow(end.re-origin.re,2)+pow(end.im-origin.im,2));
double angle = atan2(end.im-origin.im, end.re-origin.re);
complex rot(cos(angle), sin(angle));
for (double degree = 0; degree <= 360; degree++) {
complex temp(major*cos(degree*2*3.1415/360), minor*sin(degree*2*3.1415/360));
vertices.push_back(temp*rot+origin);
}
}
void ellipse::draw() {
glBegin(GL_LINE_STRIP);
glColor3d(r,g,b);
for (int i = 0; i < vertices.size(); i++) {
glVertex3d(vertices[i].re, vertices[i].im, 0);
}
glEnd();
}
void ellipse::out() {
complex _end = vertices[vertices.size()-1];
double distance = sqrt(pow(_end.re-origin.re,2)+pow(_end.im-origin.im,2));
double angle = atan2(_end.im-origin.im, _end.re-origin.re);
std::cout << "Angle: " << angle*360/(2*3.1415) << " deg; Distance: " << distance << std::endl;
}