[racket] plot: HOLY MOLEY!

From: Neil Toronto (neil.toronto at gmail.com)
Date: Wed Nov 2 12:14:08 EDT 2011

On 10/31/2011 10:49 PM, John Clements wrote:
> So, I've been plotting the frequency response of chebyshev filters, and I decided to try out the 3d plotting of the new plot:
> (define chebyshev-fun (poles&zeros->fun chebyshev-poles '()))
> (plot3d (surface3d (lambda (x y)
>                       (magnitude (chebyshev-fun
>                                   (+ x (* i y))))))
>          #:x-min -1.0
>          #:x-max 1.0
>          #:y-min -1.0
>          #:y-max 1.0
>          #:z-max 100.0)
> =>
> Which is just absolutely amazing. But then, just on a total whim, I used the mouse to... grab and turn it ?!??   JAW DROPS OPEN HERE.
> That was quite a shock. A good one!
> Color me sold.  I'm just wondering how soon I can show this off to my students.

It'll be in 5.2, which should be released... soon? This month sometime.

If by "show this off to my students" you mean "use it in an HtDP 
language", it's usable as soon as students get higher-order functions 
(Intermediate). Except for using keyword arguments. Apparently, the HtDP 
languages implement them differently. :/

But you don't often need them. For your Chebyshev plot, you could do 
this instead:

(plot3d (surface3d (lambda (x y)
                      (magnitude (chebyshev-fun
                                  (+ x (* i y)))))
                    -1 1 -1 1))

and it should find a good z-max for you. If it's too large, you can put 
the #:z-max argument in the call to 'surface3d'. The 'plot' and 'plot3d' 
functions now know how to fit the plot area to plot elements.

FWIW, your reaction to rotating the plot has pasted a two-hour grin onto 
my face. :D I was hoping for exactly that when I implemented it.

Neil T

Posted on the users mailing list.