-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrigid_circle.cpp
More file actions
63 lines (49 loc) · 1.24 KB
/
rigid_circle.cpp
File metadata and controls
63 lines (49 loc) · 1.24 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
#include "rigid_circle.h"
#include "geo_util.h"
Circle::Circle() : Object() {}
Circle::Circle(Vec in_cog, float in_radius, Vec in_center) :
Object(in_cog),
radius_(in_radius),
baseCenter_(in_center) {}
const Vec& Circle::center() const
{
return transCenter_;
}
const float& Circle::radius() const
{
return radius_;
}
Object::Category Circle::category() const
{
return Category::Circle;
}
void Circle::update(float t)
{
cog += v * t;
theta += omega * t;
transformCenter();
bound_box.min = transCenter_ - Vec{radius(), radius()};
bound_box.max = transCenter_ + Vec{radius(), radius()};
}
void Circle::transformCenter()
{
transCenter_ = baseCenter_;
transCenter_.rotate(theta);
transCenter_ += cog;
}
Vec Circle::closestPoint(const Vec& p) const
{
return center() + radius() * unit(p - center());
}
Vec Circle::furthestPoint(const Vec& dir) const
{
return center() + unit(dir) * radius();
}
Segment Circle::projectOnto(const Vec& axis) const
{
Segment proj;
Vec center_pt = projectPoint(center(), axis);
proj.p1 = center_pt + radius() * unit(axis);
proj.p2 = center_pt - radius() * unit(axis);
return proj;
}