59 lines
1.9 KiB
Scheme
59 lines
1.9 KiB
Scheme
#lang frtime
|
|
;; Needles
|
|
;; Written by Robb Cutler
|
|
;; July, 2004
|
|
;;
|
|
;; Demonstrates a grid of animated needles that follow the mouse cursor
|
|
;; using the FrTime language.
|
|
|
|
|
|
;; Require the animation library and the library
|
|
;; containing the build-list function.
|
|
(require frtime/animation
|
|
frtime/gui)
|
|
|
|
;; How many needles on one side of the grid of needles
|
|
(define GRID-SIZE (make-slider "Grid size:" 1 12 8))
|
|
|
|
;; The length of a needle in pixels
|
|
(define NEEDLE-LENGTH 10)
|
|
|
|
;; The distance between the centers of two adjacent needles
|
|
(define SPACING 25)
|
|
|
|
;; A useful constant.
|
|
(define PI 3.1415626535)
|
|
|
|
(define (distance x1 y1 x2 y2)
|
|
(sqrt (+ (sqr (- x1 x2)) (sqr (- y1 y2)))))
|
|
|
|
;; create-needle : number -> line
|
|
;; Define one needle. A needle's orientation is such that it
|
|
;; lies on a line between the center of the needle and the
|
|
;; position of mouse cursor. num is the needle's row-major
|
|
;; location on the grid (from 0 to GRID-SIZE^2-1).
|
|
(define (create-needle num)
|
|
(let* ([row (quotient num GRID-SIZE)]
|
|
[col (remainder num GRID-SIZE)]
|
|
[x (+ (* row SPACING) SPACING)]
|
|
[y (+ (* col SPACING) SPACING)]
|
|
[delta-x (- (posn-x mouse-pos) x)]
|
|
[delta-y (- (posn-y mouse-pos) y)]
|
|
[theta1 (atan (/ delta-y (exact->inexact delta-x)))]
|
|
[theta2 (- theta1 PI)]
|
|
[x1-pos (+ x (* NEEDLE-LENGTH (cos theta1)))]
|
|
[y1-pos (+ y (* NEEDLE-LENGTH (sin theta1)))]
|
|
[x2-pos (+ x (* NEEDLE-LENGTH (cos theta2)))]
|
|
[y2-pos (+ y (* NEEDLE-LENGTH (sin theta2)))]
|
|
[color-density (min 1 (/ (distance x1-pos y1-pos (posn-x mouse-pos) (posn-y mouse-pos)) 150.0))]
|
|
)
|
|
(make-line (make-posn x1-pos y1-pos)
|
|
(make-posn x2-pos y2-pos)
|
|
(make-rgb (- 1 color-density) 0 0))))
|
|
|
|
;; Define a list of needles
|
|
(define needles (build-list (sqr GRID-SIZE) create-needle))
|
|
|
|
;; Draw the needles!
|
|
(display-shapes needles)
|