4 bool PSPlanner::collide()
6 if(std::get<0>(intersect(
7 this->cc().lfx(), this->cc().lfy(),
8 this->cc().lrx(), this->cc().lry(),
9 this->ps().x1(), this->ps().y1(),
10 this->ps().x2(), this->ps().y2()
13 if(std::get<0>(intersect(
14 this->cc().rfx(), this->cc().rfy(),
15 this->cc().rrx(), this->cc().rry(),
16 this->ps().x1(), this->ps().y1(),
17 this->ps().x2(), this->ps().y2()
20 if(std::get<0>(intersect(
21 this->cc().lfx(), this->cc().lfy(),
22 this->cc().rfx(), this->cc().rfy(),
23 this->ps().x1(), this->ps().y1(),
24 this->ps().x2(), this->ps().y2()
27 if(std::get<0>(intersect(
28 this->cc().lrx(), this->cc().lry(),
29 this->cc().rrx(), this->cc().rry(),
30 this->ps().x1(), this->ps().y1(),
31 this->ps().x2(), this->ps().y2()
34 if(std::get<0>(intersect(
35 this->cc().lfx(), this->cc().lfy(),
36 this->cc().lrx(), this->cc().lry(),
37 this->ps().x2(), this->ps().y2(),
38 this->ps().x3(), this->ps().y3()
41 if(std::get<0>(intersect(
42 this->cc().rfx(), this->cc().rfy(),
43 this->cc().rrx(), this->cc().rry(),
44 this->ps().x2(), this->ps().y2(),
45 this->ps().x3(), this->ps().y3()
48 if(std::get<0>(intersect(
49 this->cc().lfx(), this->cc().lfy(),
50 this->cc().rfx(), this->cc().rfy(),
51 this->ps().x2(), this->ps().y2(),
52 this->ps().x3(), this->ps().y3()
55 if(std::get<0>(intersect(
56 this->cc().lrx(), this->cc().lry(),
57 this->cc().rrx(), this->cc().rry(),
58 this->ps().x2(), this->ps().y2(),
59 this->ps().x3(), this->ps().y3()
62 if(std::get<0>(intersect(
63 this->cc().lfx(), this->cc().lfy(),
64 this->cc().lrx(), this->cc().lry(),
65 this->ps().x3(), this->ps().y3(),
66 this->ps().x4(), this->ps().y4()
69 if(std::get<0>(intersect(
70 this->cc().rfx(), this->cc().rfy(),
71 this->cc().rrx(), this->cc().rry(),
72 this->ps().x3(), this->ps().y3(),
73 this->ps().x4(), this->ps().y4()
76 if(std::get<0>(intersect(
77 this->cc().lfx(), this->cc().lfy(),
78 this->cc().rfx(), this->cc().rfy(),
79 this->ps().x3(), this->ps().y3(),
80 this->ps().x4(), this->ps().y4()
83 if(std::get<0>(intersect(
84 this->cc().lrx(), this->cc().lry(),
85 this->cc().rrx(), this->cc().rry(),
86 this->ps().x3(), this->ps().y3(),
87 this->ps().x4(), this->ps().y4()
93 bool PSPlanner::left()
95 double lfx = this->cc().lfx();
96 double lfy = this->cc().lfy();
97 double lrx = this->cc().lrx();
98 double lry = this->cc().lry();
99 double rrx = this->cc().rrx();
100 double rry = this->cc().rry();
101 double rfx = this->cc().rfx();
102 double rfy = this->cc().rfy();
104 (lfx - this->ps().x1()) * (this->ps().y4() - this->ps().y1())
105 - (lfy - this->ps().y1()) * (this->ps().x4() - this->ps().x1())
108 (lrx - this->ps().x1()) * (this->ps().y4() - this->ps().y1())
109 - (lry - this->ps().y1()) * (this->ps().x4() - this->ps().x1())
112 (rrx - this->ps().x1()) * (this->ps().y4() - this->ps().y1())
113 - (rry - this->ps().y1()) * (this->ps().x4() - this->ps().x1())
116 (rfx - this->ps().x1()) * (this->ps().y4() - this->ps().y1())
117 - (rfy - this->ps().y1()) * (this->ps().x4() - this->ps().x1())
119 if (this->ps().parallel())
120 return lfs == rfs && (lfs != lrs || lfs != rrs);
121 else if (!this->forward())
122 return lfs == rfs && (lfs != lrs || lfs != rrs);
124 return lrs == rrs && (lrs != lfs || lrs != rfs);
132 void PSPlanner::fer()
134 if (this->ps().parallel())
135 return this->fer_parallel();
137 return this->fer_perpendicular();
140 void PSPlanner::fer_parallel()
142 this->cc().st(this->cc().wb() / this->cc().mtr());
143 if (!this->ps().right())
144 this->cc().st(this->cc().st() * -1);
146 while (!this->left()) {
147 while (!this->collide() && !this->left())
149 if (this->left() && !this->collide()) {
152 this->cc().sp(this->cc().sp() * -1);
154 this->cc().st(this->cc().st() * -1);
159 void PSPlanner::fer_perpendicular()
161 double cc_h = this->cc().h();
164 // check inner radius
165 if (this->forward()) {
174 if (this->ps().right()) {
175 x1 = this->cc().ccr().x();
176 y1 = this->cc().ccr().y();
178 x1 = this->cc().ccl().x();
179 y1 = this->cc().ccl().y();
181 double IR = this->cc().iradi();
185 b = (x - x1) * 2 * cos(cc_h) + (y - y1) * 2 * sin(cc_h);
187 b = (x1 - x) * 2 * cos(cc_h) + (y1 - y) * 2 * sin(cc_h);
188 double c = pow(x - x1, 2) + pow(y - y1, 2) - pow(IR, 2);
189 double D = D = pow(b, 2) - 4 * a * c;
191 delta = -b - sqrt(D);
193 double delta_1 = delta;
194 // check outer radius
195 if (this->forward()) {
202 IR = this->cc().ofradi();
205 b = (x - x1) * 2 * cos(cc_h) + (y - y1) * 2 * sin(cc_h);
207 b = (x1 - x) * 2 * cos(cc_h) + (y1 - y) * 2 * sin(cc_h);
208 c = pow(x - x1, 2) + pow(y - y1, 2) - pow(IR, 2);
209 D = pow(b, 2) - 4 * a * c;
210 if (this->forward()) {
211 delta = -b + sqrt(D);
214 double delta_2 = delta;
215 delta = -b - sqrt(D);
217 double delta_3 = delta;
218 delta = std::max(delta_1, std::max(delta_2, delta_3));
219 // current car `cc` can get out of slot with max steer
220 this->cc().x(this->cc().x() + delta * cos(cc_h));
221 this->cc().y(this->cc().y() + delta * sin(cc_h));
223 // get current car `cc` out of slot
228 this->cc().st(this->cc().wb() / this->cc().mtr());
229 if (this->ps().right())
230 this->cc().st(this->cc().st() * -1);
231 while (!this->left()) {
232 while (!this->collide() && !this->left())
234 if (this->left() && !this->collide()) {
237 this->cc().sp(this->cc().sp() * -1);
239 this->cc().st(this->cc().st() * -1);
244 bool PSPlanner::forward()
246 double heading = this->ps().heading();
247 while (heading < 0) heading += 2 * M_PI;
248 if (!this->ps().parallel())
250 double h = this->gc().h();
251 while (h < 0) h += 2 * M_PI;
252 if (-0.00001 < heading - h && heading - h < 0.00001)
258 PSPlanner::PSPlanner()
262 std::tuple<bool, double, double> intersect(
263 double x1, double y1,
264 double x2, double y2,
265 double x3, double y3,
269 double deno = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
271 return std::make_tuple(false, 0, 0);
272 double t = (x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4);
274 double u = (x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3);
277 if (t < 0 || t > 1 || u < 0 || u > 1)
278 return std::make_tuple(false, 0, 0);
279 return std::make_tuple(true, x1 + t * (x2 - x1), y1 + t * (y2 - y1));