contour3d               package:misc3d               R Documentation

_D_r_a_w _a_n _I_s_o_s_u_r_f_a_c_e, _a _T_h_r_e_e _D_i_m_e_n_s_i_o_n _C_o_n_t_o_u_r _P_l_o_t

_D_e_s_c_r_i_p_t_i_o_n:

     Computes and renders 3D contours or isosurfaces computed by the
     marching cubes algorithm.

_U_s_a_g_e:

        contour3d(f, level, x, y, z, mask = NULL, color = "white", color2 = NA,
                  alpha = 1, fill = TRUE, col.mesh = if (fill) NA else color,
                  material = "default", smooth = 0,
                  add = FALSE, draw = TRUE, engine = "rgl", ...)

_A_r_g_u_m_e_n_t_s:

       f: a function of 3 arguments or a three dimensional array.

   level: The level or levels at which to construct contour surfaces.

   x,y,z: locations of grid planes at which values in 'f' are measured
          or 'f' is to be evaluated. Can be omitted if 'f' is an array.

    mask: a function of 3 arguments returning a logical array, a three
          dimensional logical array, or 'NULL'.  If not 'NULL', only
          cells for which 'mask' is true at all eight vertices are used
          in forming the contour.  Can also be a list of functions the
          same length as 'level'.

   color: color to use for the contour surface. Recycled to the length
          of ''levels''. Can also be a function, or list of functions,
          of three arguments.  These are called for each level with
          three arguments, the coordinates of the midpoints of the
          triangles making up the surface.  They should return a vector
          of colors to use for the triangles.

  color2: opposite face color; only used for "standard" and "grid"
          engines. Recycled to the length of ''levels''.

   alpha: alpha channel level, a number between 0 and 1. Recycled to
          the length of ''levels''.

    fill: logical; if 'TRUE', drawing should use filled surfaces;
          otherwise a wire frame should be drawn. Recycled to the
          length of ''levels''.

col.mesh: color to use for the wire frame. Recycled to the length of
          ''levels''.

  smooth: integer specifying Phong shading level; currently only used
          by "standard" and "grid" engines. Recycled to the length of
          ''levels''.

material: material specification; currently only used by "standard" and
          "grid" engines. Currently possible values are the character
          strings "dull", "shiny", "metal", and "default".  Recycled to
          the length of ''levels''.

     add: logical; if 'TRUE', add to current 'rgl' graph.

    draw: logical; if 'TRUE', draw the results; otherwise, return
          contour triangles.

  engine: character; currently "rgl", "standard", "grid" or "none"; for
          "none" the computed triangles are returned.

     ...: additional rendering arguments, e.g. material and texture
          properties for the "rgl" engine.  See documentation for
          'drawScene' and 'drawScene.rgl'

_D_e_t_a_i_l_s:

     Uses the marching-cubes algorithm, with adjustments for dealing
     with face and internal ambiguities, to draw isosurfaces. See
     references for the details.

_V_a_l_u_e:

     For the "rgl" engine the returned value is 'NULL'. For the
     "standard" and "grid" engines the returned value is the viewing
     transformation as returned by 'persp'.  For the engine "none", or
     when 'draw' is not true, the returned value is a structure
     representing the triangles making up the contour, or a list of
     such structures for multiple contours.

_N_o_t_e:

     The "rgl" engine now uses the standard rgl coordinates instead of
     negating 'y' and swapping 'y' and 'z'. If you need to reproduce
     the previous behavior you can use
     'options(old.misc3d.orientation=TRUE)'.

     Transparency only works properly in the "rgl" engine.  For
     standard or grid graphics on pdf or quartz devices using alpha
     levels less than 1 does work but the triangle borders show as a
     less transparent mesh.

_R_e_f_e_r_e_n_c_e_s:

     Chernyaev E. (1995)   Marching Cubes 33: Construction of
     Topologically Correct Isosurfaces   _Technical Report CN/95-17,
     CERN_

     Daniel Adler, Oleg Nenadic and Walter Zucchini (2003) RGL: A
     R-library for 3D visualization with OpenGL

     Lorensen W. and Cline H. (1987)   Marching Cubes: A High
     Resolution 3D Surface Reconstruction Algorithm   _Computer
     Graphics_ *vol. 21, no. 4*, 163-169

     Nielson G. and Hamann B. (1992) The Asymptotic Decider: Resolving
     the Ambiguity in Marching Cubes   _Proc. IEEE Visualization_ 
     *92*, 83-91

