(define-module interpolation :exports (lerp lerper stepped-lerper point-lerp point-lerper bezier2 bezierer2) (define-typed (lerp a :number b :number t :number) (+ (* t (- b a)) a)) (define-typed (lerper a :number b :number) (define-typed (ret t :number) (lerp a b t)) ret) (define-typed (stepped-lerper a :number b :number #steps :number) (let ((t 0) (dt (/ 1 #steps))) (lambda () (let ((res (lerp a b t))) (mutate! t (+ t dt)) res)))) (define make-point pair) (define point->x first) (define point->y rest) (define (point-lerp p1 p2 t) (make-point (lerp (point->x p1) (point->x p2) t) (lerp (point->y p1) (point->y p2) t))) (define (point-lerper p1 p2) (lambda (t) (point-lerp p1 p2 t))) (define (bezier2 p1 p2 p3 t) (point-lerp (point-lerp p1 p2 t) (point-lerp p2 p3 t) t)) (define (bezierer2 p1 p2 p3) (let ((lerper1 (point-lerper p1 p2)) (lerper2 (point-lerper p2 p3))) (lambda (t) (point-lerp (lerper1 t) (lerper2 t) t)))) )