6 Point::Point(double x, double y) : x_(x), y_(y)
10 Point::Point() : Point::Point(0.0, 0.0)
39 Point::min_angle_between(Point const& p1, Point const& p2) const
41 double d1x = p1.x() - this->x();
42 double d1y = p1.y() - this->y();
43 double d2x = p2.x() - p1.x();
44 double d2y = p2.y() - p1.y();
46 double dot = d1x*d2x + d1y*d2y;
47 double d1 = sqrt(d1x*d1x + d1y*d1y);
48 double d2 = sqrt(d2x*d2x + d2y*d2y);
50 double delta = acos(dot / (d1 * d2));
51 return std::min(delta, M_PI - delta);
55 Point::inside_of(std::vector<Point> const& poly) const
57 unsigned int num = poly.size();
58 unsigned int j = num - 1;
60 for (unsigned int i = 0; i < num; i++) {
61 if (this->x() == poly[i].x() && this->y() == poly[i].y()) {
64 if ((poly[i].y() > this->y()) != (poly[j].y() > this->y())) {
65 auto slope1 = this->x() - poly[i].x();
66 slope1 *= poly[j].y() - poly[i].y();
67 auto slope2 = poly[j].x() - poly[i].x();
68 slope2 *= this->y() - poly[i].y();
69 auto slope = slope1 - slope2;
73 if ((slope < 0.0) != (poly[j].y() < poly[i].y())) {
82 Line::Line(Point const& fp, Point const& lp): first(fp), last(lp),
83 intersection1(Point(0.0, 0.0)), intersection2(Point(0.0, 0.0))
102 return this->intersection1;
108 return this->intersection2;
112 Line::intersects_with(Line const& li)
114 auto x1 = this->fp().x();
115 auto y1 = this->fp().y();
116 auto x2 = this->lp().x();
117 auto y2 = this->lp().y();
118 auto x3 = li.fp().x();
119 auto y3 = li.fp().y();
120 auto x4 = li.lp().x();
121 auto y4 = li.lp().y();
122 double deno = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
126 double t = (x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4);
128 double u = (x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3);
131 if (t < 0.0 || t > 1.0 || u < 0.0 || u > 1.0) {
134 this->intersection1.x(x1 + t * (x2 - x1));
135 this->intersection1.y(y1 + t * (y2 - y1));
140 Line::intersects_with(Point const& c, double const r)
142 auto x1 = this->fp().x();
143 auto y1 = this->fp().y();
144 auto x2 = this->lp().x();
145 auto y2 = this->lp().y();
157 double dr = sqrt(dx*dx + dy*dy);
158 double D = x1*y2 - x2*y1;
159 if (r*r * dr*dr - D*D < 0.0) {
162 // intersection coordinates
163 double ix1 = (D*dy + sgn(dy)*dx*sqrt(r*r * dr*dr - D*D)) / (dr*dr);
165 double ix2 = (D*dy - sgn(dy)*dx*sqrt(r*r * dr*dr - D*D)) / (dr*dr);
167 double iy1 = (-D*dx + std::abs(dy)*sqrt(r*r * dr*dr - D*D)) / (dr*dr);
169 double iy2 = (-D*dx - std::abs(dy)*sqrt(r*r * dr*dr - D*D)) / (dr*dr);
171 this->intersection1.x(ix1);
172 this->intersection1.y(iy1);
173 this->intersection2.x(ix2);
174 this->intersection2.y(iy2);
179 Line::is_on_right_side(Point const& p) const
181 auto x1 = this->fp().x();
182 auto y1 = this->fp().y();
183 auto x2 = this->lp().x();
184 auto y2 = this->lp().y();
187 if (sgn((x3 - x1) * (y2 - y1) - (y3 - y1) * (x2 - x1)) < 0.0) {
237 Pose::rotate(Point const& c, double const angl)
239 double px = this->x();
240 double py = this->y();
243 double nx = px * cos(angl) - py * sin(angl);
244 double ny = px * sin(angl) + py * cos(angl);
245 this->h(this->h() + angl);
251 operator<<(std::ostream& out, Pose const& p)
253 out << "[" << p.x() << "," << p.y() << "," << p.h() << "]";
264 PoseRange::b(double b)
276 PoseRange::e(double e)
288 PoseRange::rotate(Point const& c, double const angl)
290 Pose::rotate(c, angl);
291 this->e(this->e() + angl);
295 operator<<(std::ostream& out, PoseRange const& p)
297 out << "[" << p.x() << "," << p.y() << "," << p.b() << "," << p.e();
305 return this->curb_to_curb;
309 CarSize::ctc(double ctc)
311 this->curb_to_curb = ctc;
317 return this->wheelbase;
321 CarSize::wb(double wb)
323 this->wheelbase = wb;
345 CarSize::len(double len)
353 return this->distance_to_front;
357 CarSize::df(double df)
359 this->distance_to_front = df;
365 return this->len() - this->df();
371 auto ctc2 = pow(this->ctc() / 2.0, 2.0);
372 auto wb2 = pow(this->wb(), 2.0);
373 return sqrt(ctc2 - wb2) - this->w() / 2.0;
383 CarMove::sp(double sp)
395 CarMove::st(double st)
401 BicycleCar::drivable(Pose const& p) const
403 return this->drivable(p, p.h(), p.h());
407 BicycleCar::drivable(Pose const& p, double b, double e) const
409 // assert p.h() == (b + e) / 2.0
410 double a_1 = atan2(p.y() - this->y(), p.x() - this->x()) - this->h();
415 double h_d = p.h() - this->h();
421 if (h_d == 0 && (a_1 == 0 || a_2 == M_PI || a_2 == -M_PI)) {
423 } else if (0 < a_1 && a_1 <= M_PI/2) { // left front
424 BicycleCar z(*this); // zone border
426 h_d = p.h() - this->h();
427 z.rotate(this->ccl(), h_d);
428 // assert z.h() == p.h()
429 if (p.y() == z.y() && p.x() == z.x()) // p on zone border
431 a_2 = atan2(p.y() - z.y(), p.x() - z.x());
436 if (z.h() >= a_2 && a_2 >= this->h())
438 } else if (M_PI/2 < a_1 && a_1 <= M_PI) { // left rear
439 BicycleCar z(*this); // zone border
441 h_d = p.h() - this->h();
442 z.rotate(this->ccl(), h_d);
443 // assert z.h() == p.h()
444 if (p.y() == z.y() && p.x() == z.x()) // p on zone border
446 a_2 = atan2(p.y() - z.y(), p.x() - z.x());
452 if (this->h() >= a_2 && a_2 >= z.h())
454 } else if (0 > a_1 && a_1 >= -M_PI/2) { // right front
455 BicycleCar z(*this); // zone border
457 h_d = p.h() - this->h();
458 z.rotate(this->ccr(), h_d);
459 // assert z.h() == p.h()
460 if (p.y() == z.y() && p.x() == z.x()) // p on zone border
462 a_2 = atan2(p.y() - z.y(), p.x() - z.x());
467 if (this->h() >= a_2 && a_2 >= z.h())
469 } else if (-M_PI/2 > a_1 && a_1 >= -M_PI) { // right rear
470 BicycleCar z(*this); // zone border
472 h_d = p.h() - this->h();
473 z.rotate(this->ccr(), h_d);
474 // assert z.h() == p.h()
475 if (p.y() == z.y() && p.x() == z.x()) // p on zone border
477 a_2 = atan2(p.y() - z.y(), p.x() - z.x());
483 if (z.h() >= a_2 && a_2 >= this->h())
486 // Not happenning, as ``-pi <= a <= pi``.
492 BicycleCar::iradi() const
494 return this->mtr() - this->w() / 2;
498 BicycleCar::ofradi() const
500 auto mtrw2 = pow(this->mtr() + this->w() / 2.0, 2.0);
501 auto df2 = pow(this->df(), 2.0);
502 return sqrt(mtrw2 + df2);
506 BicycleCar::orradi() const
508 auto mtrw2 = pow(this->mtr() + this->w() / 2.0, 2.0);
509 auto dr2 = pow(this->dr(), 2.0);
510 return sqrt(mtrw2 + dr2);
514 BicycleCar::perfect_parking_slot_len() const
516 auto r = this->ctc() / 2.0;
518 auto k = this->df() - this->wb();
520 auto r2l2 = r * r - l * l;
521 auto s = r2l2 + pow(l + k, 2.0) - pow(sqrt(r2l2) - w, 2.0);
522 return this->len() + sqrt(s) - l - k;
526 BicycleCar::set_max_steer()
528 this->st(atan(this->wb() / this->mtr()));
532 BicycleCar::lfx() const
534 double lfx = this->x();
535 lfx += (this->w() / 2.0) * cos(this->h() + M_PI / 2.0);
536 lfx += this->df() * cos(this->h());
541 BicycleCar::lfy() const
543 double lfy = this->y();
544 lfy += (this->w() / 2.0) * sin(this->h() + M_PI / 2.0);
545 lfy += this->df() * sin(this->h());
550 BicycleCar::lrx() const
552 double lrx = this->x();
553 lrx += (this->w() / 2.0) * cos(this->h() + M_PI / 2.0);
554 lrx += -this->dr() * cos(this->h());
559 BicycleCar::lry() const
561 double lry = this->y();
562 lry += (this->w() / 2.0) * sin(this->h() + M_PI / 2.0);
563 lry += -this->dr() * sin(this->h());
568 BicycleCar::rrx() const
570 double rrx = this->x();
571 rrx += (this->w() / 2.0) * cos(this->h() - M_PI / 2.0);
572 rrx += -this->dr() * cos(this->h());
577 BicycleCar::rry() const
579 double rry = this->y();
580 rry += (this->w() / 2.0) * sin(this->h() - M_PI / 2.0);
581 rry += -this->dr() * sin(this->h());
586 BicycleCar::rfx() const
588 double rfx = this->x();
589 rfx += (this->w() / 2.0) * cos(this->h() - M_PI / 2.0);
590 rfx += this->df() * cos(this->h());
595 BicycleCar::rfy() const
597 double rfy = this->y();
598 rfy += (this->w() / 2.0) * sin(this->h() - M_PI / 2.0);
599 rfy += this->df() * sin(this->h());
604 BicycleCar::ralx() const
606 double lrx = this->x();
607 lrx += (this->w() / 2.0) * cos(this->h() + M_PI / 2.0);
611 BicycleCar::raly() const
613 double lry = this->y();
614 lry += (this->w() / 2.0) * sin(this->h() + M_PI / 2.0);
619 BicycleCar::rarx() const
621 double rrx = this->x();
622 rrx += (this->w() / 2.0) * cos(this->h() - M_PI / 2.0);
627 BicycleCar::rary() const
629 double rry = this->y();
630 rry += (this->w() / 2.0) * sin(this->h() - M_PI / 2.0);
635 BicycleCar::ccl() const
638 this->x() + this->mtr() * cos(this->h() + M_PI / 2.0),
639 this->y() + this->mtr() * sin(this->h() + M_PI / 2.0)
644 BicycleCar::ccr() const
647 this->x() + this->mtr() * cos(this->h() - M_PI / 2.0),
648 this->y() + this->mtr() * sin(this->h() - M_PI / 2.0)
655 this->x(this->x() + this->sp() * cos(this->h()));
656 this->y(this->y() + this->sp() * sin(this->h()));
657 this->h(this->h() + this->sp() / this->wb() * tan(this->st()));