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

areachart :)

parent c3277b7a
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -17,9 +17,9 @@ namespace fnordmetric {
namespace ui {

char AreaChart::kDefaultLineStyle[] = "none";
char AreaChart::kDefaultLineWidth[] = "2";
char AreaChart::kDefaultLineWidth[] = "1";
char AreaChart::kDefaultPointStyle[] = "none";
char AreaChart::kDefaultPointSize[] = "3";
char AreaChart::kDefaultPointSize[] = "2";

AreaChart::AreaChart(
    ui::Canvas* canvas,
+103 −0
Original line number Diff line number Diff line
@@ -249,6 +249,85 @@ void AreaChart3D<TX, TY, TZ>::render(
    RenderTarget* target,
    Viewport* viewport) const {
  target->beginGroup("areas");

  for (const auto& area : areas_) {
    std::vector<std::pair<double, double>> area_coords;
    std::vector<std::pair<double, double>> border_top_coords;
    std::vector<std::pair<double, double>> border_bottom_coords;
    std::vector<std::pair<double, double>> point_coords;

    for (int i = 0; i < area.points.size(); ++i) {
      const auto& point = area.points[i];
      auto s_x = x_domain_.getAs<Domain<TX>>()->scale(std::get<0>(point));
      auto s_y2 = 1.0 - y_domain_.getAs<Domain<TY>>()->scale(
          std::get<2>(point));

      auto draw_x = viewport->paddingLeft() + s_x * viewport->innerWidth();
      auto draw_y2 = viewport->paddingTop() + s_y2 * viewport->innerHeight();

      area_coords.emplace_back(draw_x, draw_y2);
      border_top_coords.emplace_back(draw_x, draw_y2);
      point_coords.emplace_back(draw_x, draw_y2);
    }

    for (int i = area.points.size() - 1; i >= 0; --i) {
      const auto& point = area.points[i];
      auto s_x = x_domain_.getAs<Domain<TX>>()->scale(std::get<0>(point));
      auto s_y1 = 1.0 - y_domain_.getAs<Domain<TY>>()->scale(
          std::get<1>(point));
      auto draw_x = viewport->paddingLeft() + s_x * viewport->innerWidth();
      auto draw_y1 = viewport->paddingTop() + s_y1 * viewport->innerHeight();

      area_coords.emplace_back(draw_x, draw_y1);

      if (std::get<1>(point) != 0) {
        border_bottom_coords.emplace_back(draw_x, draw_y1);
        point_coords.emplace_back(draw_x, draw_y1);
      }
    }

    target->drawPath(
        area_coords,
        "fill",
        area.line_style == "none" ? 0 : area.line_width,
        false,
        area.color,
        "area");

    if (area.line_style != "none") {
      target->drawPath(
          border_top_coords,
          area.line_style,
          area.line_width,
          false,
          area.color,
          "line");

      if (border_bottom_coords.size() > 0) {
        target->drawPath(
            border_bottom_coords,
            area.line_style,
            area.line_width,
            false,
            area.color,
            "line");
      }
    }

    if (area.point_style != "none") {
      for (const auto &point : point_coords) {
        target->drawPoint(
            point.first,
            point.second,
            area.point_style,
            area.point_size,
            area.color,
            "point");
      }
    }
  }


  target->finishGroup();
}

@@ -333,6 +412,30 @@ void AreaChart2D<TX, TY>::addSeries(Series2D<TX, TY>* series) {
        series->getProperty(Series::P_COLOR));
  }

  if (series->hasProperty(Series::P_LINE_STYLE)) {
    series3d->setDefaultProperty(
        Series::P_LINE_STYLE,
        series->getProperty(Series::P_LINE_STYLE));
  }

  if (series->hasProperty(Series::P_LINE_WIDTH)) {
    series3d->setDefaultProperty(
        Series::P_LINE_WIDTH,
        series->getProperty(Series::P_LINE_WIDTH));
  }

  if (series->hasProperty(Series::P_POINT_STYLE)) {
    series3d->setDefaultProperty(
        Series::P_POINT_STYLE,
        series->getProperty(Series::P_POINT_STYLE));
  }

  if (series->hasProperty(Series::P_POINT_SIZE)) {
    series3d->setDefaultProperty(
        Series::P_POINT_SIZE,
        series->getProperty(Series::P_POINT_SIZE));
  }

  AreaChart3D<TX, TY, TY>::addSeries(series3d);
}

+7 −7
Original line number Diff line number Diff line
@@ -91,12 +91,12 @@ public:
   * @param logarithmic is this domain a logarithmic domain?
   */
  ContinuousDomain(
    T min_value = 0,
    T max_value = 0,
    T min_value = std::numeric_limits<T>::max(),
    T max_value = std::numeric_limits<T>::min(),
    bool is_logarithmic = false,
    bool is_inverted = false) :
    min_value_(std::numeric_limits<double>::max()),
    max_value_(std::numeric_limits<double>::min()),
    min_value_(min_value),
    max_value_(max_value),
    is_logarithmic_(is_logarithmic),
    is_inverted_(is_inverted),
    padding_(0, 0) {}
@@ -237,6 +237,9 @@ public:
    padding_.second = max_padding;
  }


  double min_value_;
  double max_value_;
