1#lang racket/base
2
3;; Functions that create renderers for backward-compatible functions 'line', 'contour', etc.
4
5(require racket/match plot/utils
6         "../plot2d/line.rkt"
7         "../plot2d/contour.rkt"
8         "../plot3d/surface.rkt")
9
10(provide line-renderer
11         contour-renderer
12         shade-renderer
13         surface-renderer)
14
15(define (line-renderer f samples width color mode mapping t-min t-max)
16  (case mode
17    [(standard)
18     (case mapping
19       [(cartesian)  (function f #:samples samples #:width width #:color color)]
20       [(polar)      (polar f t-min t-max
21                            #:samples samples #:width width #:color color)])]
22    [(parametric)
23     (case mapping
24       [(cartesian)  (parametric f t-min t-max
25                                 #:samples samples #:width width #:color color)]
26       [(polar)      (parametric (λ (t)
27                                   (match-define (vector θ r) (f t))
28                                   (vector (* r (cos θ)) (* r (sin θ))))
29                                 t-min t-max
30                                 #:samples samples #:width width #:color color)])]))
31
32(define (contour-renderer f samples width color levels)
33  (contours f #:samples samples #:levels (if (exact-integer? levels) (sub1 levels) levels)
34            #:colors (list color) #:widths (list width) #:styles '(solid)))
35
36(define (shade-fill-colors zs)
37  (color-seq* '((0 0 255) (255 255 255) (255 0 0)) (sub1 (length zs))))
38
39(define (shade-renderer f samples levels)
40  (contour-intervals f #:samples samples #:levels (if (exact-integer? levels) (sub1 levels) levels)
41                     #:colors shade-fill-colors #:contour-styles '(transparent)))
42
43(define (surface-renderer f samples width color)
44  (surface3d f #:samples samples #:line-color color #:line-width width))
45