- cmath[meta header]
- std[meta namespace]
- function[meta id-type]
- cpp20[meta cpp]
namespace std {
constexpr float lerp(float a, float b, float t) noexcept;
constexpr double lerp(double a, double b, double t) noexcept;
constexpr long double lerp(long double a, long double b, long double t) noexcept;
}
二点a
とb
の間を、時間t
で線形補間 (linear interpolate) する。
時間は 0.0 (0%) から 1.0 (100%) までの値を基本的には指定するが、1.0を超える指定も許可されている。
この関数を使用することによって、現在位置を少しずつ進めていくプログラミングスタイルから、現在位置と目標位置を最初に決めて現在の時間に対応する位置を求めるというプログラミングスタイルに考え方を変更できる。
return a + t * (b - a);
投げない
isfinite
(a) &&
isfinite
(b)
である場合、戻り値r
は以下のようになる:- 比較関数
CMP(x, y)
を、x > y
であれば1、x < y
であれば-1、そうでなければ0を返すものであるとして、あらゆる時間値t1
とt2
についてCMP(lerp(a,b,t2), lerp(a,b,t1))
、CMP(t2, t1)
、CMP(b,a)
はいずれも非負となる
#include <iostream>
#include <cmath>
int main()
{
// 開始点0.0から、目標点10.0まで、10% (時間0.1) ずつ値を進める
float start = 0.0f;
float target = 10.0f;
float t = 0.0f;
for (int i = 0; i <= 10; ++i) {
float r = std::lerp(start, target, t);
std::cout << r << std::endl;
t += 0.1f;
}
}
- std::lerp[color ff0000]
0
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <cmath>
// 2次元上の点を表す型
struct Point {
float x, y;
};
// Point型用に線形補間の機能を定義する
Point lerp(const Point& a, const Point& b, float t)
{
return Point{
std::lerp(a.x, b.x, t),
std::lerp(a.y, b.y, t)
};
}
int main()
{
const Point a{1.0f, 2.0f};
const Point b{5.0f, 3.0f};
// 点aから点bに向かって、10%ずつ位置を進める
float t = 0.1f;
for (int i = 0; i <= 10; ++i) {
const Point p = lerp(a, b, t);
std::cout << t << " : (" << p.x << ", " << p.y << ')' << std::endl;
t += 0.1f;
}
}
- std::lerp[color ff0000]
0.1 : (1.4, 2.1)
0.2 : (1.8, 2.2)
0.3 : (2.2, 2.3)
0.4 : (2.6, 2.4)
0.5 : (3, 2.5)
0.6 : (3.4, 2.6)
0.7 : (3.8, 2.7)
0.8 : (4.2, 2.8)
0.9 : (4.6, 2.9)
1 : (5, 3)
1.1 : (5.4, 3.1)
- C++20
- Clang:
- GCC: 9.1
- Visual C++: ??