protected:

  std::pair<double, double> getRangeWithPadding() const {
@@ -246,9 +249,6 @@ protected:
        min_value_ == 0 ? 0 : min_value_ - range * padding_.first,
        max_value_ + range * padding_.second);
  }

  double min_value_;
  double max_value_;
  bool is_logarithmic_;
  bool is_inverted_;
  std::pair<double, double> padding_;
+15 −10
Original line number Diff line number Diff line
@@ -834,6 +834,8 @@ static fnordmetric::util::UnitTest::TestCase __test_simple_area_chart_(
  series1.addDatum(30, 33);
  series1.addDatum(40, 21);
  series1.addDatum(50, 33);
  series1.setDefaultProperty(Series::P_LINE_STYLE, "solid");
  series1.setDefaultProperty(Series::P_POINT_STYLE, "circle");

  ui::ContinuousDomain<double> x_domain(10, 50, false);
  ui::ContinuousDomain<double> y_domain(0, 50, false);
@@ -851,7 +853,6 @@ static fnordmetric::util::UnitTest::TestCase __test_simple_area_chart_(
      &canvas,
      "UITest_TestSimpleAreaChart_out.svg.html");
});
/*

static fnordmetric::util::UnitTest::TestCase __test_range_area_chart_(
    &UITest, "TestRangeAreaChart", [] () {
@@ -862,13 +863,16 @@ static fnordmetric::util::UnitTest::TestCase __test_range_area_chart_(
  series1.addDatum(30, -24, 33);
  series1.addDatum(40, -18, 21);
  series1.addDatum(50, -32, 33);
  series1.setDefaultProperty(Series::P_LINE_STYLE, "solid");
  series1.setDefaultProperty(Series::P_POINT_STYLE, "circle");

  ui::ContinuousDomain<double> x_domain(10, 50, false);
  ui::ContinuousDomain<double> y_domain(-50, 50, false);

  Canvas canvas;
  auto area_chart = canvas.addChart<AreaChart>(&x_domain, &y_domain);
  area_chart->addSeries(&series1, "solid", 2, "circle", 4);
  auto area_chart = canvas.addChart<AreaChart3D<double, double, double>>(
      &x_domain, &y_domain);
  area_chart->addSeries(&series1);
  area_chart->addAxis(AxisDefinition::TOP);
  area_chart->addAxis(AxisDefinition::RIGHT);
  area_chart->addAxis(AxisDefinition::BOTTOM);
@@ -901,7 +905,8 @@ static fnordmetric::util::UnitTest::TestCase __test_multi_range_area_chart_(
  ui::ContinuousDomain<double> y_domain(-50, 50, false);

  Canvas canvas;
  auto area_chart = canvas.addChart<AreaChart>(&x_domain, &y_domain);
  auto area_chart = canvas.addChart<AreaChart3D<double, double, double>>(
      &x_domain, &y_domain);
  area_chart->addSeries(&series1);
  area_chart->addSeries(&series2);
  area_chart->addAxis(AxisDefinition::TOP);
@@ -939,13 +944,14 @@ static fnordmetric::util::UnitTest::TestCase __test_multi_range_area_line_(
  series3.addDatum(30, 2);
  series3.addDatum(40, 1);
  series3.addDatum(50, 9);
  series3.setColor("black");
  series3.setDefaultProperty(Series::P_COLOR, "black");

  ui::ContinuousDomain<double> x_domain(10, 50, false);
  ui::ContinuousDomain<double> y_domain(-50, 50, false);

  Canvas canvas;
  auto area_chart = canvas.addChart<AreaChart>(&x_domain, &y_domain);
  auto area_chart = canvas.addChart<AreaChart3D<double, double, double>>(
      &x_domain, &y_domain);
  area_chart->addSeries(&series1);
  area_chart->addSeries(&series2);
  area_chart->addAxis(AxisDefinition::TOP);
@@ -953,12 +959,11 @@ static fnordmetric::util::UnitTest::TestCase __test_multi_range_area_line_(
  area_chart->addAxis(AxisDefinition::BOTTOM);
  area_chart->addAxis(AxisDefinition::LEFT);

  auto line_chart = canvas.addChart<LineChart>(&x_domain, &y_domain);
  line_chart->addSeries(&series3, "solid", 2, "circle", 4);
  auto line_chart = canvas.addChart<LineChart2D<double, double>>(
      &x_domain, &y_domain);
  line_chart->addSeries(&series3);

  compareChart(
      &canvas,
      "UITest_TestMultiRangeAreaLineChart_out.svg.html");
});

*/