(define pi (* 4 (atan 1))) (define iota (lambda (n i s) (if (= n 0) (list) (cons i (iota (- n 1) (+ i s) s))))) (define arrow-cursor (make-object cursor% 'arrow)) (define cross-cursor (make-object cursor% 'cross)) (define null-brush (make-object brush% "White" 'transparent)) (define white-brush (make-object brush% "White" 'solid)) (define null-pen (instantiate pen% ("White" 0 'transparent))) (define white-pen (instantiate pen% ("White" 0 'solid))) (define black-pen (instantiate pen% ("Black" 0 'solid))) (define grey-pen (instantiate pen% ("Gray" 0 'solid))) (define (draw-text dc text w h) (send dc clear) (send dc set-pen black-pen) (send dc draw-text text 0 0 #f 0) (send dc set-pen grey-pen) (send dc set-brush null-brush) (send dc draw-rectangle 0 0 w h)) (define (draw-dial dc radius value) (let* ((rho 1.0) (theta (* (/ (* 2 pi) 360.0) (- 427.0 value))) (v (from-polar (make-pt rho theta))) (x_ (pt-x v)) (y_ (pt-y v)) (x (+ (* radius x_) radius)) (y (+ (* radius y_) radius))) (begin (send dc clear) (send dc set-pen black-pen) (send dc draw-line radius radius x y) (send dc set-pen grey-pen) (send dc set-brush null-brush) (send dc draw-ellipse 0 0 (* radius 2) (* radius 2))))) (define (draw-border dc w h) (send dc set-pen grey-pen) (send dc set-brush null-brush) (send dc draw-rectangle 0 0 w h)) (define (draw-point dc x y n brush) (send dc set-pen null-pen) (send dc set-brush brush) (send dc draw-rectangle x y n n)) (define (erase-point dc x y n) (send dc set-pen white-pen) (send dc set-brush white-brush) (send dc draw-rectangle x y n n)) ;; Returns (f n) that returns a . (define (make-indexed-brushes n) (let ((s 0.8) (v 0.75) (d (make-vector n #f))) (for-each (lambda (h i) (let* ((c (hsv->rgb (make-hsv h s v))) (f (lambda (n) (exact (floor (* 256 n))))) (c* (make-object color% (f (rgb-r c)) (f (rgb-g c)) (f (rgb-b c))))) (vector-set! d i (make-object brush% c* 'solid)))) (iota n 0 (/ 1 n)) (iota n 0 1)) (lambda (i) (vector-ref d i)))) (define (nearest-pt pts n p) (let loop ((i 0) (d +inf.0) (j 0)) (if (= i n) j (let ((dd (pt-distance p (vector-ref pts i)))) (loop (+ i 1) (min d dd) (if (< dd d) i j))))))