An R package implementing the efficient marching cubes algorithm written by Thomas Lewiner. Minor changes have been made to the code in order to work with the armadillo C++ library.
::install_github("shwilks/rmarchingcubes") devtools
The key and only function exported in this package is
contour3d()
, taking a 3-dimensional array of values and
returning the calculated 3d mesh object fit to this data. A similar
function with more flexibility for different inputs and outputs is
provided in the misc3d
package. The implementation here has
two key advantages, firstly since the implementation is based on
compiled C++ code the result should be considerably quicker, perhaps by
orders of magnitude, secondly normals are additionally calculated and
returned for each vertex making up the 3d contour.
# Function to generate values decreasing in a sphere-like way
<- function(coords) coords[1]^2 + coords[2]^2 + coords[3]^2
f
# Set grid coordinates at which to calculate values
<- seq(-2,2,len = 20)
x <- seq(-2,2,len = 20)
y <- seq(-2,2,len = 20)
z
# Calculate values across grid coordinates
<- expand.grid(x, y, z)
grid_coords <- apply(grid_coords, 1, f)
grid_values
# Convert to a 3d array
<- array(grid_values, dim = c(length(x), length(y), length(z)))
grid_array
# Calculate 3d contour from the grid data at a contour level of value 4
<- contour3d(
contour_shape griddata = grid_array,
level = 4,
x = x,
y = y,
z = z
)
# Optionally view the output using the r3js package
# devtools::install_github("shwilks/r3js")
# Setup plot object
<- r3js::plot3js(
data3js x = x,
y = y,
z = z,
type = "n"
)
# Add shape according to the calculated contours
<- r3js::shape3js(
data3js
data3js,vertices = contour_shape$vertices,
faces = contour_shape$triangles,
normals = contour_shape$normals,
col = "red"
)
# View the plot
::r3js(data3js) r3js