From 2cb65f6726bbdecdc57b1544fe11fa6c586783dc Mon Sep 17 00:00:00 2001 From: Jean Fabre-Monplaisir Date: Sun, 1 Feb 2015 19:04:55 +0100 Subject: begin detection collision --- geom.hpp | 7 +++++-- problem.cpp | 32 ++++++++++++++++++++++++++++++-- problem.hpp | 8 ++++++-- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/geom.hpp b/geom.hpp index cb8d583..e6dee0c 100644 --- a/geom.hpp +++ b/geom.hpp @@ -177,16 +177,19 @@ struct angular_sector { angular_sector(circarc i, circarc o) : inner(i), outer(o) { assert(i.c.c == o.c.c); + assert(i.theta1 == o.theta1); + assert(i.theta2 == o.theta2); + } bool is_in_sector(vec p) const{ - //TODO + return false; } double dist(vec p) const{ if (is_in_sector(p)) return 0; //TODO - return 29 ; + return 42 ; } }; /* vim: set ts=4 sw=4 tw=0 noet :*/ diff --git a/problem.cpp b/problem.cpp index 25061c5..fb7670b 100644 --- a/problem.cpp +++ b/problem.cpp @@ -8,11 +8,39 @@ using namespace std; double hilare_a_mvt::length() { // returns length traveled by the car - return domega * (center - from.pos()).norm(); + if (is_arc) return domega * (center - from.pos()).norm(); + return ds ; +} + +bool hilare_a::intersects(const obstacle &o) const { + + if((pos()-o.c.c).norm() < o.c.r + param->r_c_car)return true ; + if((pos_trolley()-o.c.c).norm() < o.c.r + param->r_c_trolley)return true ; + if(segment(pos(),pos_trolley()).dist(o.c.c) < o.c.r)return true ; + return false ; } bool hilare_a_mvt::intersects(const obstacle &o) const { - // TODO + hilare_a_param *p = from.param; + vec pos_init = from.pos(); + vec pos_init_trolley = from.pos_trolley(); + if(is_arc){ + double r_min = + min((pos_init - center).norm()-(p->r_c_car), + (pos_init_trolley - center).norm()-(p->r_c_trolley)); + double r_max = + max((pos_init - center).norm()+(p->r_c_car), + (pos_init_trolley - center).norm()+(p->r_c_trolley)); + //TODO + double theta1 = 0; + double theta2 = 0; + angular_sector sector = angular_sector(circarc(circle(center,r_min), theta1, theta2), circarc(circle(center,r_max), theta1, theta2)); + if (sector.dist(o.c.c)<=o.c.r)return true; + if (from.intersects(o)) return true; + if (to.intersects(o)) return true; + return false; + + } return false; } diff --git a/problem.hpp b/problem.hpp index a41e47a..3fc3054 100644 --- a/problem.hpp +++ b/problem.hpp @@ -30,6 +30,9 @@ struct hilare_a { // System A vec pos_trolley() const { return pos() + param->l * dir_trolley(); } + + bool intersects(const obstacle &o) const; // intersects an obstacle ? + }; struct problem { @@ -63,9 +66,10 @@ struct hilare_a_mvt { double ds; // longueur par double length(); // length of a movement + + bool intersects(const obstacle &o) const; // intersects an obstacle ? - bool intersects(const obstacle& o) const; // intersects an obstacle ? - bool intersects(const problem &p) const; // intersects any obstacle on the map ? + bool intersects(const problem &p) const; // intersects any obstacle on the map ? }; struct solution { -- cgit v1.2.3