2016-05-30 23:58:58 -04:00
|
|
|
#pragma once
|
2016-05-19 10:41:06 -04:00
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
2016-06-14 23:32:35 -04:00
|
|
|
#include "common.hpp"
|
|
|
|
|
|
|
|
LEMONBUDDY_NS
|
|
|
|
|
2016-10-19 08:46:43 -04:00
|
|
|
namespace math_util {
|
2016-06-14 23:32:35 -04:00
|
|
|
/**
|
|
|
|
* Limit value T by min and max bounds
|
|
|
|
*/
|
2016-10-25 01:04:14 -04:00
|
|
|
template <typename ValueType>
|
|
|
|
ValueType cap(ValueType value, ValueType min_value, ValueType max_value) {
|
|
|
|
value = std::min<ValueType>(value, max_value);
|
|
|
|
value = std::max<ValueType>(value, min_value);
|
2016-05-19 10:41:06 -04:00
|
|
|
return value;
|
|
|
|
}
|
2016-10-19 08:46:43 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Calculate the percentage for a value
|
|
|
|
* within given range
|
|
|
|
*/
|
2016-10-25 01:04:14 -04:00
|
|
|
template <typename ValueType, typename ReturnType = int>
|
|
|
|
ReturnType percentage(ValueType value, ValueType min_value, ValueType max_value) {
|
|
|
|
auto upper = (max_value - min_value);
|
|
|
|
auto lower = static_cast<float>(value - min_value);
|
|
|
|
ValueType percentage = (lower / upper) * 100.0f;
|
|
|
|
if (std::is_integral<ReturnType>())
|
|
|
|
percentage += 0.5f;
|
|
|
|
return cap<ReturnType>(percentage, 0.0f, 100.0f);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get value for percentage of `max_value`
|
|
|
|
*/
|
|
|
|
template <typename ValueType, typename ReturnType = int>
|
|
|
|
ReturnType percentage_to_value(ValueType percentage, ValueType max_value) {
|
|
|
|
if (std::is_integral<ReturnType>())
|
|
|
|
return cap<ReturnType>(percentage * max_value / 100.0f + 0.5f, 0, max_value);
|
|
|
|
else
|
|
|
|
return cap<ReturnType>(percentage * max_value / 100.0f, 0.0f, max_value);
|
2016-10-19 08:46:43 -04:00
|
|
|
}
|
2016-05-19 10:41:06 -04:00
|
|
|
}
|
2016-06-14 23:32:35 -04:00
|
|
|
|
|
|
|
LEMONBUDDY_NS_END
|