Skip to content

Instantly share code, notes, and snippets.

@llacroix
Created October 5, 2013 18:11
Show Gist options
  • Save llacroix/6844267 to your computer and use it in GitHub Desktop.
Save llacroix/6844267 to your computer and use it in GitHub Desktop.
Scheme bezier of n order
(require-extension srfi-4 glm)
(require-extension list-utils)
(require-extension statistics)
(define (mapi p l)
(let loop ((l l) (i 0) (r '()))
(if (pair? l)
(loop (cdr l) (+ i 1) (cons (p (car l) i) r))
(reverse r))))
(define (bezier points)
(lambda (t)
(let ((n (length points)))
(define (calc point i)
(v* point (* (combinations n i) (expt (- 1 t) (- n i)) (expt t i))))
(fold (lambda (left right)
(v+ left right)) (vec3 0 0 0) (mapi calc points)))))
(define bez (bezier `(,(vec3 1 1 1)
,(vec3 2 2 2)
,(vec3 2 2 2)
,(vec3 2 2 2)
,(vec3 2 2 2)
,(vec3 2 2 2)
,(vec3 2 2 2)
,(vec3 2 2 2)
,(vec3 3 3 3))))
(time
(begin
(print (bez 0))
(print (bez 0.25))
(print (bez 0.5))
(print (bez 0.75))
(print (bez 1.0))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment