std::lerp în C++

Interpolare liniară: valoarea aflată la fracțiunea t pe drumul dintre a și b (a + t·(b − a)).

Sintaxă
constexpr double lerp(double a, double b, double t) noexcept;

Ce face std::lerp

std::lerp(a, b, t) returnează a pentru t = 0, b pentru t = 1 și valorile intermediare pentru t între ele. Pentru t în afara intervalului [0, 1] extrapolează.

Este folosit în animații, jocuri, grafică (trecerea treptată de la o culoare la alta) și în calcule de tip „cât la sută din drum”. Implementarea standard garantează rezultate exacte la capete, ceea ce formula scrisă de mână nu garantează mereu.

Parametri

Parametru Descriere
a, b Capetele.
t Fracțiunea (0 = a, 1 = b).

Ce returnează

Valoarea interpolată.

Exemple

Exemplul 1: Valori între 10 și 20

#include <cmath>
#include <print>

int main() {
    for (double t : {0.0, 0.25, 0.5, 1.0, 1.5}) {
        std::println("lerp(10, 20, {}) = {}", t, std::lerp(10.0, 20.0, t));
    }
}

Rezultat

lerp(10, 20, 0) = 10
lerp(10, 20, 0.25) = 12.5
lerp(10, 20, 0.5) = 15
lerp(10, 20, 1) = 20
lerp(10, 20, 1.5) = 25

Exemplul 2: O bară de progres care se mișcă lin

#include <cmath>
#include <print>

int main() {
    double pozitie = 0.0;
    double tinta = 100.0;

    for (int cadru = 1; cadru <= 5; ++cadru) {
        pozitie = std::lerp(pozitie, tinta, 0.5);
        std::println("Cadrul {}: {:.2f}%", cadru, pozitie);
    }
}

Rezultat

Cadrul 1: 50.00%
Cadrul 2: 75.00%
Cadrul 3: 87.50%
Cadrul 4: 93.75%
Cadrul 5: 96.88%

Greșeli frecvente

  • Confunzi std::lerp (C++20, în <cmath>) cu std::midpoint (în <numeric>), care dă doar mijlocul.

Comenzi înrudite

  • std::midpoint: Calculează mijlocul dintre două numere (sau pointeri) fără risc de depășire a limitei tipului.
  • std::clamp: Limitează o valoare la un interval: o aduce la minim dacă e prea mică și la maxim dacă e prea mare.
  • std::fmin: Returnează minimul (fmin) sau maximul (fmax) a două numere cu virgulă, ignorând o valoare NaN.