Learn R Programming

misc3d (version 0.3-1)

contour3d: Draw an Isosurface, a Three Dimension Contour Plot

Description

Uses rgl to render an isosurface computed by the marching cubes algorithm.

Usage

contour3d(f, level, x, y, z, add=FALSE,...)

Arguments

f
a function of 3 arguments or a three dimensional array.
level
numeric scalar. The value according to which to draw the isosurface.
x,y,z
locations of grid planes at which values in f are measured or f is evaluated. Can be omitted if f is an array.
add
logical; if TRUE, add to current rgl graph.
...
material and texture properties. See rgl.material for details.

Details

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

References

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

See Also

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

Examples

Run this code
#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)

  #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)
      for (i in seq(along = th)) {
           contour3d(f,th[i],x,x,x,color=col[i],alpha=al[i],
                     add = (i != 1))
      }
      rgl.bg(col="white")
  }
  g(40,5)

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

Run the code above in your browser using DataLab