std::lerp
提供: cppreference.com
ヘッダ <cmath> で定義 | ||
constexprfloat lerp(float a, float b, float t )noexcept; | (1) | (C++20以上) |
constexprdouble lerp(double a, double b, double t )noexcept; | (2) | (C++20以上) |
constexprlongdouble lerp(longdouble a, longdouble b, longdouble t )noexcept; | (3) | (C++20以上) |
constexpr Promoted lerp( 算術型1 a, 算術型2 b, 算術型3 t )noexcept; | (4) | (C++20以上) |
1-3)a+t*(b−a)、すなわち、引数
t
に対する a
と b
の間の線形補間 (または、 t
が範囲 [0,1]
の外側のときは外挿) を計算します。4) 1-3) でカバーされない算術型の引数の全ての組み合わせに対するオーバーロード集合または関数テンプレート。 いずれかの引数が整数型の場合、それは double にキャストされます。 他のいずれかの引数が longdouble の場合、結果の型は longdouble であり、そうでなければ結果は double です。
[編集]引数
a, b, t | - | 浮動小数点または整数型の値 |
[編集]戻り値
a+t(b−a)。
isfinite(a) && isfinite(b)
のとき、以下の性質が保証されます。
t == 0
の場合、結果はa
と等しい。t == 1
の場合、結果はb
と等しい。t >= 0 && t <= 1
の場合、結果は有限である。isfinite(t) && a == b
の場合、結果はa
と等しい。isfinite(t) || (!isnan(t) && b-a != 0)
の場合、結果はNaN
でない。
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)
の積は非負です (つまり、 lerp
は単調です)。
[編集] 例
Run this code
#include <iostream>#include <cmath> int main(){float a=10.0, b=20.0; std::cout<<"a="<< a <<'\n';std::cout<<"b="<< b <<'\n';std::cout<<"mid point="<< std::lerp(a,b,0.5f)<<'\n';std::cout<<std::boolalpha<<(a == std::lerp(a,b,0.0f))<<'\n';}
出力:
a=10 b=20 mid point=15 true