Program Listing for File Drawer.h

Program Listing for File Drawer.h#

Return to documentation for file (src/main/cpp/lib/Drawer.h)

#ifndef DRAWER_H_
#define DRAWER_H_

#include "IOVector.h"

class Drawer
{
protected:
  CoordinateConverter m_coord_converter;
  std::size_t m_num_inputs;
public:
  /* Constant affecting the distance of the control points of a link Bezier curve */
  static constexpr double LINK_CONTROL_STRENGTH = 100;

  struct TextAlignment
  {
    const static TextAlignment LEFT, HALF_LEFT, CENTERED, HALF_RIGHT, RIGHT;
    double ratio;
    TextAlignment (double ratio);
  };

  Drawer (int width, int height, std::size_t num_inputs) :
      m_coord_converter (width, height), m_num_inputs (num_inputs)
  {
  }

  virtual
  ~Drawer ()
  {
  }

  virtual void
  change_surface (const std::string& fpath, int width, int height,
          std::size_t num_inputs) = 0;

  virtual void
  draw_output_grid (const OutputGrid& grid) = 0;

  virtual void
  draw_input_axis (const InputAxis& axis) = 0;

  virtual void
  draw_io_vector (const IOVector& elem) = 0;

  virtual void
  finish () = 0;

  inline void
  set_num_inputs (std::size_t num_inputs)
  {
    m_num_inputs = num_inputs;
  }

protected:
  virtual void
  set_surface (const std::string& fpath, int width, int height) = 0;

  virtual void
  draw_histogram (const InputAxis::Histogram& histogram, double radius,
          const Angle& start, const Angle& end) = 0;

  virtual void
  draw_link (const Polar& origin1, const Polar& origin2, const Polar& target1,
         const Polar& target2, const DrawerProperties<>& prop) = 0;

  virtual void
  draw_connector (const Polar& from, const Polar& to,
          const DrawerProperties<>& prop) = 0;

  virtual void
  draw_segment_axis (double inner_radius, double thickness, const Angle& begin,
             const Angle& end,
             const DrawerProperties<std::array<Color, 10>>& prop,
             Direction dir) = 0;

  virtual void
  draw_output_label (const Label& output_label, double radius_label,
             double radius_output, const Angle& begin,
             const Angle& end) = 0;

  virtual void
  draw_arrow (const Polar& start, const DrawerProperties<>& prop) = 0;

  virtual void
  draw_ring_segment (double radius, double thickness, const Angle& start,
             const Angle& end, const DrawerProperties<>& prop,
             Direction dir) = 0;

  virtual void
  draw_connector_segment (double start_radius, double start_angle,
              double end_radius, double end_angle,
              const DrawerProperties<>& prop) = 0;

  virtual void
  draw_line (const Polar& from, const Polar& to,
         const DrawerProperties<>& prop) = 0;

  virtual void
  draw_arc (double inner_radius, const Angle& start, const Angle& end,
        Direction dir) = 0;

  virtual void
  draw_coord_point (const Polar& coord, const Angle& width, double height,
            const DrawerProperties<>& prop) = 0;

  virtual void
  draw_text_parallel (
      const Label& label, const Polar & start, const TextAlignment& alignment =
      TextAlignment::CENTERED) = 0;

  virtual void
  draw_text_orthogonal (
      const Label& label, const Polar& start, const TextAlignment& alignment =
      TextAlignment::CENTERED) = 0;

  inline Polar
  get_connector_start (const Polar& from, const Polar& to)
  {
    return Polar (from.radius () + 0.1 * (to.radius () - from.radius ()),
          from.angle ());
  }

  inline Polar
  get_connector_end (const Polar& from, const Polar& to)
  {
    return Polar (to.radius () - 0.1 * (to.radius () - from.radius ()),
          to.angle ());
  }

  inline Cartesian
  create_link_control_point (const Polar& point) const
  {
    Polar control (point);
    control.radius () -= LINK_CONTROL_STRENGTH;

    Cartesian control_c;
    m_coord_converter.convert (control, control_c);

    return control_c;
  }
};



#endif /* DRAWER_H_ */