Commit 4b287ecb authored by Paul Asmuth's avatar Paul Asmuth
Browse files

implement logarithmic domain

parent 1cd7dfcb
Loading
Loading
Loading
Loading
+61 −22
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@
#define _FNORDMETRIC_DOMAIN_H
#include <algorithm>
#include <stdlib.h>
#include <assert.h>
#include <math.h>
#include "../util/format.h"

// FIXPAUL too many copies T val...
@@ -98,11 +98,30 @@ public:
    max_value_(max_value),
    is_logarithmic_(is_logarithmic),
    is_inverted_(is_inverted),
    padding_(
        AnyDomain::kDefaultDomainPadding,
        AnyDomain::kDefaultDomainPadding) {}
    padding_(0, 0) {}

  double scale(T value) const {
    double scaled;

    if (is_logarithmic_) {
      if (min_value_ < 0) {
        RAISE(
            util::RuntimeException,
            "negative value is outside of logarithmic domain");
      }

      double max_log = 0.0f;
      if (max_value_ >= 1.0) {
        max_log = log10(max_value_ + max_value_* padding_.second);
      }

      double value_log = 0.0f;
      if (value >= 1.0) {
        value_log = log10(value);
      }

      scaled = value_log / max_log;
    } else {
      auto min_max = getRangeWithPadding();
      auto min_value = min_max.first;
      auto max_value = min_max.second;
@@ -115,7 +134,8 @@ public:
        return 1.0f;
      }

    auto scaled = (value - min_value) / (max_value - min_value);
      scaled = (value - min_value) / (max_value - min_value);
    }

    if (is_inverted_) {
      return 1.0 - scaled;
@@ -129,6 +149,24 @@ public:
  }

  T valueAt(double index) const {
    if (is_logarithmic_) {
      if (max_value_ < 0) {
        RAISE(
            util::RuntimeException,
            "negative value is outside of logarithmic domain");
      }

      double max_log = 0.0f;
      if (max_value_ >= 1.0) {
        max_log = log10(max_value_ + max_value_* padding_.second);
      }

      if (is_inverted_) {
        return pow(10, (1.0 - index) * max_log);
      } else {
        return pow(10, index * max_log);
      }
    } else {
      auto min_max = getRangeWithPadding();
      auto min_value = min_max.first;
      auto max_value = min_max.second;
@@ -140,6 +178,7 @@ public:
        return min_value + (max_value - min_value) * index;
      }
    }
  }

  std::pair<double, double> scaleRange(T value) const {
    return std::make_pair(scale(value), scale(value));