On 21.05.2017 18:56, Henri Verbeet wrote:
On 21 May 2017 at 18:23, Dmitry Timoshkov dmitry@baikal.ru wrote:
Henri Verbeet hverbeet@codeweavers.com wrote:
+static void d2d_point_lerp(D2D1_POINT_2F *out,
const D2D1_POINT_2F *a, const D2D1_POINT_2F *b, float t)
+{
- out->x = a->x * (1.0f - t) + b->x * t;
- out->y = a->y * (1.0f - t) + b->y * t;
+}
According to my investigation of a better bilinear blending (lerp) implementation the above formula is better to explicitely simplify to
out->x = a->x + (b->x - a->x) * t; out->y = a->y + (b->y - a->y) * t;
For performance, quite possibly. This isn't particularly performance sensitive code though, and I'd be surprised if that variant had better accuracy.
If you go by the simple rule of addition and subtraction are bad, because small values get swallowed,
for t being almost 1.0f a->x * (1.0f - t) + b->x * t; will produce roughly b->x. In a->x + (b->x - a->x) * t what matters more is the result of (b->x - a->x), which might almost zero, leading to a->x to win the result. Remember, for this a->x and b->x must be almost equal.
for t being almost 0, both are dominated by a->x
for b->x being almost 0, and letsĀ“s say t=1 we get in the first case b->x and in the second case 0, since a->x is assumed big enough to dominate b->x - a->x with -a->x.
for a->x being almost 0 and lets say t=0 the both case still give a->x
For me that means the weak points for case one are t being almost 1 and for case 2 b->x >> a->x.
bye Jochen