Я ищу наиболее краткую и общую реализацию следующей функции:
float Constrain(float value, float min, float max);
Где Constrain () ограничивает value
в диапазоне [min, float)
. То есть диапазон включает мин, но исключает max
и values
больше чем max
или меньше чем min
, обернутые в круг То есть аналогично целым числам over / underflow.
Функция должна пройти следующие тесты:
Constrain( 0.0, 0.0, 10.0) == 0.0
Constrain( 10.0, 0.0, 10.0) == 0.0
Constrain( 5.0, 0.0, 10.0) == 5.0
Constrain( 15.0, 0.0, 10.0) == 5.0
Constrain( -1.0, 0.0, 10.0) == 9.0
Constrain(-15.0, 0.0, 10.0) == 5.0
Constrain( 0.0, -5.0, 5.0) == 0.0
Constrain( 5.0, -5.0, 5.0) == -5.0
Constrain( 0.0, -5.0, 5.0) == 0.0
Constrain( 10.0, -5.0, 5.0) == 0.0
Constrain( -6.0, -5.0, 5.0) == 4.0
Constrain(-10.0, -5.0, 5.0) == 0.0
Constrain( 24.0, -5.0, 5.0) == 4.0
Constrain( 0.0, -5.0, 0.0) == -5.0
Constrain( 5.0, -5.0, 0.0) == -5.0
Constrain( 10.0, -5.0, 0.0) == -5.0
Constrain( -3.0, -5.0, 0.0) == -3.0
Constrain( -6.0, -5.0, 0.0) == -1.0
Constrain(-10.0, -5.0, 0.0) == -5.0
Обратите внимание, что параметр min
всегда можно считать численно меньшим, чем max
.
Вероятно, есть очень простая формула для решения этого вопроса, но я невероятно туп, не зная его обобщенного решения.