[racket] Controlling the size of plot symbols

From: Alexander D. Knauth (alexander at knauth.org)
Date: Wed Apr 16 12:30:57 EDT 2014

Is there something that can take a list of points, (or maybe a list of lists of points) and connects those points into a surface, sort of like lines3d takes a list of points and connects them into a curve?  And then define parametric-surface3d could be defined in terms of it, like parametric3d is defined in terms of lines3d.  If there is, then I would like to be able to use it to define my own parametric-surface3d (even though it won’t have the sampling stuff) to use until there’s a real version with the sampling stuff.  And it just seems like a function that just takes a list of points would give people greater control over the sampling stuff anyway, if they wanted to have it.  

On Apr 11, 2014, at 5:28 PM, Neil Toronto <neil.toronto at gmail.com> wrote:

> Plot doesn't have parametric 3D surfaces yet because they can contain arbitrarily large, arbitrarily close, or intersecting polygons. Plot's current 3D engine sorts polygons wrongly when they're not in a grid or are too close together, and it never draws intersecting polygons right.
> The upcoming release's Plot has a 3D engine that can handle anything, but we've just created a release branch, which I can't add features to. I'll add `parametric-surface3d' to the master branch soon, though, so it'll be available in the nightly builds and in the release after next.
> FWIW, doing parametric surfaces well could be a little trickier than it seems. For example, when rendering a sphere, it might be desirable to sample theta more coarsely when phi is near -pi/2 or pi/2 (i.e. the poles). I'm not sure how to handle this yet, but the first thing that occurs to me is making one variable's range and sampling density a function of the value of the other. I'm open to suggestions.
> It might be time to take another look at Jens Axel's ideas for adaptive sampling, now that Plot can do it in 3D without b0rking it.
> Neil ⊥
> On 04/11/2014 02:17 PM, Alexander D. Knauth wrote:
>> 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))

Posted on the users mailing list.