Commit dd3fc0f3 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

domain: add domain_untranslate, inverted flag

parent 1c468684
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -241,7 +241,7 @@ ReturnCode axis_expand_linear_geom(

  for (size_t i = 0; i < num_ticks; ++i) {
    auto o = (1.0f / (num_ticks - 1)) * i;
    auto v = min + (max - min) * o;
    auto v = domain_untranslate(domain, o);
    axis->ticks.emplace_back(o);

    if (axis->label_formatter.format_number) {
+30 −6
Original line number Diff line number Diff line
@@ -32,7 +32,8 @@
namespace plotfx {

DomainConfig::DomainConfig() :
    space(PlotDomain::LINEAR) {}
    kind(DomainKind::LINEAR),
    inverted(false) {}

void domain_fit(const std::vector<double>& data, DomainConfig* domain) {
  bool fit_min = !domain->min;
@@ -52,14 +53,37 @@ double domain_translate(const DomainConfig& domain, double v) {
  auto min = domain.min.value_or(0.0f);
  auto max = domain.max.value_or(0.0f);

  switch (domain.space) {
    case PlotDomain::LINEAR:
      return (v - min) / (max - min);
    default:
      return 0.0f;
  auto vt = 0.0;
  switch (domain.kind) {
    case DomainKind::LINEAR:
      vt = (v - min) / (max - min);
      break;
  }

  if (domain.inverted) {
    vt = 1.0 - vt;
  }

  return vt;
}

double domain_untranslate(const DomainConfig& domain, double vt) {
  auto min = domain.min.value_or(0.0f);
  auto max = domain.max.value_or(0.0f);

  if (domain.inverted) {
    vt = 1.0 - vt;
  }

  auto v = 0.0;
  switch (domain.kind) {
    case DomainKind::LINEAR:
      v = min + (max - min) * vt;
      break;
  }

  return v;
}

namespace chart {

+5 −2
Original line number Diff line number Diff line
@@ -39,13 +39,14 @@
// FIXPAUL too many copies T val...
namespace plotfx {

enum class PlotDomain {
enum class DomainKind {
  LINEAR
};

struct DomainConfig {
  DomainConfig();
  PlotDomain space;
  DomainKind kind;
  bool inverted;
  std::optional<double> min;
  std::optional<double> max;
};
@@ -54,6 +55,8 @@ void domain_fit(const std::vector<double>& data, DomainConfig* domain);

double domain_translate(const DomainConfig& domain, double v);

double domain_untranslate(const DomainConfig& domain, double v);

namespace chart {

/**