;; ;; particles.al: create all particles at start ;; (define *particles* '()) (define *num-particles* 10) (define (randR low high) (+ low (* (rand) (- high low)))) (define (make-one-particle) (list (list 'pp (vec3 0 0 0)) (list 'pv (vec3 0 0 0)) (list 'pa (vec3 0 0 0)) )) (define (add-particle p) (set! *particles* (cons p *particles*))) (define (get-value p key) (list-ref (assq key p) 1)) (define (set-value p key val) (set-cdr! (assq key p) (list val))) (define (update-particle p) (let ((pos (get-value p 'pp)) (vel (get-value p 'pv)) (acc (get-value p 'pa))) (set-value p 'pp (+ pos vel)) (set-value p 'pv (+ vel acc)) )) (define (update-particles) (map update-particle *particles*)) (define (draw-particle p) (separator (translate (get-value p 'pp)) (uscale .1) (sphere))) (define (draw-particles) (map draw-particle *particles*)) (define (create-particle) (let ( (p (make-one-particle)) ) (set-value p 'pp (vec3 0 0 0)) (set-value p 'pv (vec3 (randR -.03 .03) (randR .08 .12) 0)) (set-value p 'pa (vec3 0 -.005 0)) (add-particle p) )) (define (create-particles) (for i 1 *num-particles* 1 (create-particle))) (define (sim) (begin (create-particles) (for i 1 60 1 (begin (world (draw-particles) ) (update-particles) )))) (sim)