aboutsummaryrefslogtreecommitdiff
path: root/ui.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ui.cpp')
-rw-r--r--ui.cpp73
1 files changed, 71 insertions, 2 deletions
diff --git a/ui.cpp b/ui.cpp
index 1dbc586..f745cb0 100644
--- a/ui.cpp
+++ b/ui.cpp
@@ -12,6 +12,7 @@
- a : add obstacle
- d : delete obstacle under mouse pointer
- g : start solving
+ - f : follow trajectory mode
Select modes : no other keys
*/
@@ -28,14 +29,15 @@ UI::UI(hilare_a_param *p) : _sel_obs(vec(0,0), 0) {
_mode = M_NORMAL;
_got_sol = true;
+ _follow = false;
}
void UI::run() {
_settings.antialiasingLevel = 8;
- _win.create(sf::VideoMode(800, 600), "PR", sf::Style::Default, _settings);
+ _win.create(sf::VideoMode(1000, 700), "PR", sf::Style::Default, _settings);
_win.setVerticalSyncEnabled(true);
- _win.setFramerateLimit(30);
+ _win.setFramerateLimit(60);
while (_win.isOpen()) {
sf::Event ev;
@@ -61,6 +63,10 @@ void UI::run() {
} else if (k == 'g') {
_solver.start(_p);
_got_sol = false;
+ } else if (k == 'f') {
+ _follow = !_follow;
+ _follow_s = 0;
+ _follow_d = 0;
}
}
@@ -74,6 +80,8 @@ void UI::run() {
_got_sol = true;
}
+ if (_follow) do_follow();
+
_win.clear(sf::Color::Black);
render_internal();
@@ -85,6 +93,8 @@ void UI::run() {
if (_mode == M_SEL_BEGIN || _mode == M_SEL_END)
render_pos(_sel_pos, sf::Color::White);
+ if (_follow) render_pos(_follow_pos, sf::Color::Cyan);
+
_win.display();
}
}
@@ -288,6 +298,65 @@ void UI::render_internal() {
}
}
+void UI::do_follow() {
+ if (_s.movement.size() == 0) return;
+
+ hilare_a_mvt &m = _s.movement[_follow_s];
+
+ int k = m.length() * _view.zoom / 2;
+ const int divide = (k >= 40 ? k : 40);
+
+ int s = _follow_d;
+
+ if (m.dtheta_before != 0) {
+ _follow_pos = m.from;
+ if (s < divide / 2) {
+ _follow_pos.theta += m.dtheta_before * s / (divide / 2);
+ _follow_pos.phi -= m.dtheta_before * s / (divide / 2);
+ } else {
+ s -= divide / 2;
+ s *= 2;
+
+ _follow_pos.theta += m.dtheta_before;
+ _follow_pos.phi -= m.dtheta_before;
+
+ if (m.is_arc) {
+ _follow_pos.theta += m.domega * s / divide;
+
+ vec p = m.center + vec::from_polar((m.from.pos() - m.center).norm(), (m.from.pos() - m.center).angle() + m.domega * s / divide);
+ _follow_pos.x = p.x;
+ _follow_pos.y = p.y;
+ } else {
+ _follow_pos.x = (s * m.to.x + (divide - s) * m.from.x) / divide;
+ _follow_pos.y = (s * m.to.y + (divide - s) * m.from.y) / divide;
+ }
+ }
+ } else {
+ _follow_pos = m.from;
+
+ if (m.is_arc) {
+ _follow_pos.theta += m.domega * s / divide;
+
+ vec p = m.center + vec::from_polar((m.from.pos() - m.center).norm(), (m.from.pos() - m.center).angle() + m.domega * s / divide);
+ _follow_pos.x = p.x;
+ _follow_pos.y = p.y;
+ } else {
+ _follow_pos.x = (s * m.to.x + (divide - s) * m.from.x) / divide;
+ _follow_pos.y = (s * m.to.y + (divide - s) * m.from.y) / divide;
+ }
+ }
+
+ _view.x0 = _follow_pos.x;
+ _view.y0 = _follow_pos.y;
+
+ _follow_d++;
+ if (_follow_d == divide) {
+ _follow_s++;
+ _follow_d = 0;
+ if (_follow_s == _s.movement.size()) _follow = false;
+ }
+}
+
sf::Vector2f UI::to_view(const vec &p) {
sf::Vector2u s = _win.getSize();
return sf::Vector2f((p.x - _view.x0) * _view.zoom + (s.x/2), (p.y - _view.y0) * _view.zoom + (s.y/2));