racket/collects/plot/plot2d/renderer.rkt

57 lines
2.7 KiB
Racket

#lang racket/base
(require racket/list racket/match racket/contract
"../common/contract.rkt" "../common/contract-doc.rkt"
"../common/math.rkt"
"../common/ticks.rkt")
(provide (all-defined-out))
;; ===================================================================================================
;; 2D plot renderers
(struct renderer2d (render-proc ticks-fun bounds-fun x-min x-max y-min y-max) #:transparent
#:guard
(λ (render-proc ticks-fun bounds-fun x-min x-max y-min y-max _)
(when (and x-min x-max (x-min . > . x-max))
(error 'renderer2d "expected x-min <= x-max; got x-min = ~e and x-max = ~e" x-min x-max))
(when (and y-min y-max (y-min . > . y-max))
(error 'renderer2d "expected y-min <= y-max; got y-min = ~e and y-max = ~e" y-min y-max))
(values render-proc ticks-fun bounds-fun x-min x-max y-min y-max)))
(define (null-2d-render-proc area) empty)
(define (null-2d-ticks-fun x-min x-max y-min y-max) (values empty empty))
(define (null-2d-bounds-fun x-min x-max y-min y-max) (values x-min x-max y-min y-max))
(define null-renderer2d
(renderer2d null-2d-render-proc null-2d-ticks-fun null-2d-bounds-fun #f #f #f #f))
;; ===================================================================================================
;; Bounds functions
(define (renderer2d-out-of-bounds? renderer x-min x-max y-min y-max)
(match-define (renderer2d _1 _2 _3 rx-min rx-max ry-min ry-max) renderer)
(or (and rx-max x-min (rx-max . < . x-min)) (and rx-min x-max (rx-min . > . x-max))
(and ry-max y-min (ry-max . < . y-min)) (and ry-min y-max (ry-min . > . y-max))))
;; Applies the renderer's bounds function, if the renderer's bounds intersect the given bounds.
;; This function is monotone regardless of whether the bounds function is monotone.
(define (renderer2d-apply-bounds renderer x-min x-max y-min y-max)
(cond [(renderer2d-out-of-bounds? renderer x-min x-max y-min y-max)
(values x-min x-max y-min y-max)]
[else
(match-define (renderer2d _1 _2 bounds-fun rx-min rx-max ry-min ry-max) renderer)
(define-values (new-x-min new-x-max new-y-min new-y-max)
(bounds-fun (maybe-max rx-min x-min) (maybe-min rx-max x-max)
(maybe-max ry-min y-min) (maybe-min ry-max y-max)))
(values (maybe-min x-min new-x-min) (maybe-max x-max new-x-max)
(maybe-min y-min new-y-min) (maybe-max y-max new-y-max))]))
;; ===================================================================================================
;; Tick functions
(defproc (default-2d-ticks-fun [x-min real?] [x-max real?] [y-min real?] [y-max real?]
) (values (listof tick?) (listof tick?))
(values (default-ticks-fun x-min x-max)
(default-ticks-fun y-min y-max)))