]> rtime.felk.cvut.cz Git - hubacji1/bcar.git/blob - src/pslot.cc
Add parked method
[hubacji1/bcar.git] / src / pslot.cc
1 #include <cassert>
2 #include <cmath>
3 #include "pslot.hh"
4
5 namespace bcar {
6
7 ParkingSlot::ParkingSlot(Point p, double h, double W, double L) :
8                 border_({p,
9                         Point(p.x() + W * cos(h - M_PI / 2.0),
10                                 p.y() + W * sin(h - M_PI / 2.0)),
11                         Point(p.x() + W * cos(h - M_PI / 2.0) + L * cos(h),
12                                 p.y() + W * sin(h - M_PI / 2.0) + L * sin(h)),
13                         Point(p.x() + L * cos(h), p.y() + L * sin(h))}),
14                 entry_(border_[0], border_[3]),
15                 rear_(border_[0], border_[1]),
16                 curb_(border_[1], border_[2]),
17                 front_(border_[2], border_[3])
18 {
19 }
20
21 ParkingSlot::ParkingSlot(double lrx, double lry, double rrx, double rry,
22                 double rfx, double rfy, double lfx, double lfy) :
23                         border_({Point(lrx, lry), Point(rrx, rry),
24                                 Point(rfx, rfy), Point(lfx, lfy)}),
25                         entry_(border_[0], border_[3]),
26                         rear_(border_[0], border_[1]),
27                         curb_(border_[1], border_[2]),
28                         front_(border_[2], border_[3])
29 {
30 }
31
32 double
33 ParkingSlot::len() const
34 {
35         return this->entry_.len();
36 }
37
38 double
39 ParkingSlot::w() const
40 {
41         return this->rear_.len();
42 }
43
44 double
45 ParkingSlot::lfx() const
46 {
47         return this->border_[3].x();
48 }
49
50 double
51 ParkingSlot::lfy() const
52 {
53         return this->border_[3].y();
54 }
55
56 double
57 ParkingSlot::lrx() const
58 {
59         return this->border_[0].x();
60 }
61
62 double
63 ParkingSlot::lry() const
64 {
65         return this->border_[0].y();
66 }
67
68 double
69 ParkingSlot::rrx() const
70 {
71         return this->border_[1].x();
72 }
73
74 double
75 ParkingSlot::rry() const
76 {
77         return this->border_[1].y();
78 }
79
80 double
81 ParkingSlot::rfx() const
82 {
83         return this->border_[2].x();
84 }
85
86 double
87 ParkingSlot::rfy() const
88 {
89         return this->border_[2].y();
90 }
91
92 double
93 ParkingSlot::h() const
94 {
95         return atan2(this->lfy() - this->lry(), this->lfx() - this->lrx());
96 }
97
98 bool
99 ParkingSlot::parallel() const
100 {
101         return this->entry_.len() > this->rear_.len();
102 }
103
104 bool
105 ParkingSlot::right() const
106 {
107         return this->border_[1].on_right_side_of(this->entry_);
108 }
109
110 void
111 ParkingSlot::swap_side()
112 {
113         this->border_[1].rotate(this->border_[0], M_PI);
114         this->border_[2].rotate(this->border_[3], M_PI);
115 }
116
117 bool
118 ParkingSlot::parked(BicycleCar const& c) const
119 {
120         auto b_len = sizeof(this->border_) / sizeof(this->border_[0]);
121         std::vector<Point> b(this->border_, this->border_ + b_len);
122         return c.lf().inside_of(b) && c.lr().inside_of(b)
123                 && c.rr().inside_of(b) && c.rf().inside_of(b);
124 }
125
126 std::ostream&
127 operator<<(std::ostream& o, ParkingSlot const& s)
128 {
129         o << "[";
130         o << s.border_[0] << ",";
131         o << s.border_[1] << ",";
132         o << s.border_[2] << ",";
133         o << s.border_[3];
134         o << "]";
135         return o;
136 }
137
138 } // namespace bcar