;; ;; behave1.al: single beast, static object repulses, food attracts ;; (define *sim-length* 75) (define *render?* #t) (define *bp* (vec3 0 -1 0)) ; beast position (define *bs* .05) ; beast speed (define *fp* (vec3 -.1 1 0)) ; food position (define *o1p* (vec3 -.25 -.35 0)) ; object 1 position (define *o2p* (vec3 .3 .3 0)) ; object 2 position (define *repulse-force* .04) (define *attract-force* .25) (define (update-beast) (let* ( (obj1-force (* *repulse-force* (/ 1 (sqr (distance *bp* *o1p*))) (normalize (- *bp* *o1p*)))) (obj2-force (* *repulse-force* (/ 1 (sqr (distance *bp* *o2p*))) (normalize (- *bp* *o2p*)))) (food-force (* *attract-force* (normalize (- *fp* *bp*)))) (total-force (+ obj1-force obj2-force food-force)) (total-move (* *bs* (normalize total-force))) ) (set! *bp* (+ *bp* total-move)) )) (define (draw-beast) (separator (translate *bp*) (uscale .1) (color 1 0 0) (sphere))) (define (draw-beast) (separator (translate *bp*) (uscale .1) (color 1 0 0) (sphere))) (define (draw-food) (separator (translate *fp*) (uscale .05) (color 0 0 1) (box))) (define (draw-obj pos) (separator (translate pos) (uscale .2) (color 0 1 0) (cylinder))) (define (sim) (begin (for i 1 *sim-length* 1 (begin (world (camera "main" "orthographic" 'from (vec3 0 0 1.25)) (draw-beast) (draw-food) (draw-obj *o1p*) (draw-obj *o2p*) ) (if *render?* (render 'style "vector" 'format '(320 242) 'display-type "sgif" 'display-name (string-append "Frames/f" (number->string i) ".rgb") ) ) (update-beast) )))) (sim)