Skip to content

Instantly share code, notes, and snippets.

@AnthonyPanchenko
Forked from Anthodpnt/lerp.js
Created October 27, 2017 15:48
Show Gist options
  • Select an option

  • Save AnthonyPanchenko/8d28afbdb9472c6adc32cc4265540540 to your computer and use it in GitHub Desktop.

Select an option

Save AnthonyPanchenko/8d28afbdb9472c6adc32cc4265540540 to your computer and use it in GitHub Desktop.

Revisions

  1. @Anthodpnt Anthodpnt created this gist Dec 16, 2016.
    88 changes: 88 additions & 0 deletions lerp.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,88 @@
    /**
    * This gist is for Javascript beginners.
    * @author: Anthony Du Pont <antho.dpnt@gmail.com>
    * @site: https://www.twitter.com/JsGists
    *
    * Linear Interpolation is a method to add some natural behaviors to your animations. The more natural
    * your animations look like, the better will be the look-and-feel. But what's Linear Interpolation ?
    *
    * Linear Interpolation, also called `lerp`, is a way of easing your animation. Imagine you want to
    * move a box from a position A to a position B. Without the Linear Interpolation, you box will
    * instantly switch from the position A to the position B. But if you add the Linear Interpolation
    * your box will smoothly go from the position A to the position B.
    *
    * This is a way of creating inertia in your animations.
    *
    * Example:
    * I have a point following the mouse and I want it to smoothly move from the last position of my
    * mouse to the new position by using Linear Interpolation.
    *
    * Note:
    * I am using a Canvas but you don't have to use canvas if you want to create a Linear Interpolation
    * in Javascript. Read the documentation about the basics of Canvas if something isn't clear to you.
    **/

    // First we create our canvas and get its context.
    const canvas = document.createElement('canvas');
    const context = canvas.getContext('2d');

    // We set its dimensions
    const width = canvas.width = window.innerWidth;
    const height = canvas.height = window.innerHeight;

    // Then we append it to our DOM
    document.body.appendChild(canvas);

    // We need to create some variables we will use later. 2 variables to store the mouse position
    // and 2 other variables to store the circle position.
    let sx = 0;
    let sy = 0;

    let dx = 0;
    let dy = 0;

    // Then we add a mousemove event to our body.
    document.body.addEventListener('mousemove', mousemove);

    function mousemove(e) {
    // We only update the mouse position everytime the mouse moves.
    sx = e.offsetX;
    sy = e.offsetY;
    }

    // We start a `requestAnimationFrame` loop to render our moving circle.
    // Get more informations about `requestAnimationFrame` in episode #6 of
    // "Gist for Javascript Beginners".
    window.requestAnimationFrame(render);

    function render() {
    // Now we have our mouse position we can create a Linear Interpolation between the current
    // position of our circle and the mouse position. This will smoothly move our circle from
    // its position to the mouse position. Check the method below for more explanations about
    // the 3 parameters and play with them to see the difference.
    dx = lerp(dx, sx, 0.1);
    dy = lerp(dy, sy, 0.1);

    // Then we draw our circle to its new position.
    context.clearRect(0, 0, width, height);
    context.beginPath();
    context.arc(dx, dy, 10, 0, Math.PI * 2, false);
    context.fill();
    context.closePath();

    // And we loop again.
    window.requestAnimationFrame(render);
    }

    // This is our Linear Interpolation method. It takes 3 parameters:
    // a: The starting value
    // b: The destination value
    // n: The normal value (between 0 and 1) to control the Linear Interpolation
    //
    // If your normal value is equal to 1 the circle will instantly switch from A to B.
    // If your normal value is equal to 0 the circle will not move.
    // The closer your normal is to 0 the smoother will be the interpolation.
    // The closer your normal is to 1 the sharper will be the interpolation.
    function lerp(a, b, n) {
    return (1 - n) * a + n * b;
    }