/
fit.ts
101 lines (95 loc) · 1.91 KB
/
fit.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import {
add,
defn,
div,
FLOAT0,
FLOAT05,
FLOAT1,
FLOAT2,
mix,
mul,
neq,
PrimTerm,
ret,
sub,
Term,
TermType,
ternary,
} from "@thi.ng/shader-ast";
import { clamp01 } from "./clamp";
/**
* Returns normalized value of `x` WRT to interval [a,b]. Returns 0, if
* `a` equals `b`.
*
* @param x -
* @param a -
* @param b -
*/
export const fitNorm1 = defn(
"float",
"fitNorm1",
["float", "float", "float"],
(x, a, b) => [ret(ternary(neq(a, b), div(sub(x, a), sub(b, a)), FLOAT0))]
);
/**
* Fits value `x` from closed interval [a,b] to closed interval [c,d]. No
* clamping performed.
*
* @param x
* @param a
* @param b
* @param c
* @param d
*/
export const fit = <T extends PrimTerm>(
x: T,
a: T,
b: T,
c: T,
d: T
): Term<TermType<T>> => mix(c, d, div(sub(x, a), sub(b, a)));
/**
* Same as {@link fit}, but first clamps `x` to closed [a,b] interval.
*
* @param x
* @param a
* @param b
* @param c
* @param d
*/
export const fitClamped = <T extends PrimTerm>(
x: T,
a: T,
b: T,
c: T,
d: T
): Term<TermType<T>> => mix(c, d, clamp01(div(sub(x, a), sub(b, a))));
/**
* Inline function. Fits value `a` in [0..1] interval to new interval
* [b..c]. No clamping performed. Same as `mix(b, c, a)`
*
* @param a -
* @param b -
* @param c -
*/
export const fit01 = <T extends PrimTerm>(
a: T,
b: T,
c: T
): Term<TermType<T>> => mix(b, c, a);
/**
* Inline function. Fits value `x` in [-1..+1] interval to [0..1]
* interval. No clamping performed.
*
* @param x -
*/
export const fit1101 = <T extends PrimTerm>(x: T): Term<TermType<T>> =>
add(mul(x, FLOAT05), FLOAT05);
/**
* Inline function. Fits value `x` in [0..1] interval to [-1..+1]
* interval. No clamping performed.
*
* @param x -
*/
export const fit0111 = <T extends PrimTerm>(x: T): Term<TermType<T>> =>
sub(mul(x, FLOAT2), FLOAT1);