Don't create a new closest object on every update
Implement path snapping

interact(element).snap({
    mode: 'path',
    paths: [
        function (x, y) {
            return {
                y: 300 + Math.sin(x * 0.04),
                range: 300
            };
        }
    ]
})