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 <[email protected]> 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 <[email protected]> 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)) >> > ____________________ Racket Users list: http://lists.racket-lang.org/users