_S_e_e _A_l_s_o:

     'rgl.triangles', 'rgl.material', 'rgl.surface'.

_E_x_a_m_p_l_e_s:

       #Example 1: Draw a ball
       f <- function(x, y, z)x^2+y^2+z^2
       x <- seq(-2,2,len=20)
       contour3d(f,4,x,x,x)
       contour3d(f,4,x,x,x, engine = "standard")

       # ball with one corner removed.
       contour3d(f,4,x,x,x, mask = function(x,y,z) x > 0 | y > 0 | z > 0)
       contour3d(f,4,x,x,x, mask = function(x,y,z) x > 0 | y > 0 | z > 0,
                 engine="standard", screen = list(x = 290, y = -20),
                 color = "red", color2 = "white")

       # ball with computed colors
       w <- function(x,y,z) {
           v <- sin(x) + cos(2 * y) * sin(5 * z)
           r <- range(v)
           n <- 100
           i <- pmax(pmin(ceiling(n * (v - r[1]) / (r[2] - r[1])), n), 1)
           terrain.colors(n)[i]
       }
       contour3d(f,4,x,x,x, color = w)

       #Example 2: Nested contours of mixture of three tri-variate normal densities
       nmix3 <- function(x, y, z, m, s) {
           0.4 * dnorm(x, m, s) * dnorm(y, m, s) * dnorm(z, m, s) +
           0.3 * dnorm(x, -m, s) * dnorm(y, -m, s) * dnorm(z, -m, s) +
           0.3 * dnorm(x, m, s) * dnorm(y, -1.5 * m, s) * dnorm(z, m, s)
       }
       f <- function(x,y,z) nmix3(x,y,z,.5,.5)
       g <- function(n = 40, k = 5, alo = 0.1, ahi = 0.5, cmap = heat.colors) {
           th <- seq(0.05, 0.2, len = k)
           col <- rev(cmap(length(th)))
           al <- seq(alo, ahi, len = length(th))
           x <- seq(-2, 2, len=n)
           contour3d(f,th,x,x,x,color=col,alpha=al)
           rgl.bg(col="white")
       }
       g(40,5)
       gs <- function(n = 40, k = 5, cmap = heat.colors, ...) {
           th <- seq(0.05, 0.2, len = k)
           col <- rev(cmap(length(th)))
           x <- seq(-2, 2, len=n)
           m <- function(x,y,z) x > .25 | y < -.3
           contour3d(f,th,x,x,x,color=col, mask = m, engine = "standard",
                     scale = FALSE, ...)
           rgl.bg(col="white")
       }
       gs(40, 5, screen=list(z = 130, x = -80), color2 = "lightgray", cmap=rainbow)

     ## Not run: 
       #Example 3: Nested contours for FMRI data.
       library(AnalyzeFMRI)
       a <- f.read.analyze.volume(system.file("example.img", package="AnalyzeFMRI"))
       a <- a[,,,1]
       contour3d(a, 1:64, 1:64, 1.5*(1:21), lev=c(3000, 8000, 10000),
                 alpha = c(0.2, 0.5, 1), color = c("white", "red", "green"))

       # alternative masking out a corner
       m <- array(TRUE, dim(a))
       m[1:30,1:30,1:10] <- FALSE
       contour3d(a, 1:64, 1:64, 1.5*(1:21), lev=c(3000, 8000, 10000),
                 mask = m, color = c("white", "red", "green"))
       contour3d(a, 1:64, 1:64, 1.5*(1:21), lev=c(3000, 8000, 10000),
                 color = c("white", "red", "green"),
                 color2 = c("gray", "red", "green"),
                 mask = m, engine="standard",
                 scale = FALSE, screen=list(z = 60, x = -120))
       ## End(Not run)

