(use random-bsd) (use srfi-1) (define (mk-grid n m ) (let loop ((j 0) (ls '())) (if (= j m) ls (loop (+ j 1) (append ls (list (let loopi ((i 0) (lsi '())) (if (= i n) lsi (loopi (+ i 1) (cons (list (- (random-real) 0.5) (- (random-real) 0.5)) lsi )))))) )))) (define (dot2 v w) (+ (* (car v) (car w)) (* (cadr v) (cadr w)))) (define old-floor floor) (define old-ceiling ceiling) (define (floor x) (inexact->exact (old-floor x))) (define (ceiling x) (inexact->exact (old-ceiling x))) (define (ingrid x y grid) (define (ease d) (- (* 3 (* d d)) (* 2 (* d d)))) (let* ((x0 (- (floor x) x)) (x1 (- x (ceiling x))) (y0 (- (floor y) y)) (y1 (- y (ceiling y)))) (let* ( (d0 (dot2 (list x0 y0) (list-ref (list-ref grid (floor x)) (floor y)))) (d1 (dot2 (list x0 y1) (list-ref (list-ref grid (floor x)) (ceiling y)))) (d2 (dot2 (list x1 y0) (list-ref (list-ref grid (ceiling x)) (floor y)))) (d3 (dot2 (list x1 y1) (list-ref (list-ref grid (ceiling x)) (ceiling y))))) (+ (/ (+ d0 (ease (- d0 d1))) 2.0) (/ (+ d2 (ease (- d2 d3))) 2.0))))) (define gr (mk-grid 4 4)) (print (map (lambda (x) (let ((rx (+ 2.0 (/ x 50.0)))) (ingrid rx rx gr))) (iota 50)))