#include "GraphUtil.h" cGraphUtil::tBarPlot::tBarPlot() { mMinVal = 0; mMaxVal = 1; mBaseVal = 0; mVals.resize(0); mColors.clear(); } void cGraphUtil::DrawBarPlot(const tBarPlot& bar_plot, const tVector& pos, const tVector& size) { cDrawUtil::SetLineWidth(1); cDrawUtil::SetColor(tVector(1, 1, 1, 0.5)); cDrawUtil::DrawRect(pos, size); const Eigen::VectorXd& vals = bar_plot.mVals; double min_val = bar_plot.mMinVal; double max_val = bar_plot.mMaxVal; double base_val = bar_plot.mBaseVal; const tVectorArr& cols = bar_plot.mColors; int num_vals = static_cast(vals.size()); int num_cols = static_cast(cols.size()); double norm_base_val = (base_val - min_val) / (max_val - min_val); for (int i = 0; i < num_vals; ++i) { double curr_val = vals[i]; double norm_curr_val = (curr_val - min_val) / (max_val - min_val); tVector bar_min = tVector::Zero(); tVector bar_max = tVector::Zero(); bar_min[0] = static_cast(i) / num_vals; bar_max[0] = static_cast(i + 1) / num_vals; if (curr_val < base_val) { bar_min[1] = norm_curr_val; bar_max[1] = norm_base_val; } else { bar_min[1] = norm_base_val; bar_max[1] = norm_curr_val; } bar_min[1] = cMathUtil::Clamp(bar_min[1], 0.0, 1.0); bar_max[1] = cMathUtil::Clamp(bar_max[1], 0.0, 1.0); bar_min = size.cwiseProduct(bar_min) + pos - 0.5 * size; bar_max = size.cwiseProduct(bar_max) + pos - 0.5 * size; const tVector& col = cols[i % num_cols]; cDrawUtil::SetColor(col); cDrawUtil::DrawRect(0.5 * (bar_max + bar_min), bar_max - bar_min); } double base_y = size[1] * norm_base_val + pos[1] - 0.5 * size[1]; tVector base0 = pos; tVector base1 = pos; base0[0] += -0.5 * size[0]; base1[0] += 0.5 * size[0]; base0[1] = base_y; base1[1] = base_y; cDrawUtil::SetColor(tVector(0, 0, 0, 1)); cDrawUtil::DrawLine(base0, base1); cDrawUtil::DrawRect(pos, size, cDrawUtil::eDrawWire); }