Vuo  2.4.1
VuoRange.h
Go to the documentation of this file.
1
10#pragma once
11
12#include "VuoReal.h"
13#include <float.h>
14
16#define VuoRange_NoMinimum -INFINITY
17
19#define VuoRange_NoMaximum INFINITY
20
24typedef struct
25{
26 // The minimum value of a range. (VuoRange_NoMinimum >= minimum >= maximum)
27 VuoReal minimum;
28
29 // The maximum value of a range. (minimum >= maximum >= VuoRange_NoMaximum)
30 VuoReal maximum;
31} VuoRange;
32
34struct json_object * VuoRange_getJson(const VuoRange value);
35char * VuoRange_getSummary(const VuoRange value);
36
38#define VuoRange_SUPPORTS_COMPARISON
39bool VuoRange_areEqual(const VuoRange a, const VuoRange b);
40bool VuoRange_isLessThan(const VuoRange a, const VuoRange b);
41
43
46char * VuoRange_getString(const VuoRange value);
50
54static inline VuoRange VuoRange_make(VuoReal _minimum, VuoReal _maximum) __attribute__((const));
55static inline VuoRange VuoRange_make(VuoReal _minimum, VuoReal _maximum)
56{
57 return (VuoRange){_minimum, _maximum};
58}
59
63static inline bool VuoRange_isInverted(VuoRange range) __attribute__((const));
64static inline bool VuoRange_isInverted(VuoRange range)
65{
66 return range.minimum > range.maximum;
67}
68
72static inline VuoRange VuoRange_getOrderedRange(VuoRange range) __attribute__((const));
74{
75 if (VuoRange_isInverted(range))
76 return (VuoRange){range.maximum, range.minimum};
77 else
78 return range;
79}
80
84static inline VuoRange VuoRange_makeNonzero(VuoRange a) __attribute__((const));
86{
87 if (fabs(a.maximum - a.minimum) < FLT_EPSILON)
88 a.maximum = a.minimum + FLT_EPSILON;
89 return a;
90}
91
97static inline VuoReal VuoRange_clamp(VuoRange range, VuoReal value) __attribute__((const));
98static inline VuoReal VuoRange_clamp(VuoRange range, VuoReal value)
99{
100 VuoReal lower = fmin(range.minimum, range.maximum);
101 VuoReal upper = fmax(range.minimum, range.maximum);
102 return fmin(fmax(value, lower), upper);
103}
104
112static inline VuoReal VuoRange_scale(VuoRange from, VuoRange to, VuoReal value) __attribute__((const));
113static inline VuoReal VuoRange_scale(VuoRange from, VuoRange to, VuoReal value)
114{
115 VuoReal from_lower = fmin(from.minimum, from.maximum);
116 VuoReal from_upper = fmax(from.minimum, from.maximum);
117 VuoReal to_lower = fmin(to.minimum, to.maximum);
118 VuoReal to_upper = fmax(to.minimum, to.maximum);
119
120 if( from_lower == VuoRange_NoMinimum || from_upper == VuoRange_NoMaximum ||
121 to_lower == VuoRange_NoMinimum || to_upper == VuoRange_NoMaximum )
122 return value;
123
124 VuoReal from_range = from_upper - from_lower;
125 VuoReal to_range = to_upper - to_lower;
126 VuoReal v = fmax(fmin(value, from_upper), from_lower);
127 VuoReal n = (v - from_lower) / from_range;
128
129 return to_lower + (n * to_range);
130}