Program Listing for File CanvasMathHelper.hpp

Return to documentation for file (include/dish2/viz/util/CanvasMathHelper.hpp)

#pragma once
#ifndef DISH2_VIZ_UTIL_CANVASMATHHELPER_HPP_INCLUDE
#define DISH2_VIZ_UTIL_CANVASMATHHELPER_HPP_INCLUDE

#include <cmath>

#include "../../../../third-party/conduit/include/uitsl/debug/audit_cast.hpp"
#include "../../../../third-party/Empirical/include/emp/math/math.hpp"
#include "../../../../third-party/Empirical/include/emp/web/Canvas.hpp"

#include "../../config/cfg.hpp"
#include "../../config/num_cells_local.hpp"

namespace dish2 {

class CanvasMathHelper {

  const size_t canvas_height;
  const size_t canvas_width;

public:

  CanvasMathHelper(const emp::web::Canvas& canvas)
  : canvas_height( canvas.GetHeight() )
  , canvas_width( canvas.GetWidth() )
  { emp_assert( canvas_height > 0 ); emp_assert( canvas_width > 0 );}

  size_t GetGridWidth() const { return std::sqrt( dish2::num_cells_local() ); }

  size_t GetGridHeight() const { return std::sqrt( dish2::num_cells_local() ); }

  size_t GetCellWidthPx() const {
    emp_assert( GetGridWidth() >= 0 );
    return canvas_width / GetGridWidth();
  }

  size_t GetCellHeightPx() const {
    emp_assert( GetGridHeight() >= 0 );
    return canvas_height / GetGridHeight();
  }

  size_t GetCanvasX(const double grid_x) const {

    emp_assert( GetGridWidth() <= canvas_width );
    const size_t offset_x = (
      canvas_width - GetCellWidthPx() * GetGridWidth()
    ) / 2;

    return grid_x * GetCellWidthPx() + offset_x;

  }

  size_t GetCanvasY(const double grid_y) const {

    emp_assert( GetGridHeight() <= canvas_height );
    const size_t offset_y = (
      canvas_height - GetCellHeightPx() * GetGridHeight()
    ) / 2;

    return grid_y * GetCellHeightPx() + offset_y;

  }

  size_t GetGridX(const size_t pos) const { return pos % GetGridWidth(); }

  size_t GetGridY(const size_t pos) const { return pos / GetGridHeight(); }

  size_t GetPopulationPos(const int x, const int y) const {

    const int h = uitsl::audit_cast<int>( GetGridWidth() );
    const int w = uitsl::audit_cast<int>( GetGridHeight() );

    return emp::Mod(y, h) * w + emp::Mod(x, w);

  }

};

} // namespace dish2

#endif // #ifndef DISH2_VIZ_UTIL_CANVASMATHHELPER_HPP_INCLUDE