Adjusted appx. plot bound fixpoint computation; fixes a layout issue with multiple function renderers

Merge into 5.2
This commit is contained in:
Neil Toronto 2011-10-15 01:26:02 -06:00
parent 5139de9cec
commit f182a2719f
3 changed files with 18 additions and 24 deletions

View File

@ -17,9 +17,9 @@
;; Attempts to comptute a fixpoint of, roughly, the bounds functions for the given renderers.
;; More precisely, starting with the given plot bounds, it attempts to compute a fixpoint of
;; apply-bounds*, overridden at every iteration by the plot bounds (if given).
;; Because a fixpoint doesn't always exist, or only exists in the limit, it stops after max-iters.
;; Because a fixpoint doesn't always exist, or may only exist in the limit, it stops after max-iters.
(define (renderer2d-bounds-fixpoint renderers plot-x-min plot-x-max plot-y-min plot-y-max
[max-iters 4])
[max-iters 2])
(let/ec break
;; Shortcut eval: if the plot bounds are all specified, the code below just returns them
(when (and plot-x-min plot-x-max plot-y-min plot-y-max)
@ -61,18 +61,14 @@
(cond [(and x-min x-max) (match-define (list xs ys) (f x-min x-max samples))
(define rys (filter regular? ys))
(cond [(empty? rys) (values x-min x-max y-min y-max)]
[else (values x-min x-max
(if y-min y-min (apply min* rys))
(if y-max y-max (apply max* rys)))])]
[else (values x-min x-max (apply min* rys) (apply max* rys))])]
[else (values x-min x-max y-min y-max)]))
(define ((inverse-bounds-fun f samples) x-min x-max y-min y-max)
(cond [(and y-min y-max) (match-define (list ys xs) (f y-min y-max samples))
(define rxs (filter regular? xs))
(cond [(empty? rxs) (values x-min x-max y-min y-max)]
[else (values (if x-min x-min (apply min* rxs))
(if x-max x-max (apply max* rxs))
y-min y-max)])]
[else (values (apply min* rxs) (apply max* rxs) y-min y-max)])]
[else (values x-min x-max y-min y-max)]))
(define ((function-interval-bounds-fun f1 f2 samples) x-min x-max y-min y-max)
@ -81,9 +77,7 @@
(match-define (list x2s y2s) (f2 x-min x-max samples))
(define rys (filter regular? (append y1s y2s)))
(cond [(empty? rys) (values x-min x-max y-min y-max)]
[else (values x-min x-max
(if y-min y-min (apply min* rys))
(if y-max y-max (apply max* rys)))])]
[else (values x-min x-max (apply min* rys) (apply max* rys))])]
[else (values x-min x-max y-min y-max)]))
(define ((inverse-interval-bounds-fun f1 f2 samples) x-min x-max y-min y-max)
@ -92,7 +86,5 @@
(match-define (list y2s x2s) (f2 y-min y-max samples))
(define rxs (filter regular? (append x1s x2s)))
(cond [(empty? rxs) (values x-min x-max y-min y-max)]
[else (values (if x-min x-min (apply min* rxs))
(if x-max x-max (apply max* rxs))
y-min y-max)])]
[else (values (apply min* rxs) (apply max* rxs) y-min y-max)])]
[else (values x-min x-max y-min y-max)]))

View File

@ -15,9 +15,9 @@
;; Attempts to comptute a fixpoint of, roughly, the bounds functions for the given renderers.
;; More precisely, starting with the given plot bounds, it attempts to compute a fixpoint of
;; apply-bounds*, overridden at every iteration by the plot bounds (if given).
;; Because a fixpoint doesn't always exist, or only exists in the limit, it stops after max-iters.
;; Because a fixpoint doesn't always exist, or may only exist in the limit, it stops after max-iters.
(define (renderer3d-bounds-fixpoint renderers plot-x-min plot-x-max plot-y-min plot-y-max
plot-z-min plot-z-max [max-iters 4])
plot-z-min plot-z-max [max-iters 2])
(let/ec break
;; Shortcut eval: if the plot bounds are all specified, the code below just returns them
(when (and plot-x-min plot-x-max plot-y-min plot-y-max plot-z-min plot-z-max)
@ -65,7 +65,5 @@
(match-define (list xs ys zss) (f x-min x-max samples y-min y-max samples))
(define zs (filter regular? (2d-sample->list zss)))
(cond [(empty? zs) (values x-min x-max y-min y-max z-min z-max)]
[else (values x-min x-max y-min y-max
(if z-min z-min (apply min* zs))
(if z-max z-max (apply max* zs)))])]
[else (values x-min x-max y-min y-max (apply min* zs) (apply max* zs))])]
[else (values x-min x-max y-min y-max z-min z-max)]))

View File

@ -1,7 +1,6 @@
#lang racket
(require "../main.rkt"
"../utils.rkt")
(require rackunit plot plot/utils)
;(plot-new-window? #t)
@ -137,9 +136,10 @@
#:color "blue")
(axes 1 0 #:y-ticks? #f)))
#;; error: could not determine x bounds
(plot (list (function sqr #f -1)
(function sqr 1 #f)))
;; error: could not determine x bounds
(check-exn exn:fail?
(λ () (plot (list (function sqr #f -1)
(function sqr 1 #f)))))
; draws first function with x in [-2,-1]
(plot (list (function sqr #f -1)
@ -156,6 +156,10 @@
(function sqr 1 #f))
#:x-min -2 #:x-max 2)
; draws both in full (particularly, without chopping off the top of the parabola), in [-2,2]
(plot (list (function sqr)
(function sin -2 2)))
(time
(plot (list (discrete-histogram
(build-list 10 (λ (n) (vector (string-ref "abcdefghij" n)