Support NaN values

This commit is contained in:
Dimitri Lozeve 2021-04-30 23:08:44 +02:00
parent 4ff1f01e5c
commit 5c8e3c9234

View file

@ -12,12 +12,18 @@
(def +default-colors+ '(green blue red yellow cyan magenta white)) (def +default-colors+ '(green blue red yellow cyan magenta white))
(def (nanmin . rest)
(apply min (filter finite? rest)))
(def (nanmax . rest)
(apply max (filter finite? rest)))
(def (scale-fn lo hi) (def (scale-fn lo hi)
(lambda (x) (/ (- x lo) (- hi lo)))) (lambda (x) (/ (- x lo) (- hi lo))))
(def (draw-canvas xs ys x-scale-fn y-scale-fn width: (width 160) height: (height 80)) (def (draw-canvas xs ys x-scale-fn y-scale-fn width: (width 160) height: (height 80))
(def canvas (make-braille-canvas (1+ height) (1+ width))) (def canvas (make-braille-canvas (1+ height) (1+ width)))
(for ((x xs) (y ys)) (for ((x xs) (y ys) when (and (finite? x) (finite? y)))
(braille-canvas-set! canvas (braille-canvas-set! canvas
(inexact->exact (floor (* height (y-scale-fn y)))) (inexact->exact (floor (* height (y-scale-fn y))))
(inexact->exact (floor (* width (x-scale-fn x)))) (inexact->exact (floor (* width (x-scale-fn x))))
@ -65,27 +71,27 @@
(match lsts (match lsts
([ys] (let ((xmin 0) ([ys] (let ((xmin 0)
(xmax (length ys)) (xmax (length ys))
(ymin (apply min ys)) (ymin (apply nanmin ys))
(ymax (apply max ys))) (ymax (apply nanmax ys)))
(values xmin xmax ymin ymax (values xmin xmax ymin ymax
[(draw-canvas (iota (length ys)) ys [(draw-canvas (iota (length ys)) ys
(scale-fn xmin xmax) (scale-fn xmin xmax)
(scale-fn ymin ymax) (scale-fn ymin ymax)
width: width height: height)]))) width: width height: height)])))
([xs ys] (let ((xmin (apply min xs)) ([xs ys] (let ((xmin (apply nanmin xs))
(xmax (apply max xs)) (xmax (apply nanmax xs))
(ymin (apply min ys)) (ymin (apply nanmin ys))
(ymax (apply max ys))) (ymax (apply nanmax ys)))
(values xmin xmax ymin ymax (values xmin xmax ymin ymax
[(draw-canvas xs ys [(draw-canvas xs ys
(scale-fn xmin xmax) (scale-fn xmin xmax)
(scale-fn ymin ymax) (scale-fn ymin ymax)
width: width height: height)]))) width: width height: height)])))
([xs . yss] (let* ((xmin (apply min xs)) ([xs . yss] (let* ((xmin (apply nanmin xs))
(xmax (apply max xs)) (xmax (apply nanmax xs))
(all-ys (flatten yss)) (all-ys (flatten yss))
(ymin (apply min all-ys)) (ymin (apply nanmin all-ys))
(ymax (apply max all-ys)) (ymax (apply nanmax all-ys))
(x-scale-fn (scale-fn xmin xmax)) (x-scale-fn (scale-fn xmin xmax))
(y-scale-fn (scale-fn ymin ymax))) (y-scale-fn (scale-fn ymin ymax)))
(values xmin xmax ymin ymax (values xmin xmax ymin ymax