MathGroup Archive 2011

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Coordinates from Graphics3D images

  • To: mathgroup at smc.vnet.net
  • Subject: [mg117450] Re: Coordinates from Graphics3D images
  • From: Fred Klingener <gigabitbucket at BrockEng.com>
  • Date: Sat, 19 Mar 2011 05:17:43 -0500 (EST)
  • References: <ilvdvf$eiu$1@smc.vnet.net>

On Mar 18, 6:59 am, Russell Chipman <rchip... at optics.arizona.edu>
wrote:
> Dear MathGroup
> I am searching for a way to find the {x,y,z} coordinates at every pixel in a Graphics3D view.
>
> I found a way to do this in ParametricPlot3D using ColorFunction, but Graphics3D does not accept ColorFunction as an option.
>
> To get the pixels at every coordinate ParametricPlot3D view, I encode the coordinates into an RGBColor image, then recover them from the three color planes.  Because the arguments to RGBColor are 0 < x < 1, first I scale all coordinates into this range.  Later I unscale them.
>
> Take the example function
>
> ff[u_,v_]:={(2+Cos[v])Cos[u]/\[Pi],(2+Cos[v])Sin[u]/\[Pi],Sin[v]}
>
> and the view
>
> ParametricPlot3D[ff[u,v],{u,0,2\[Pi]},{v,0,2 \[Pi]},ViewPoint->{4,-4,8}]

As nifty as your approach is, the easy way to get the nodes for this
surface is to look at the structure:

pp3D= ParametricPlot3D[ff[u,v],{u,0,2\[Pi]},{v,0,2 \[Pi]},ViewPoint-
>{4,-4,8}]

pp3D is a GraphicsComplex, and you can browse the structure with
something like

Pane[
FullForm[
pp3D]
, Scrollbars -> {False, True}
,  ImageSize -> {300, 300}
]

(I don't know why Mathematica doesn't have a ScrollForm)

The first argument of the GraphicsComplex is a list of the points on
the surface, and you can retrieve them with

Graphics3D[
 Point[
  points=
   Cases[
     pp3D
     , GraphicsComplex[pt__, ___] :> pt
     , Infinity
   ]
  ]
 ]

Most of Mathematica's 3D structures can be dissected this way, and if
you need the connectivity, look at the list of primitives pp3D//Normal
produces. For example, you can get all the isolated Polygons with

Graphics3D[
 polygons=
  Cases[
    pp3D // Normal
    , _Polygon
    , Infinity
   ]

or the mesh lines (if you specified meshing in the original.)

Graphics3D[
 lines=
  Cases[
   pp3D // Normal
   , _Line
   , Infinity
   ]
 ]

Hth,
Fred Klingener


  • Prev by Date: Re: Wolfram, meet Stefan and Boltzmann
  • Next by Date: Re: mathematica fit data to inverse gamma distribution
  • Previous by thread: Re: Coordinates from Graphics3D images
  • Next by thread: Re: Coordinates from Graphics3D images