Polytopes
Abstract
Meshes.Polytope
— TypePolytope{K,Dim,T}
We say that a geometry is a K-polytope when it is a collection of "flat" sides that constitute a K
-dimensional subspace. They are called chain, polygon and polyhedron respectively for 1D (K=1
), 2D (K=2
) and 3D (K=3
) subspaces, embedded in a Dim
-dimensional space. The parameter K
is also known as the rank or parametric dimension of the polytope: https://en.wikipedia.org/wiki/Abstract_polytope.
The term polytope expresses a particular combinatorial structure. A polyhedron, for example, can be decomposed into faces. Each face can then be decomposed into edges, and edges into vertices. Some conventions act as a mapping between vertices and higher dimensional features (edges, faces, cells...), removing the need to store all features.
Additionally, the following property must hold in order for a geometry to be considered a polytope: the boundary of a (K+1)-polytope is a collection of K-polytopes, which may have (K-1)-polytopes in common. See https://en.wikipedia.org/wiki/Polytope.
Notes
- Type aliases are
Chain
,Polygon
,Polyhedron
.
Meshes.Chain
— TypeChain{Dim,T}
A chain is a 1-polytope, i.e. a polytope with parametric dimension 1. See https://en.wikipedia.org/wiki/Polygonal_chain.
Meshes.Polygon
— TypePolygon{Dim,T}
A polygon is a 2-polytope, i.e. a polytope with parametric dimension 2.
Meshes.Polyhedron
— TypePolyhedron{Dim,T}
A polyhedron is a 3-polytope, i.e. a polytope with parametric dimension 3.
See also Tetrahedron
, Hexahedron
and Pyramid
.
Concrete
Segment
Meshes.Segment
— TypeSegment(p1, p2)
An oriented line segment with end points p1
, p2
. The segment can be called as s(t)
with t
between 0
and 1
to interpolate linearly between its endpoints.
Segment((0., 0.), (1.,1.)) |> viz
Rope
Meshes.Rope
— TypeRope(p1, p2, ..., pn)
An open polygonal chain from a sequence of points p1
, p2
, ..., pn
.
Rope((0.,0.), (1.,0.5), (1.,1.), (2.,0.)) |> viz
Ring
Meshes.Ring
— TypeRing(p1, p2, ..., pn)
A closed polygonal chain from a sequence of points p1
, p2
, ..., pn
.
Ring((0.,0.), (1.,0.5), (1.,1.), (2.,0.)) |> viz
Ngon
Meshes.Ngon
— TypeNgon(p₁, p₂, ..., pₙ)
A N-gon is a polygon with N ≥ 3
vertices p₁
, p₂
, ..., pₙ
oriented counter-clockwise (CCW). In this case the number of vertices is fixed and known at compile time. Examples of N-gon are Triangle
(N=3), Quadrangle
(N=4), Pentagon
(N=5), etc.
Notes
Although the number of vertices
N
is known at compile time, we use abstract vectors to store the list of vertices. This design allows constructing N-gon from views of global vectors without expensive memory allocations.Type aliases are
Triangle
,Quadrangle
,Pentagon
,Hexagon
,Heptagon
,Octagon
,Nonagon
,Decagon
.
Triangle((0.,0.), (1.,0.), (0.,1.)) |> viz
PolyArea
Meshes.PolyArea
— TypePolyArea(outer; fix=true)
PolyArea([outer, inner₁, inner₂, ..., innerₖ]; fix=true)
A polygonal area with outer
ring, and optional inner rings inner₁
, inner₂
, ..., innerₖ
.
Rings can be a vector of Point
or a vector of tuples with coordinates for convenience, in which case the first point should not be repeated at the end of the vector.
The option fix
tries to correct issues with polygons in the real world, including issues with:
orientation
- Most algorithms assume that the outer ring is oriented counter-clockwise (CCW) and that all inner rings are oriented clockwise (CW).degeneracy
- Sometimes data is shared with degenerate rings (e.g. only 2 vertices).
outer = [(0.0,0.0),(1.0,0.0),(1.0,1.0),(0.0,1.0)]
hole1 = [(0.2,0.2),(0.4,0.2),(0.4,0.4),(0.2,0.4)]
hole2 = [(0.6,0.2),(0.8,0.2),(0.8,0.4),(0.6,0.4)]
poly = PolyArea([outer, hole1, hole2]) |> viz
Tetrahedron
Meshes.Tetrahedron
— TypeTetrahedron(p1, p2, p3, p4)
A tetrahedron with points p1
, p2
, p3
, p4
.
Tetrahedron((0,0,0),(1,0,0),(0,1,0),(0,0,1)) |> viz
Hexahedron
Meshes.Hexahedron
— TypeHexahedron(p1, p2, ..., p8)
A hexahedron with points p1
, p2
, ..., p8
.
Hexahedron((0,0,0),(1,0,0),(1,1,0),(0,1,0),(0,0,1),(1,0,1),(1,1,1),(0,1,1)) |> viz
Pyramid
Meshes.Pyramid
— TypePyramid(p1, p2, p3, p4, p5)
A pyramid with points p1
, p2
, p3
, p4
, p5
.
Pyramid((0,0,0),(1,0,0),(1,1,0),(0,1,0),(0,0,1)) |> viz