diff options
author | Alex Auvolat <alex.auvolat@ens.fr> | 2015-02-01 18:19:59 +0100 |
---|---|---|
committer | Alex Auvolat <alex.auvolat@ens.fr> | 2015-02-01 18:19:59 +0100 |
commit | 92d18c25a2ff68e76bc268b3ad891c78e4cb58d7 (patch) | |
tree | d60987465e74db0360d667999d065bb35d33c8a4 | |
parent | cacec4dbb8b5cc017b9c6d9975f8f792db13cc7a (diff) | |
download | Robotique-Projet-92d18c25a2ff68e76bc268b3ad891c78e4cb58d7.tar.gz Robotique-Projet-92d18c25a2ff68e76bc268b3ad891c78e4cb58d7.zip |
Implement random point chosing algorithm
-rw-r--r-- | geom.hpp | 6 | ||||
-rw-r--r-- | main.cpp | 2 | ||||
-rw-r--r-- | problem.cpp | 28 |
3 files changed, 31 insertions, 5 deletions
@@ -1,5 +1,6 @@ #pragma once +#include <stdlib.h> #include <math.h> #include <algorithm> #include <assert.h> @@ -7,6 +8,11 @@ #define EPSILON 1e-6 #define abs(x) ((x)<0?-(x):(x)) +inline double frand(double a, double b) { + double r = ((double)rand()) / ((double)RAND_MAX); + return r * (b - a) + a; +} + struct vec { double x, y; @@ -3,6 +3,8 @@ #include "ui.hpp" int main() { + srand(time(0)); + hilare_a_param p; p.l = 50; p.r_c_car = 25; diff --git a/problem.cpp b/problem.cpp index 11f4d8e..67287fa 100644 --- a/problem.cpp +++ b/problem.cpp @@ -48,8 +48,8 @@ bool hilare_a_mvt::intersects(const obstacle &o) const { } bool hilare_a_mvt::intersects(const problem &p) const { - for (auto i = p.obstacles.begin(); i != p.obstacles.end(); i++) { - if (intersects(*i)) return true; + for (auto& i: p.obstacles) { + if (intersects(i)) return true; } return false; } @@ -212,10 +212,28 @@ solution solver_internal::try_find_solution() { void solver_internal::step(const problem &p) { // take new random point - // try to connect to all existing points + double min_x = p.obstacles[0].c.c.x, min_y = p.obstacles[0].c.c.y; + double max_x = min_x, max_y = min_y; + for (auto& o: p.obstacles) { + if (o.c.c.x < min_x) min_x = o.c.c.x; + if (o.c.c.y < min_y) min_y = o.c.c.y; + if (o.c.c.x > max_x) max_x = o.c.c.x; + if (o.c.c.y > max_y) max_y = o.c.c.y; + } + hilare_a rp = p.begin_pos; + rp.x = frand(min_x, max_x); + rp.y = frand(min_y, max_y); + rp.theta = frand(-M_PI, M_PI); + rp.phi = frand(-M_PI, M_PI); - // TODO - sf::sleep(sf::milliseconds(10)); // no CPU hog + // try to connect to all existing points + for (unsigned i = 0; i < pts.size(); i++) { + solution s = solution::direct_sol(pts[i], rp); + if (s.movement.size() > 0 && !s.intersects(p)) { + paths[i][pts.size()] = s; + } + } + pts.push_back(rp); } /* vim: set ts=4 sw=4 tw=0 noet :*/ |