50% off: Unlimited data and AI learning.
State of Data and AI Literacy Report 2025

rgl (version 0.87)

cylinder3d: Create cylindrical or "tube" plots.

Description

This function converts a description of a space curve into a "mesh3d" object forming a cylindrical tube around the curve.

Usage

cylinder3d(center, radius = 1, twist = 0, e1 = NULL, e2 = NULL, e3 = NULL, 
           sides = 8, closed = 0, debug = FALSE)

Arguments

center
An n by 3 matrix whose columns are the x, y and z coordinates of the space curve.
radius
The radius of the cross-section of the tube at each point in the center.
twist
The amount by which the polygon forming the tube is twisted at each point.
e1, e2, e3
The Frenet coordinates to use at each point on the space curve.
sides
The number of sides in the polygon cross section.
closed
Whether to treat the first and last points of the space curve as identical, and close the curve. If closed > 0, it represents the number of points of overlap in the coordinates.
debug
If TRUE, display the local Frenet coordinates at each point.

Value

Details

The number of points in the space curve is determined by the vector lengths in center, after using xyz.coords to convert it to a list. The other arguments radius, twist, e1, e2, and e3 are extended to the same length. The three optional arguments e1, e2, and e3 determine the local coordinate system used to create the vertices at each point in center. If missing, they are computed by simple numerical approximations. e1 should be the tangent coordinate, giving the direction of the curve at the point. The cross-section of the polygon will be orthogonal to e1. e2 defaults to an approximation to the normal or curvature vector; it is used as the image of the y axis of the polygon cross-section. e3 defaults to an approximation to the binormal vector, to which the x axis of the polygon maps. The vectors are orthogonalized and normalized at each point.

Examples

Run this code
# A trefoil knot
open3d()
theta <- seq(0, 2*pi, len=25)
knot <- cylinder3d(cbind(sin(theta)+2*sin(2*theta), 2*sin(3*theta), cos(theta)-2*cos(2*theta)),
                      e1=cbind(cos(theta)+4*cos(2*theta), 6*cos(3*theta), sin(theta)+4*sin(2*theta)),
                      radius=0.8, closed=TRUE)
                     
shade3d(addNormals(subdivision3d(knot, depth=2)), col="green")

Run the code above in your browser using DataLab