Program Listing for File InputAxis.cpp#
↰ Return to documentation for file (src/main/cpp/lib/InputAxis.cpp)
#include "InputAxis.h"
InputAxis::Histogram::Histogram (DefVariable variable) :
m_variable (variable), m_num_intervals (0)
{
}
void
InputAxis::Histogram::calculate (const std::vector<double> & data)
{
double span = std::abs (m_variable.max - m_variable.min);
double section_width = span / m_num_intervals;
for (double value : data)
{
if (not std::isnan(value))
{
std::size_t pos = std::floor ((value - m_variable.min) / section_width);
++m_frequencies.at (pos < m_num_intervals ? pos : m_num_intervals - 1);
}
}
if (data.size () > 0)
{
for (std::size_t i = 0; i < m_frequencies.size (); ++i)
{
m_frequencies[i] /= data.size ();
}
}
}
double
InputAxis::Histogram::get_section_frequency (std::size_t i) const
{
if (i >= m_num_intervals)
{
throw std::out_of_range (
"Histogram section index is out of range (value: "
+ std::to_string (i) + ", range: 0-"
+ std::to_string (m_num_intervals - 1) + ")");
}
return m_frequencies[i];
}
InputAxis::InputAxis (DefVariable variable, const Angle& start,
const Angle& end, double radius, double height,
const DrawerProperties<> & prop) :
m_variable (variable), m_scale (
Configuration::get_instance ().get_num_major_sections_axis (),
Configuration::get_instance ().get_num_minor_sections_axis (),
std::make_pair(variable.min, variable.max),
Configuration::get_instance ().get_prop_scale_label (), variable.unit), m_start (
start), m_end (end), m_radius (radius), m_height (height), m_prop (
prop), m_histogram (variable)
{
}
void
InputAxis::calculate_histogram (const std::vector<double> & data)
{
m_histogram.set_num_intervals (
Configuration::get_instance ().get_num_histogram_classes ());
m_histogram.calculate (data);
}