Construct a zonohedron from a numeric matrix with 3 rows. Also construct some special zonohedra useful for testing.
zonohedron( mat, e0=0, e1=1.e-6, e2=1.e-10, ground=NULL )polarzonohedron( n, m=n, height=pi, ground=NULL )
regularprism( n, m=n, axis=c(0,0,1), ground=NULL )
zonohedron()
and polarzonohedron()
return a list with S3 class 'zonohedron'
.
In case of error, e.g. invalid mat
,
the functions print an error message and returns NULL
.
a numeric 3xM matrix, where 3 \(\le\) M. The matrix must have rank 3 (verified). The M columns are the generators of the zonohedron.
threshold for a column of mat
to be considered 0,
in the \(L^\infty\) norm.
Since the default is e0=0
,
by default a column must be exactly 0 to be considered 0.
threshold, in a pseudo-angular sense, for non-zero column vectors to be multiples of each other, and thus members of a group of multiple (aka parallel) points in the associated matroid. It OK for a column to be a negative multiple of another.
threshold, in a pseudo-angular sense, for the planes spanned by pairs of column vectors to be considered coincident, and thus the columns to be in the same hyperplane of the associated matroid.
The ground set of the associated matroid of rank 3 -
an integer vector in strictly increasing order, or NULL
.
When ground
is NULL
, it is set to 1:ncol(mat)
.
If ground
is not NULL
, length(ground)
must be equal to ncol(mat)
.
The point ground[i]
corresponds to the i'th column of mat
.
an integer \(\ge\) 3.
The generators are computed as n
equally spaced points on
a circle.
See Details for more on this circle.
an integer with 2 \(\le\) m
\(\le\) n
.
When m
< n
, only the first m
points are used as generators of the zonohedron.
the z value at the apex of the zonohedron,
which is the sum of all the generators.
The z value of all the generators is set to make this happen.
When height=pi
, as \(n \to \infty\) the zonohedron
converges to the interior of the surface of revolution
of the curve \(x = sin(z)\) for \(z \in [0,\pi]\),
see Chilton & Coxeter.
the axis of the regular prism. It must be a 3-vector with z value non-zero.
In zonohedron()
, the contruction of the zones (or belts) is optimized by following
the procedure in Heckbert.
The key step is sorting face normals that all lie on a great circle
of the unit sphere.
For polarzonohedron()
the circle is centered at
(0,0,height/n
) and parallel to the xy-plane.
The radius is height/n
.
For regularprism()
the circle is the unit circle in the xy-plane.
The 3-vector axis
is added as column m+1
of the matrix.
The returned zonohedron is the Minkowski sum of a zonogon and
the line segment defined by axis
.
If m
< n
, the zonogon may not be regular.
Both of these functions are useful for testing.
They load the matrix mat
and pass it to zonohedron()
.
B. L. Chilton and H. S. M. Coxeter. Polar Zonohedra. The American Mathematical Monthly. Vol 70. No. 9. pp. 946-951. 1963.
Paul Heckbert. An Efficient Algorithm for Generating Zonohedra. 3-D Technical Memo 11. 24 February 1985. Computer Graphics Lab. New York Institute of Technology
zonohedron()
,
zonoseg()
,