Back to glossary

Linear Interpolation (Vyper Code Example)

Table of Contents

Example of linear interpolation (lerp) in Vyper.

Values change linearly from y0 to y1 over the time span of t0 to t1.

#pragma version 0.4.0

y0: public(uint256)
y1: public(uint256)
t0: public(uint256)
t1: public(uint256)

@deploy
def __init__():
    self.y0 = 10
    self.y1 = 20
    self.t0 = block.timestamp + 30
    self.t1 = block.timestamp + 60


@external
def lerp() -> uint256:
    return self._lerp(self.y0, self.y1, self.t0, self.t1, block.timestamp)

@internal
def _lerp(y0: uint256, y1: uint256, x0: uint256, x1: uint256, x: uint256) -> uint256:
    assert x0 < x1

    if x <= x0:
        return y0

    if x >= x1:
        return y1

    # w(x) = (x - x0) / (x1 - x0)
    # f(x) = y0*(1 - w(x)) + y1*w(x)
    #      = (y0*((x1 - x0) - (x - x0)) + y1*(x - x0)) / (x1 - x0)
    x1_x: uint256 = x1 - x
    x_x0: uint256 = x - x0
    x1_x0: uint256 = x1 - x0

    return (y0*x1_x + y1*x_x0) // x1_x0

Related Terms

No items found.