diff options
-rw-r--r-- | problem.cpp | 8 | ||||
-rw-r--r-- | problem.hpp | 6 | ||||
-rw-r--r-- | ui.cpp | 61 | ||||
-rw-r--r-- | ui.hpp | 6 |
4 files changed, 55 insertions, 26 deletions
diff --git a/problem.cpp b/problem.cpp index 8078c33..e56b0b3 100644 --- a/problem.cpp +++ b/problem.cpp @@ -46,6 +46,12 @@ solution solution::direct_sol(const hilare_a &pos_a, const hilare_a &pos_b) { // IMPLEMENTATION FOR CLASS SOLVER // // =============================== // -// TODO +solver::solver() { + // nothing ? +} + +solver_internal solver::peek_internal() { + return _d; +} /* vim: set ts=4 sw=4 tw=0 noet :*/ diff --git a/problem.hpp b/problem.hpp index 381b52d..685e1df 100644 --- a/problem.hpp +++ b/problem.hpp @@ -86,14 +86,14 @@ struct solver_internal { // intermediate data for the solver // represents a graph of randomly chosen positions and simple solutions between them std::vector<hilare_a> pts; - std::map<int, std::map<int, hilare_a_mvt> > paths; + std::map<int, std::map<int, solution> > paths; }; class solver { // mutex-protected asynchronous structure private: - //todo + solver_internal _d; public: solver(); @@ -101,6 +101,8 @@ class solver { void start(const problem &p); bool finished(); solution get_solution(); + + solver_internal peek_internal(); }; @@ -107,7 +107,7 @@ void UI::handle_normal(const sf::Event &ev) { if (k == 'd') { vec p = mouse_coord(); vector<obstacle> o2; - for(auto i: _p.obstacles) { + for(auto& i: _p.obstacles) { if (!i.c.intersects(p)) o2.push_back(i); } _p.obstacles = o2; @@ -187,21 +187,6 @@ void UI::render_circle(const circle &c, sf::Color border, sf::Color inside, int _win.draw(a); } -void UI::render_seg(vec a, vec b, sf::Color c, int w) { - sf::ConvexShape l; - - l.setPointCount(4); - l.setPoint(0, to_view(a)); - l.setPoint(1, to_view(b)); - l.setPoint(2, to_view(b)); - l.setPoint(3, to_view(a)); - - l.setOutlineColor(c); - l.setOutlineThickness(w); - - _win.draw(l); -} - void UI::render_pos(const hilare_a &pos, sf::Color c) { render_circle(circle(pos.pos(), pos.param->r_c_car), c, sf::Color::Transparent, 2); @@ -223,8 +208,34 @@ void UI::render_obstacle(const obstacle &o) { render_circle(o.c, sf::Color::Transparent, sf::Color(100, 100, 100), 0); } -void UI::render_mvt(const hilare_a_mvt &m) { - // TODO +void UI::render_mvt(const hilare_a_mvt &m, sf::Color c) { + if (m.is_arc) { + sf::Vertex l[20]; + + l[0] = sf::Vertex(to_view(m.from.pos()), c); + + double th = (m.from.pos() - m.center).angle(); + double r = (m.from.pos() - m.center).norm(); + for (int i = 1; i < 19; i++) { + l[i] = sf::Vertex(to_view(m.center + vec::from_polar(r, th + m.domega * i / 20)), c); + } + + l[19] = sf::Vertex(to_view(m.to.pos()), c); + + _win.draw(l, 20, sf::Lines); + } else { + sf::Vertex l[] = { + sf::Vertex(to_view(m.from.pos()), c), + sf::Vertex(to_view(m.to.pos()), c), + }; + _win.draw(l, 2, sf::Lines); + } +} + +void UI::render_sol(const solution &s, sf::Color c) { + for (auto i: s.movement) { + render_mvt(i, c); + } } void UI::render_problem() { @@ -240,12 +251,22 @@ void UI::render_solution() { for (auto i = _s.movement.begin(); i != _s.movement.end(); i++) { if (i != _s.movement.begin()) render_pos(i->from, sf::Color::Green); - render_mvt(*i); } + render_sol(_s.movement, sf::Color::Green); } void UI::render_internal() { - // TODO + solver_internal x = _solver.peek_internal(); + + for (auto& p: x.pts) { + render_pos(p, sf::Color(42, 42, 42)); + } + + for (auto& kv: x.paths) { + for (auto kv2: kv.second) { + render_sol(kv2.second, sf::Color(42, 42, 42)); + } + } } sf::Vector2f UI::to_view(const vec &p) { @@ -26,8 +26,8 @@ class UI { hilare_a_param *_param; problem _p; - solution _s; + solver _solver; struct { double x0, y0, zoom; @@ -49,11 +49,11 @@ class UI { void handle_sel_pos(const sf::Event &ev); void render_circle(const circle& c, sf::Color border, sf::Color inside, int linewidth); - void render_seg(vec a, vec b, sf::Color l, int w); void render_pos(const hilare_a &pos, sf::Color c); void render_obstacle(const obstacle &o); - void render_mvt(const hilare_a_mvt &m); + void render_mvt(const hilare_a_mvt &m, sf::Color c); + void render_sol(const solution &s, sf::Color c); void render_problem(); void render_solution(); |