From 98e658994417820c93298c229a669eda4f199fe5 Mon Sep 17 00:00:00 2001 From: bdeket Date: Sun, 23 Aug 2020 18:31:15 +0200 Subject: [PATCH 1/6] color field, v1 --- plot-doc/plot/scribblings/params.scrbl | 7 ++ plot-doc/plot/scribblings/renderer2d.scrbl | 15 +++ plot-lib/plot/no-gui.rkt | 4 + plot-lib/plot/private/common/parameters.rkt | 6 + .../plot/private/common/untyped-utils.rkt | 4 + plot-lib/plot/private/plot2d/color-field.rkt | 105 ++++++++++++++++++ 6 files changed, 141 insertions(+) create mode 100644 plot-lib/plot/private/plot2d/color-field.rkt diff --git a/plot-doc/plot/scribblings/params.scrbl b/plot-doc/plot/scribblings/params.scrbl index 9040bb7b..6612652d 100644 --- a/plot-doc/plot/scribblings/params.scrbl +++ b/plot-doc/plot/scribblings/params.scrbl @@ -310,6 +310,13 @@ width should take that into consideration. For example, a width of 86400 may be as there are 86400 seconds in a day. This candle will be exactly one day in width. } +@section{Color fields} + +@deftogether[((defparam color-field-samples n exact-positive-integer? #:value 20) + (defparam error-bar-alpha alpha (real-in 0 1) #:value 1))]{ +The default sample rate and opacity used by @racket[color-field]. +} + @section{Contours and Contour Intervals} @deftogether[( diff --git a/plot-doc/plot/scribblings/renderer2d.scrbl b/plot-doc/plot/scribblings/renderer2d.scrbl index b03d7578..98194bc3 100644 --- a/plot-doc/plot/scribblings/renderer2d.scrbl +++ b/plot-doc/plot/scribblings/renderer2d.scrbl @@ -198,6 +198,21 @@ fourth, and fifth elements in each vector comprise the open, high, low, and clos (vector 6 24 36 10 24)))))] } +@defproc[(color-field + [f (or/c (-> real? real? plot-color/c) + (-> (vector/c real? real?) plot-color/c))] + [x-min (or/c rational? #f) #f] [x-max (or/c rational? #f) #f] + [y-min (or/c rational? #f) #f] [y-max (or/c rational? #f) #f] + [#:samples samples exact-positive-integer? (color-field-samples)] + [#:alpha alpha (real-in 0 1) (color-field-alpha)] + ) renderer2d?]{ +Returns a renderer that draws rectangles filled with a color based on the center point. + +@interaction[#:eval plot-eval + (plot (color-field (λ (x y) (if (< (+ (sqr x) (sqr y)) 1) (random 10) 'black)) + -2 2 -2 2))] +} + @section{2D Line Renderers} @defproc[(function [f (real? . -> . real?)] diff --git a/plot-lib/plot/no-gui.rkt b/plot-lib/plot/no-gui.rkt index 6d929dbe..df4b19d5 100644 --- a/plot-lib/plot/no-gui.rkt +++ b/plot-lib/plot/no-gui.rkt @@ -51,6 +51,10 @@ error-bars candlesticks) +(require "private/plot2d/color-field.rkt") +(provide + color-field) + (require "private/plot2d/line.rkt") (provide lines diff --git a/plot-lib/plot/private/common/parameters.rkt b/plot-lib/plot/private/common/parameters.rkt index c9c38395..51075edd 100644 --- a/plot-lib/plot/private/common/parameters.rkt +++ b/plot-lib/plot/private/common/parameters.rkt @@ -228,6 +228,12 @@ (defparam candlestick-line-style Plot-Pen-Style 'solid) (defparam2 candlestick-alpha Real Nonnegative-Real 2/3 (unit-ivl 'candlestick-alpha)) + +;; color fields + +(defparam color-field-samples Positive-Integer 20) +(defparam2 color-field-alpha Real Nonnegative-Real 1 (unit-ivl 'color-field-alpha)) + ;; Contours (defparam2 contour-samples Integer Positive-Integer 51 (integer>=2 'contour-samples)) diff --git a/plot-lib/plot/private/common/untyped-utils.rkt b/plot-lib/plot/private/common/untyped-utils.rkt index 356b851d..67027f1a 100644 --- a/plot-lib/plot/private/common/untyped-utils.rkt +++ b/plot-lib/plot/private/common/untyped-utils.rkt @@ -10,6 +10,10 @@ [else (λ (x y) (sequence-head-vector name (f (vector x y)) 2))])) +(define (fix-a-field-fun name f) + (cond [(procedure-arity-includes? f 2 #t) f] + [else (λ (x y) (f (vector x y)))])) + (define (fix-vector-field3d-fun name f) (cond [(procedure-arity-includes? f 3 #t) (λ (x y z) (sequence-head-vector name (f x y z) 3))] diff --git a/plot-lib/plot/private/plot2d/color-field.rkt b/plot-lib/plot/private/plot2d/color-field.rkt new file mode 100644 index 00000000..74f422ea --- /dev/null +++ b/plot-lib/plot/private/plot2d/color-field.rkt @@ -0,0 +1,105 @@ +#lang typed/racket/base + +;; Renderers for points and other point-like things. + +(require typed/racket/class racket/match racket/math racket/list + plot/utils + "../common/type-doc.rkt" + "../common/utils.rkt") + +(require/typed + "../common/untyped-utils.rkt" + [fix-a-field-fun (All (A) + (-> Symbol + (U (-> Real Real A) + (-> (Vector Real Real) A)) + (-> Real Real A)))]) + +(provide (all-defined-out)) + +;; =================================================================================================== +;; color-field +;; similar to point.rkt/vector-field, but draws a square area with a color + +(require (only-in "../common/parameters.rkt" color-field-samples color-field-alpha)) + +(: color-field-render-fun + (-> (-> Real Real Plot-Color) + Positive-Integer + Nonnegative-Real + 2D-Render-Proc)) +(define ((color-field-render-fun f samples alpha) area) + (match-define (vector (ivl x-min x-max) (ivl y-min y-max)) (send area get-bounds-rect)) + + (cond + [(and x-min x-max y-min y-max) + (define xs (linear-seq x-min x-max (+ samples 1) #:start? #t #:end? #t)) + (define ys (linear-seq y-min y-max (+ samples 1) #:start? #t #:end? #t)) + + (send area put-alpha alpha) + (send area put-pen 'black 0 'transparent) + (for ([x- (in-list xs)] + [x+ (in-list (cdr xs))]) + (define x (/ (+ x- x+) 2)) + (for ([y- (in-list ys)] + [y+ (in-list (cdr ys))]) + (define y (/ (+ y- y+) 2)) + (define c (f x y)) + (send area put-brush c 'solid) + (send area put-rect (vector (ivl x- x+) + (ivl y- y+))))) + empty] + [else empty])) + +(:: color-field + (->* [(U (-> Real Real Plot-Color) + (-> (Vector Real Real) Plot-Color))] + [(U Real #f) (U Real #f) + (U Real #f) (U Real #f) + #:samples Positive-Integer + #:alpha Nonnegative-Real] + renderer2d)) +(define (color-field f [x-min #f] [x-max #f] [y-min #f] [y-max #f] + #:samples [samples (color-field-samples)] + #:alpha [alpha (color-field-alpha)]) + (define fail/pos (make-raise-argument-error 'vector-field3d f x-min x-max y-min y-max)) + (define fail/kw (make-raise-keyword-error 'vector-field3d)) + (cond + [(and x-min (not (rational? x-min))) (fail/pos "#f or rational" 1)] + [(and x-max (not (rational? x-max))) (fail/pos "#f or rational" 2)] + [(and y-min (not (rational? y-min))) (fail/pos "#f or rational" 3)] + [(and y-max (not (rational? y-max))) (fail/pos "#f or rational" 4)] + [(or (> alpha 1) (not (rational? alpha))) (fail/kw "real in [0,1]" '#:alpha alpha)] + [else + (let ([f ((inst fix-a-field-fun Plot-Color) 'color-field f)]) + (renderer2d (vector (ivl x-min x-max) (ivl y-min y-max)) #f default-ticks-fun + (color-field-render-fun + f samples alpha)))])) + +(module+ test + (require plot) + ;https://rosettacode.org/wiki/Mandelbrot_set#Racket + (define (iterations [a : Number][z : Number][i : Nonnegative-Integer]) : Nonnegative-Integer + (define z′ (+ (* z z) a)) + (if (or (<= 255 i) (< 2 (magnitude z′))) + i + (iterations a z′ (+ i 1)))) + + (define (iter->color [i : Nonnegative-Integer]) : Plot-Color + (if (= i 255) + 'black + (list (* 5 (modulo i 15)) (* 32 (modulo i 7)) (* 8 (modulo i 31))))) + + (define (mandelbrot [x : Real][y : Real]) : Plot-Color + (define z (make-rectangular (* 1.0 x) (* 1.0 y))) + (iter->color (iterations z 0 0))) + + (plot (color-field mandelbrot -2.25 0.75 -1.25 1.25 + #:samples 200))) + +#;(module+ test + (require plot) + (define (in-circle [x : Real][y : Real]) + (define z (make-rectangular x y)) + (if (< (magnitude z) 1) (random 10) 'black)) + (plot (color-field in-circle -2 2 -2 2))) From f3e96bd9ff325394f5cd0baa73fd4f15ae5d5e99 Mon Sep 17 00:00:00 2001 From: bdeket Date: Wed, 26 Aug 2020 08:40:25 +0200 Subject: [PATCH 2/6] color-field: clean up imports --- plot-lib/plot/private/plot2d/color-field.rkt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plot-lib/plot/private/plot2d/color-field.rkt b/plot-lib/plot/private/plot2d/color-field.rkt index 74f422ea..45d2eede 100644 --- a/plot-lib/plot/private/plot2d/color-field.rkt +++ b/plot-lib/plot/private/plot2d/color-field.rkt @@ -2,7 +2,7 @@ ;; Renderers for points and other point-like things. -(require typed/racket/class racket/match racket/math racket/list +(require typed/racket/class racket/match racket/list plot/utils "../common/type-doc.rkt" "../common/utils.rkt") @@ -21,8 +21,6 @@ ;; color-field ;; similar to point.rkt/vector-field, but draws a square area with a color -(require (only-in "../common/parameters.rkt" color-field-samples color-field-alpha)) - (: color-field-render-fun (-> (-> Real Real Plot-Color) Positive-Integer From 1ff4775979f884fa8b2cb33bea5dc8743be63317 Mon Sep 17 00:00:00 2001 From: bdeket Date: Wed, 26 Aug 2020 09:21:38 +0200 Subject: [PATCH 3/6] color-field: provide parameters --- plot-lib/plot/private/utils-and-no-gui.rkt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plot-lib/plot/private/utils-and-no-gui.rkt b/plot-lib/plot/private/utils-and-no-gui.rkt index e467b6be..df39f6aa 100644 --- a/plot-lib/plot/private/utils-and-no-gui.rkt +++ b/plot-lib/plot/private/utils-and-no-gui.rkt @@ -161,6 +161,8 @@ candlestick-line-width candlestick-line-style candlestick-alpha + color-field-samples + color-field-alpha contour-samples contour-levels contour-colors From 6c88c273a21e7b3f29d96b1371e8e7285dddbdb7 Mon Sep 17 00:00:00 2001 From: bdeket Date: Wed, 26 Aug 2020 09:51:15 +0200 Subject: [PATCH 4/6] color-field: move test --- plot-lib/plot/private/plot2d/color-field.rkt | 2 +- plot-test/plot/tests/PRs/66.rkt | 37 ++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 plot-test/plot/tests/PRs/66.rkt diff --git a/plot-lib/plot/private/plot2d/color-field.rkt b/plot-lib/plot/private/plot2d/color-field.rkt index 45d2eede..91804c17 100644 --- a/plot-lib/plot/private/plot2d/color-field.rkt +++ b/plot-lib/plot/private/plot2d/color-field.rkt @@ -74,7 +74,7 @@ (color-field-render-fun f samples alpha)))])) -(module+ test +#;(module+ test (require plot) ;https://rosettacode.org/wiki/Mandelbrot_set#Racket (define (iterations [a : Number][z : Number][i : Nonnegative-Integer]) : Nonnegative-Integer diff --git a/plot-test/plot/tests/PRs/66.rkt b/plot-test/plot/tests/PRs/66.rkt new file mode 100644 index 00000000..2f9cc605 --- /dev/null +++ b/plot-test/plot/tests/PRs/66.rkt @@ -0,0 +1,37 @@ +#lang racket +(require rackunit + plot + racket/draw + racket/runtime-path + "../helpers.rkt") + +;; Tests for: https://github.com/racket/plot/pull/66 : color-field +(define (do-plot-color-field output-fn) + (output-fn + (color-field + (λ (x y) + (define z (make-rectangular x y)) + (if (< (magnitude z) 1) + (cond + [(< (magnitude z) 0.5) 'red] + [(< (angle z) 0) 'blue] + [else 'green]) + 'black)) + -2 2 -2 2))) + +(define-runtime-path pr66-color-field-data "./test-data/pr66-1.dat") + +(define pr66-test-suite + (test-suite + "PR#66: color-field" + (test-case "pr66-color-field" + (check-draw-steps-3d do-plot-color-field pr66-color-field-data)))) + +(module+ test + (require rackunit/text-ui) + (run-tests pr66-test-suite)) + +;; + + + From 6ecbb1289b3527e3fdf443fb81c58daa0deaf0af Mon Sep 17 00:00:00 2001 From: bdeket Date: Wed, 26 Aug 2020 10:23:43 +0200 Subject: [PATCH 5/6] color-field: add test data --- plot-test/plot/tests/PRs/66.rkt | 2 +- plot-test/plot/tests/PRs/test-data/pr66-1.dat | Bin 0 -> 5592 bytes plot-test/plot/tests/PRs/test-data/pr66-1.png | Bin 0 -> 10145 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 plot-test/plot/tests/PRs/test-data/pr66-1.dat create mode 100644 plot-test/plot/tests/PRs/test-data/pr66-1.png diff --git a/plot-test/plot/tests/PRs/66.rkt b/plot-test/plot/tests/PRs/66.rkt index 2f9cc605..bc2f1db3 100644 --- a/plot-test/plot/tests/PRs/66.rkt +++ b/plot-test/plot/tests/PRs/66.rkt @@ -25,7 +25,7 @@ (test-suite "PR#66: color-field" (test-case "pr66-color-field" - (check-draw-steps-3d do-plot-color-field pr66-color-field-data)))) + (check-draw-steps do-plot-color-field pr66-color-field-data)))) (module+ test (require rackunit/text-ui) diff --git a/plot-test/plot/tests/PRs/test-data/pr66-1.dat b/plot-test/plot/tests/PRs/test-data/pr66-1.dat new file mode 100644 index 0000000000000000000000000000000000000000..b3478b189a1aad659f942a60eb4f9dada8b751dd GIT binary patch literal 5592 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 Date: Thu, 27 Aug 2020 10:34:13 +0200 Subject: [PATCH 6/6] color-field: add history notes and remove code comments --- plot-doc/plot/scribblings/params.scrbl | 3 ++- plot-doc/plot/scribblings/renderer2d.scrbl | 1 + plot-lib/plot/private/plot2d/color-field.rkt | 27 -------------------- 3 files changed, 3 insertions(+), 28 deletions(-) diff --git a/plot-doc/plot/scribblings/params.scrbl b/plot-doc/plot/scribblings/params.scrbl index 6612652d..ddd30ca2 100644 --- a/plot-doc/plot/scribblings/params.scrbl +++ b/plot-doc/plot/scribblings/params.scrbl @@ -313,8 +313,9 @@ as there are 86400 seconds in a day. This candle will be exactly one day in widt @section{Color fields} @deftogether[((defparam color-field-samples n exact-positive-integer? #:value 20) - (defparam error-bar-alpha alpha (real-in 0 1) #:value 1))]{ + (defparam color-field-alpha alpha (real-in 0 1) #:value 1))]{ The default sample rate and opacity used by @racket[color-field]. +@history[#:added "7.9"] } @section{Contours and Contour Intervals} diff --git a/plot-doc/plot/scribblings/renderer2d.scrbl b/plot-doc/plot/scribblings/renderer2d.scrbl index 98194bc3..96eb8f4b 100644 --- a/plot-doc/plot/scribblings/renderer2d.scrbl +++ b/plot-doc/plot/scribblings/renderer2d.scrbl @@ -211,6 +211,7 @@ Returns a renderer that draws rectangles filled with a color based on the center @interaction[#:eval plot-eval (plot (color-field (λ (x y) (if (< (+ (sqr x) (sqr y)) 1) (random 10) 'black)) -2 2 -2 2))] +@history[#:added "7.9"] } @section{2D Line Renderers} diff --git a/plot-lib/plot/private/plot2d/color-field.rkt b/plot-lib/plot/private/plot2d/color-field.rkt index 91804c17..d1c64bf7 100644 --- a/plot-lib/plot/private/plot2d/color-field.rkt +++ b/plot-lib/plot/private/plot2d/color-field.rkt @@ -74,30 +74,3 @@ (color-field-render-fun f samples alpha)))])) -#;(module+ test - (require plot) - ;https://rosettacode.org/wiki/Mandelbrot_set#Racket - (define (iterations [a : Number][z : Number][i : Nonnegative-Integer]) : Nonnegative-Integer - (define z′ (+ (* z z) a)) - (if (or (<= 255 i) (< 2 (magnitude z′))) - i - (iterations a z′ (+ i 1)))) - - (define (iter->color [i : Nonnegative-Integer]) : Plot-Color - (if (= i 255) - 'black - (list (* 5 (modulo i 15)) (* 32 (modulo i 7)) (* 8 (modulo i 31))))) - - (define (mandelbrot [x : Real][y : Real]) : Plot-Color - (define z (make-rectangular (* 1.0 x) (* 1.0 y))) - (iter->color (iterations z 0 0))) - - (plot (color-field mandelbrot -2.25 0.75 -1.25 1.25 - #:samples 200))) - -#;(module+ test - (require plot) - (define (in-circle [x : Real][y : Real]) - (define z (make-rectangular x y)) - (if (< (magnitude z) 1) (random 10) 'black)) - (plot (color-field in-circle -2 2 -2 2)))