Learn R Programming

MeshesTools (version 1.0.0)

clipMesh: Clip a mesh

Description

Clip a mesh to the volume bounded by another mesh.

Usage

clipMesh(mesh, clipper, clipVolume = TRUE, normals = FALSE)

Value

A triangle mesh of class cgalMesh (see

Mesh for details).

Arguments

mesh

a mesh given either as a list containing (at least) the fields vertices and faces, otherwise a rgl mesh (i.e. a mesh3d object)

clipper

a mesh given either as a list containing (at least) the fields vertices and faces, otherwise a rgl mesh (i.e. a mesh3d object)

clipVolume

Boolean, whether the clipping has to be done on the volume bounded by mesh rather than on its surface (i.e. mesh will be kept closed if it is closed)

normals

Boolean, whether to compute the vertex normals of the output mesh

Examples

Run this code
# cube clipped to sphere
library(MeshesTools)
library(rgl)
mesh    <- cube3d()
clipper <- sphereMesh(r= sqrt(2))
clippedMesh <- clipMesh(mesh, clipper)
open3d(windowRect = c(50, 50, 562, 562))
view3d(zoom = 0.9)
shade3d(toRGL(clippedMesh), color = "purple")

# Togliatti surface clipped to a ball ####
library(rmarchingcubes)
library(rgl)
library(MeshesTools)

# Togliatti surface equation: f(x,y,z) = 0
f <- function(x, y, z) {
  64*(x-1) *
    (x^4 - 4*x^3 - 10*x^2*y^2 - 4*x^2 + 16*x - 20*x*y^2 + 5*y^4 + 16 - 20*y^2) - 
    5*sqrt(5-sqrt(5))*(2*z - sqrt(5-sqrt(5))) * 
    (4*(x^2 + y^2 - z^2) + (1 + 3*sqrt(5)))^2
}

# grid
n <- 200L
x <- y <- seq(-5, 5, length.out = n)
z <- seq(-4, 4, length.out = n)
Grid <- expand.grid(X = x, Y = y, Z = z)
# calculate voxel
voxel <- array(with(Grid, f(X, Y, Z)), dim = c(n, n, n))
# calculate isosurface
contour_shape <- contour3d(
  griddata = voxel, level = 0, x = x, y = y, z = z
)
# make rgl mesh (plotted later)
mesh <- tmesh3d(
  vertices = t(contour_shape[["vertices"]]),
  indices  = t(contour_shape[["triangles"]]),
  normals  = contour_shape[["normals"]],
  homogeneous = FALSE
)

# clip to sphere of radius 4.8
clipper <- sphereMesh(r = 4.8)
clippedMesh <- clipMesh(mesh, clipper, clipVolume = FALSE, normals = TRUE)

# plot
open3d(windowRect = c(50, 50, 950, 500))
mfrow3d(1L, 2L)
view3d(0, -70, zoom = 0.8)
shade3d(mesh, color = "firebrick")
next3d()
view3d(0, -70, zoom = 0.8)
shade3d(toRGL(clippedMesh), color = "firebrick")

Run the code above in your browser using DataLab