racket/collects/plot/renderers.rkt
2010-04-27 16:50:15 -06:00

181 lines
7.4 KiB
Racket

(module renderers mzscheme
(require plot/math plot/renderer-helpers mzlib/class plot/plot-extend)
;line : (number -> number) [number] [symbol] [number] -> (2dplotview -> nothing)
(define-plot-type line
func 2dplotview (x-min x-max) ((samples 150) (color 'red)
(width 1)
(mode 'standard)
(mapping 'cartesian)
(t-min -5) (t-max 5))
(let*
((t-min (if (or (eq? mapping 'polar) (eq? mode 'parametric))
t-min x-min))
(t-max (if (or (eq? mapping 'polar)(eq? mode 'parametric))
t-max x-max)) ; maybe let-values?
(points
(case mode
((standard) (map (lambda (x) (vector x (func x)))
(x-values samples x-min x-max)))
((parametric) (map func (x-values samples t-min t-max))))))
(send* 2dplotview
(set-line-color color) (set-line-width width)
(plot-line
(case mapping
((cartesian) points)
((polar) (map
(lambda (point) ; convert to cartesian from theta, r
(vector
(* (vector-y point) (cos (vector-x point)))
(* (vector-y point) (sin (vector-x point)))))
points)))))))
; error-bars : (listof (vector x y err)) [symbol] -> (2dplotview -> nothing)
(define-plot-type error-bars
errs 2dplotview () ((color 'red))
(let* ((y-list (map vector-y errs))
(e-list (map vector-z errs))
(y-mins (map (lambda (y e) (- y e)) y-list e-list ))
(y-maxs (map (lambda (y e) (+ y e)) y-list e-list )))
(send 2dplotview set-line-color color)
(send 2dplotview plot-y-errors (map vector (map vector-x errs)
y-mins y-maxs))))
; field : (vector -> vector) [number] [symbol] [number] [symbol] -> (2dplotview -> nothing)
; plots a vector field
; styles are
; scaled -> vector field with scaled vectors
; normalized -> all vectors same size, indicates direction
; real -> all vectors drawn to scale
(define-plot-type vector-field
vfun 2dplotview
(x-min x-max y-min y-max)
([samples 20] [color 'black] [width 1] [style 'scaled])
(let* ((points (xy-list samples x-min x-max y-min y-max))
(results (map vfun points))
(new-results
(case style
[(real) results]
[(scaled) (scale-vectors results
(sample-size samples x-min x-max)
(sample-size samples y-min y-max))]
[(normalized) (normalize-vectors
results
(sample-size samples x-min x-max)
(sample-size samples y-min y-max))]
[else (error (string-append "Unknown vector field style passed to field-renderer: " (symbol->string style)))])))
(send* 2dplotview
(set-line-color color) (set-line-width width)
(plot-vectors points new-results))))
; contour : (nubmer number -> number) [number] [symbol] [number] [number u listof-number] -> (2dplotview -> void)
; renders a contour plot given function and contour levels
(define-plot-type contour
fun3d 2dplotview
(x-min x-max y-min y-max)
((samples 50) (color 'black) (width 1) (levels 10))
(let* ((x-vals (x-values samples x-min x-max))
(y-vals (x-values samples y-min y-max))
(grid (zgrid fun3d x-vals y-vals samples))
(z-max (apply max (map (lambda (row) (apply max row)) grid)))
(z-min (apply min (map (lambda (row) (apply min row)) grid)))
(c-levels (if (list? levels) levels (x-values levels z-min z-max))))
(send* 2dplotview
(set-line-color color) (set-line-width width)
(plot-contours grid x-vals y-vals c-levels))))
; shade : (number number -> number) [number] [symbol] [number] [number / listof-number] -> (2dplotview -> nothing)
; renders a shade plot given function and shade levels
(define-plot-type shade
fun3d 2dplotview (x-min x-max y-min y-max)
((samples 50) (levels 10))
(let* ((x-vals (x-values samples x-min x-max))
(y-vals (x-values samples y-min y-max))
(grid (zgrid fun3d x-vals y-vals samples))
(z-max (apply max (map (lambda (row) (apply max row)) grid)))
(z-min (apply min (map (lambda (row) (apply min row)) grid)))
(c-levels (x-values levels z-min z-max)))
(send* 2dplotview
(plot-shades grid x-vals y-vals c-levels))))
; points : (listof vector) [symbol] -> (2dplotview -> nothing)
; plots a set of points using a specific character
(define-plot-type points
lop 2dplotview ((sym 'fullsquare) (color 'black))
(send* 2dplotview
(set-line-color color)
(plot-points lop
(cond [(and (integer? sym) (<= -1 sym 127)) sym]
[(and (char? sym)
(char<=? (integer->char 32)
sym
(integer->char 127)))
(char->integer sym)]
[(assq sym point-syms) => cadr]
[else (error "Symbol not found in table!")]))))
; the symbol-> char table
(define point-syms
'((pixel -1)
(dot 1)
(plus 2)
(asterisk 3)
(circle 4)
(times 5)
(square 6)
(triangle 7)
(oplus 8)
(odot 9)
;; (??? 10)
(diamond 11)
(5star 12)
;; (square 13)
;; (??? 14)
(6star 15)
(fullsquare 16)
(bullet 17)
(full5star 18)
;; (square 19)
(circle1 20)
(circle2 21)
(circle3 22)
(circle4 23)
(circle5 24)
(circle6 25)
(circle7 26)
(circle8 27)
(leftarrow 28)
(rightarrow 29)
(uparrow 30)
(downarrow 31)))
;; 3D PLOTTERS
; plot a surface
(define-plot-type surface
fun3d 3dplotview (x-min x-max y-min y-max)
((samples 50) (color 'black) (width '1))
(let* ((x-vals (x-values samples x-min x-max))
(y-vals (x-values samples y-min y-max))
(grid (zgrid fun3d x-vals y-vals samples)))
(send* 3dplotview
(set-line-color color) (set-line-width width)
(plot-surface x-vals y-vals grid))))
(define-plot-type mesh3d
fun3d 3dplotview (x-min x-max y-min y-max z-min z-max)
((samples 50) (width '1) (levels 10) (color #t) (lines #t)
(contours #t) (sides #f))
(let* ((x-vals (x-values samples x-min x-max))
(y-vals (x-values samples y-min y-max))
(grid (zgrid fun3d x-vals y-vals samples))
(c-levels (if (list? levels) levels (x-values levels z-min z-max))))
(send* 3dplotview
(set-line-width width)
(plot-3dmesh x-vals y-vals grid lines color contours sides c-levels))))
(provide (all-defined)))