Commit 52f33789 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

add basic axis rendering

parent 0912fa39
Loading
Loading
Loading
Loading
+24 −61
Original line number Diff line number Diff line
@@ -47,10 +47,6 @@ bool AxisDefinition::hasLabels() const {
  return has_labels_;
}

AxisDefinition::kLabelPosition AxisDefinition::getLabelPosition() const {
  return LABELS_INSIDE;
}

void AxisDefinition::setTitle(const std::string& title) {
  title_ = title;
}
@@ -339,69 +335,36 @@ void renderBottomAxis(

}

void renderLeftAxis(
    Layer* target,
    Viewport* viewport,
    AxisDefinition* axis,
    int left) {
void renderAxisVertical(
    const AxisDefinition& axis_config,
    double x,
    double y0,
    double y1,
    Layer* target) {
  /* draw axis line */ 
  {
    StrokeStyle style;

  int padding_top = viewport->paddingTop();
  int inner_height = viewport->innerHeight();

  left += kAxisPadding;

  /* draw title */
  if (axis->hasTitle()) {
    drawText(target,
        axis->getTitle(),
        left,
        padding_top + inner_height * 0.5f,
        "middle",
        "text-before-edge",
        "title",
        270);

    left += kAxisTitleLength;
    strokeLine(target, x, y0, x, y1, style);
  }

  /* draw labels */
  if (axis->hasLabels()) {
    left += kAxisLabelWidth; // FIXPAUL: calculate label width?

    for (const auto& label : axis->getLabels()) {
      auto tick_y = padding_top + inner_height * (1.0 - label.first);

      drawText(target,
          label.second,
          left - (kTickLength * 2),
          tick_y,
          "end",
          "middle",
          "label");
    }
  double label_placement = 0;
  switch (axis_config.label_placement) {
    case AxisDefinition::LABELS_RIGHT:
      label_placement = 1;
      break;
    case AxisDefinition::LABELS_LEFT:
      label_placement = -1;
      break;
    default:
      break;
  }

  /* draw ticks */
  for (const auto& tick : axis->getTicks()) {
    auto tick_y = padding_top + inner_height * (1.0 - tick);

    strokeLine(target,
        left,
        tick_y,
        left + kTickLength,
        tick_y,
        style);
  for (const auto& tick : axis_config.getTicks()) {
    auto y = y0 + (y1 - y0) * tick;
    StrokeStyle style;
    strokeLine(target, x, y, x + kTickLength * label_placement, y, style);
  }

  /* draw stroke */
  strokeLine(target,
      left,
      padding_top,
      left,
      padding_top + inner_height,
      style);

}

}
+15 −10
Original line number Diff line number Diff line
@@ -29,10 +29,12 @@ public:
  /**
   * The axis tick position
   */
  enum kLabelPosition {
    LABELS_INSIDE = 0,
    LABELS_OUTSIDE = 1,
    LABELS_OFF = 2
  enum kLabelPlacement {
    LABELS_LEFT,
    LABELS_RIGHT,
    LABELS_TOP,
    LABELS_BOTTOM,
    LABELS_OFF
  };

  /**
@@ -80,12 +82,12 @@ public:
  /**
   * Set the label position for this axis
   */
  void setLabelPosition(kLabelPosition pos);
  void setLabelPlacement(kLabelPlacement pos);

  /**
   * Return the label position for this axis
   */
  kLabelPosition getLabelPosition() const;
  kLabelPlacement getLabelPlacement() const;

  /**
   * Set the label rotation for this axis
@@ -119,6 +121,7 @@ public:
  bool has_ticks_;
  std::vector<std::pair<double, std::string>> labels_;
  bool has_labels_;
  kLabelPlacement label_placement;
};

struct AxisDefinitions {
@@ -131,10 +134,12 @@ struct AxisDefinitions {
/**
 * Render the axes
 */
void renderAxes(
    const Layer& input,
    Layer* target,
    Viewport* viewport);
void renderAxisVertical(
    const AxisDefinition& axis_config,
    double x,
    double y0,
    double y1,
    Layer* target);

/**
 * Render a top axis
+64 −0
Original line number Diff line number Diff line
/**
 * This file is part of the "signaltk" project
 *   Copyright (c) 2018 Paul Asmuth
 *
 * libstx is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License v3.0. You should have received a
 * copy of the GNU General Public License along with this program. If not, see
 * <http://www.gnu.org/licenses/>.
 */
#include "signaltk/plot/axes.h"

using namespace signaltk;
using namespace signaltk::chart;

int main(int argc, char** argv) {
  Layer target(1000, 600);
  target.clear(Colour{1, 1, 1, 1});

  double padding = 20;

  // draw left axis
  {
    AxisDefinition axis;
    axis.label_placement = AxisDefinition::LABELS_RIGHT;
    axis.addTick(0.0);
    axis.addTick(0.2);
    axis.addTick(0.4);
    axis.addTick(0.6);
    axis.addTick(0.8);
    axis.addTick(1.0);
    renderAxisVertical(axis, padding, padding, target.height - padding, &target);
  }

  // draw right axis
  {
    AxisDefinition axis;
    axis.label_placement = AxisDefinition::LABELS_LEFT;
    axis.addTick(0.0);
    axis.addTick(0.2);
    axis.addTick(0.4);
    axis.addTick(0.6);
    axis.addTick(0.8);
    axis.addTick(1.0);
    renderAxisVertical(axis, target.width - padding, padding, target.height - padding, &target);
  }

  //axis_left->setTitle("my axis");
  //axis_left->addTick(0.0);
  //axis_left->addTick(0.2);
  //axis_left->addTick(0.4);
  //axis_left->addTick(0.6);
  //axis_left->addTick(0.8);
  //axis_left->addTick(1.0);
  //axis_left->addLabel(0.0, "0");
  //axis_left->addLabel(0.2, "1");
  //axis_left->addLabel(0.4, "2");
  //axis_left->addLabel(0.6, "3");
  //axis_left->addLabel(0.8, "4");
  //axis_left->addLabel(1.0, "5");


  target.writePNG(std::string(argv[0]) + ".png");
}
+3.29 KiB
Loading image diff...