Vuo 2.4.4
Loading...
Searching...
No Matches
VuoRange.h
Go to the documentation of this file.
1
10#ifndef VuoRange_h
11#define VuoRange_h
12
13#ifdef __cplusplus
14extern "C" {
15#endif
16
17#include "VuoReal.h"
18#include <float.h>
19
21#define VuoRange_NoMinimum -INFINITY
22
24#define VuoRange_NoMaximum INFINITY
25
29typedef struct
30{
31 // The minimum value of a range. (VuoRange_NoMinimum >= minimum >= maximum)
32 VuoReal minimum;
33
34 // The maximum value of a range. (minimum >= maximum >= VuoRange_NoMaximum)
35 VuoReal maximum;
36} VuoRange;
37
38#define VuoRange_SUPPORTS_COMPARISON
39
40VuoRange VuoRange_makeFromJson(struct json_object * js);
41struct json_object * VuoRange_getJson(const VuoRange value);
42char * VuoRange_getSummary(const VuoRange value);
43
44bool VuoRange_areEqual(const VuoRange a, const VuoRange b);
45bool VuoRange_isLessThan(const VuoRange a, const VuoRange b);
46
48
51char * VuoRange_getString(const VuoRange value);
55
59static inline VuoRange VuoRange_make(VuoReal _minimum, VuoReal _maximum) __attribute__((const));
60static inline VuoRange VuoRange_make(VuoReal _minimum, VuoReal _maximum)
61{
62 return (VuoRange){_minimum, _maximum};
63}
64
68static inline bool VuoRange_isInverted(VuoRange range) __attribute__((const));
69static inline bool VuoRange_isInverted(VuoRange range)
70{
71 return range.minimum > range.maximum;
72}
73
77static inline VuoRange VuoRange_getOrderedRange(VuoRange range) __attribute__((const));
79{
80 if (VuoRange_isInverted(range))
81 return (VuoRange){range.maximum, range.minimum};
82 else
83 return range;
84}
85
89static inline VuoRange VuoRange_makeNonzero(VuoRange a) __attribute__((const));
91{
92 if (fabs(a.maximum - a.minimum) < FLT_EPSILON)
93 a.maximum = a.minimum + FLT_EPSILON;
94 return a;
95}
96
102static inline VuoReal VuoRange_clamp(VuoRange range, VuoReal value) __attribute__((const));
103static inline VuoReal VuoRange_clamp(VuoRange range, VuoReal value)
104{
105 VuoReal lower = fmin(range.minimum, range.maximum);
106 VuoReal upper = fmax(range.minimum, range.maximum);
107 return fmin(fmax(value, lower), upper);
108}
109
117static inline VuoReal VuoRange_scale(VuoRange from, VuoRange to, VuoReal value) __attribute__((const));
118static inline VuoReal VuoRange_scale(VuoRange from, VuoRange to, VuoReal value)
119{
120 VuoReal from_lower = fmin(from.minimum, from.maximum);
121 VuoReal from_upper = fmax(from.minimum, from.maximum);
122 VuoReal to_lower = fmin(to.minimum, to.maximum);
123 VuoReal to_upper = fmax(to.minimum, to.maximum);
124
125 if( from_lower == VuoRange_NoMinimum || from_upper == VuoRange_NoMaximum ||
126 to_lower == VuoRange_NoMinimum || to_upper == VuoRange_NoMaximum )
127 return value;
128
129 VuoReal from_range = from_upper - from_lower;
130 VuoReal to_range = to_upper - to_lower;
131 VuoReal v = fmax(fmin(value, from_upper), from_lower);
132 VuoReal n = (v - from_lower) / from_range;
133
134 return to_lower + (n * to_range);
135}
136
137#ifdef __cplusplus
138}
139#endif
140
141#endif