range
Mantiene un número dentro de un mínimo y un máximo dados.
API
range
Devuelve
| Argumento | Descripción | Tipo |
|---|---|---|
number | El número ya ceñido | number |
Parámetros
| Parámetro | Descripción | Tipo | Por defecto |
|---|---|---|---|
num | El número que se ciñe | number | Obligatorio |
min | Valor mínimo | number | 0 |
max | Valor máximo | number | 1 |
Ejemplo
Uso básico
import { range } from 'ranuts';
console.log(range(5, 0, 10)); // 5
console.log(range(15, 0, 10)); // 10 (ceñido al máximo)
console.log(range(-5, 0, 10)); // 0 (ceñido al mínimo)Ceñir un porcentaje
import { range } from 'ranuts';
const progress = 150; // 150%
const clamped = range(progress, 0, 100);
console.log(clamped); // 100Un rango propio
import { range } from 'ranuts';
const value = 25;
const clamped = range(value, 10, 20);
console.log(clamped); // 20 (fuera de rango, así que se ciñe)Ceñir un valor de color
import { range } from 'ranuts';
const red = 300; // un valor RGB debería ir de 0 a 255
const clamped = range(red, 0, 255);
console.log(clamped); // 255Notas
- Cómo ciñe: si el número es menor que el mínimo, devuelve el mínimo; si es mayor que el máximo, devuelve el máximo; en otro caso devuelve el valor tal cual.
- Rango por defecto: de 0 a 1, cómodo para porcentajes y proporciones.
- Cuándo usarlo: es habitual para limitar lo que escribe la persona y para calcular valores de progreso o de color.
Interpolación y cambio de rango
Interpolación y cambio de rango al estilo de los shaders: las mismas piezas que ofrecen mix, clamp y smoothstep de GLSL. Van bien para suavizar animaciones, para llevar una posición de desplazamiento a una opacidad, o para convertir entre rangos numéricos sin relación entre sí.
clamp
Hace lo mismo que el range de arriba, pero con el orden de argumentos de GLSL: clamp(value, min, max) frente a range(num, min, max). Se añadió junto al resto de este grupo por coherencia; elige el orden que se lea mejor donde lo escribas.
import { clamp } from 'ranuts/utils';
clamp(150, 0, 100); // 100
clamp(-10, 0, 100); // 0lerp / inverseLerp
lerp(a, b, t) interpola de a a b según t (t=0 → a, t=1 → b). inverseLerp(a, b, value) es lo contrario: dado un value entre a y b, dice dónde queda, de 0 a 1. Ninguna de las dos ciñe: si value cae fuera de [a, b], t (o el resultado) sale de 0..1.
import { lerp, inverseLerp } from 'ranuts/utils';
lerp(0, 100, 0.25); // 25
inverseLerp(0, 100, 25); // 0.25
inverseLerp(0, 100, 150); // 1.5 — no se ciñeParámetros
| Función | Parámetro | Descripción | Tipo |
|---|---|---|---|
lerp(a, b, t) | a, b | Valor inicial y final | number |
t | Factor de interpolación | number | |
inverseLerp(a, b, value) | a, b | Valor inicial y final | number |
value | El valor que se consulta | number |
remap / fit
remap(value, a1, a2, b1, b2) lleva value de [a1, a2] a [b1, b2] de forma lineal, sin ceñir. fit es la versión que sí ciñe: el mismo cambio de rango y, después, ceñido al rango de salida.
import { remap, fit } from 'ranuts/utils';
remap(5, 0, 10, 0, 100); // 50
remap(15, 0, 10, 0, 100); // 150 — fuera de [0,10], así que también fuera de [0,100]
fit(15, 0, 10, 0, 100); // 100 — ceñido al rango de salidalinearstep / smoothstep
Las dos suben de 0 a 1 a medida que x va de edge0 a edge1, y ciñen fuera de ese tramo. linearstep es una recta; smoothstep es la curva de Hermite suavizada de GLSL (3t² - 2t³), una entrada y salida suaves en vez de una rampa recta, y lo que normalmente se elige para animaciones y para los fundidos de un shader.
import { linearstep, smoothstep } from 'ranuts/utils';
linearstep(0, 1, 0.5); // 0.5
smoothstep(0, 1, 0.5); // 0.5 (el punto medio coincide; la curva difiere en el resto)
smoothstep(0, 1, 0.1); // 0.028 — suavizado, tarda más en despegar de 0 que el 0.1 de linearstepNotes
- No ciñen:
lerp,inverseLerp,remap. Dales unvalueo unatfuera del rango previsto y obtendrás un resultado extrapolado, no un error ni un valor ceñido. - Sí ciñen:
fit,linearstep,smoothstep. Estas tres devuelven siempre un valor dentro de su rango de salida. linearstep(edge0, edge1, x)conedge0 === edge1devuelve0parax < edge0y1en los demás casos, en lugar de dividir entre cero.