[racket] Controlling the size of plot symbols
Is there something for plotting 3D parametric surfaces? (where there are two parameters instead of one)
If there is, then I would do something like this:
(define (sphere3d ctr-x ctr-y ctr-z r #:color color)
(parametric-surface3D (lambda (theta phi) ; theta and phi are the parameters
(let* ([z (* r (sin phi))]
[√x^2+y^2 (sqrt (- (sqr r) (sqr z)))]
[x (* √x^2+y^2 (cos theta))]
[y (* √x^2+y^2 (sin theta))])
(vector x y z)))
(list (list 0 (* 2 pi)) ; theta goes from 0 to 2pi
(list (- (/ pi 2)) (/ pi 2))) ; phi goes from -pi/2 to pi/2
#:color color))
I looked at the documentation already and didn’t find it, but is there something that can do that, maybe in a different place?
I saw parametric3d, but that looks like it only does one parameter, so it can only do lines.
If there isn’t, is there a way to define something like a parametric-surface3d?
Maybe something like this:
(define (parametric-surface3d f mins-and-maxes #:x-min [x-min #f] …)
(match mins-and-maxes
[(list (list u-min u-max) (list v-min v-max))
(…
(for*/list ([u-value (in-range u-min u-max ∆u)]
[v-value (in-range v-min v-max ∆v)])
(…
(f u-value v-value)
…))
…)]))
Where u and v are the parameters, u-min and u-max are the min and max of u, v-min and v-max are the min and max of v, and the function f is applied to the parameters like this: (f u-value v-value), and returns a (sequence-of real?) just like in parametric3d.
f: (real? real? . -> . (sequence-of real?)
mins-and-maxes: (listof (list/c real? real?))
Maybe a more general version could deal with any number of parameters (thats why I wanted to put them in one mins-and-maxes argument instead of having separate arguments for each min and max.
But I have no idea how to define something like this.
On Apr 10, 2014, at 11:27 PM, Neil Toronto <neil.toronto at gmail.com> wrote:
> (define (sphere3d x0 y0 z0 r color)
> (isosurface3d (λ (x y z) (sqrt (+ (sqr (- x0 x))
> (sqr (- y0 y))
> (sqr (- z0 z)))))
> r (- x0 r) (+ x0 r) (- y0 r) (+ y0 r) (- z0 r) (+ z0 r)
> #:line-style 'transparent
> #:color color))