From e1658b7ffaae49085ea8ef501b24b8645b071b85 Mon Sep 17 00:00:00 2001 From: DaMichel Date: Thu, 4 Aug 2016 10:06:36 +0200 Subject: filter/kalman: log sliders that only change a single decimal digit at a time when moved --- filter-kalman/ftnoir_kalman_filtercontrols.ui | 24 +++++++++++++++--------- filter-kalman/kalman.h | 27 ++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/filter-kalman/ftnoir_kalman_filtercontrols.ui b/filter-kalman/ftnoir_kalman_filtercontrols.ui index 2e9bcae7..6ec18ba8 100644 --- a/filter-kalman/ftnoir_kalman_filtercontrols.ui +++ b/filter-kalman/ftnoir_kalman_filtercontrols.ui @@ -9,7 +9,7 @@ 0 0 - 431 + 438 141 @@ -52,11 +52,14 @@ - 10000 + 400 1 + + 100 + true @@ -67,10 +70,10 @@ false - QSlider::NoTicks + QSlider::TicksBelow - 10 + 100 @@ -84,16 +87,19 @@ - 10000 + 400 + + + 100 Qt::Horizontal - QSlider::NoTicks + QSlider::TicksBelow - 10 + 100 @@ -101,7 +107,7 @@ - 60 + 65 0 @@ -114,7 +120,7 @@ - 60 + 65 0 diff --git a/filter-kalman/kalman.h b/filter-kalman/kalman.h index 3bb5aad2..3c9466a5 100644 --- a/filter-kalman/kalman.h +++ b/filter-kalman/kalman.h @@ -96,10 +96,31 @@ struct settings : opts { static constexpr double process_sigma_pos = 0.5; static constexpr double process_simga_rot = 0.5; - static double map_slider_value(const slider_value &v) + static double map_slider_value(const slider_value &v_) { - //return std::pow(4., v * 5. - 4.) / 4. * 10.; // not so much difference, except that it is harder to adjust the min-max range. - return std::pow(10., v * 4. - 3.); + const double v = v_; +#if 0 + //return std::pow(10., v * 4. - 3.); +#else + constexpr int min_log10 = -3; + constexpr int max_log10 = 1; + constexpr int num_divisions = max_log10 - min_log10; + /* ascii art representation of slider + // ----- // ------// ------// ------- // 4 divisions + -3 - 2 -1 0 1 power of 10 + | | + | f + left_side_log10 + | + left_side_log10 + */ + const int k = v * num_divisions; // in which division are we?! + const double f = v * num_divisions - k; // where in the division are we?! + const double ff = f * 9. + 1.; + const double multiplier = int(ff * 10.) / 10.; + const int left_side_log10 = min_log10 + k; + const double val = std::pow(10., left_side_log10) * multiplier; + return val; +#endif } settings() : -- cgit v1.2.3