Skip to content

Instantly share code, notes, and snippets.

@sromano
Last active November 29, 2017 01:00
Show Gist options
  • Save sromano/0576e989eba7cfde234bbb7679f35989 to your computer and use it in GitHub Desktop.
Save sromano/0576e989eba7cfde234bbb7679f35989 to your computer and use it in GitHub Desktop.
;;Constants
(define g 9.8)
;;Object Samplers
(define (sample-position) (uniform 1 1000))
(define (sample-velocity) (uniform 1 10))
(define (sample-object)
(list (sample-velocity)
(sample-velocity)
(sample-velocity)
(sample-position)
(sample-position)
(sample-position)
))
(define (sample-world)
(let ((n (ceil (exponential 0.5))))
(repeat n sample-object)))
;;Getters
(define (vx object) (first object))
(define (vy object) (second object))
(define (vz object) (third object))
(define (x object) (fourth object))
(define (y object) (fifth object))
(define (z object) (sixth object))
;;Setters
(define (update-vx object value) (update-list object 0 value))
(define (update-vy object value) (update-list object 1 value))
(define (update-vz object value) (update-list object 2 value))
(define (update-x object value) (update-list object 3 value))
;;Note: Floor was added (just a note related to how we think)
(define (update-y object value) (let ((yval (if (leq value 0) 0 value))) (update-list object 4 yval)))
(define (update-z object value) (update-list object 5 value))
;;Advance World
(define (step world) (map object-step world))
(define (stepN world n) (if (eq? n 0) world (stepN (step world) (- n 1))))
;;Advance Object
(define (object-step object)
(update-y
(update-vy object (+ g (vy object)))
(- (y object) (vy object))))
;;Running example
(define length-of-run 20)
(define running-steps (iota length-of-run 1))
(define world (sample-world))
(define motion (map (lambda (n) (stepN world n)) running-steps))
(define (n-object-motion n) (map (lambda (stp) (list-elt stp n)) motion))
(define (n-object-y n) (map y (n-object-motion n)))
;;Draw
(map (lambda (n) (lineplot
(map (lambda (s) (pair s (list-elt (n-object-y n) s))) running-steps)
(string-append "Y position over time for object #" (number->string n)))) (iota (length world) 1))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment