Polytopes

Abstract

Meshes.PolytopeType
Polytope{K,Dim,T}

We say that a geometry is a K-polytope when it is a collection of "flat" sides that constitue a K-dimensional subspace. They are called polygon and polyhedron respectively for 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 Polygon, Polyhedron.
Meshes.PolygonType
Polygon{Dim,T}

A polygon is a 2-polytope, i.e. a polytope with parametric dimension 2.

Meshes.PolyhedronType
Polyhedron{Dim,T}

A polyhedron is a 3-polytope, i.e. a polytope with parametric dimension 3.

Concrete

Meshes.SegmentType
Segment(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.

See also Line.

s = Segment((0., 0.), (1.,1.))

viz(s)
Meshes.NgonType
Ngon(p1, p2, ..., pN)

A N-gon is a polygon with N vertices p1, p2, ..., pN 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.

t = Triangle((0.,0.), (1.,0.), (0.,1.))

viz(t)
Meshes.ChainType
Chain(p1, p2, ..., pn)

A polygonal chain from a sequence of points p1, p2, ..., pn. See https://en.wikipedia.org/wiki/Polygonal_chain.

c = Chain((0.,0.), (1.,0.5), (1.,1.), (2.,0.))

viz(c)
Meshes.PolyAreaType
PolyArea(outer, [inner1, inner2, ..., innerk]; fix=true)

A polygonal area with outer chain, and optional inner chains inner1, inner2, ..., innerk.

Chains can be a vector of Point or a vector of tuples with coordinates for convenience.

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 (i.e. only 2 vertices).

outer = [(0.0,0.0),(1.0,0.0),(1.0,1.0),(0.0,1.0),(0.0,0.0)]
hole1 = [(0.2,0.2),(0.4,0.2),(0.4,0.4),(0.2,0.4),(0.2,0.2)]
hole2 = [(0.6,0.2),(0.8,0.2),(0.8,0.4),(0.6,0.4),(0.6,0.2)]
poly  = PolyArea(outer, [hole1, hole2])

viz(poly)
Meshes.TetrahedronType
Tetrahedron(p1, p2, p3, p4)

A tetrahedron with points p1, p2, p3, p4.

t = Tetrahedron([(0,0,0),(1,0,0),(0,1,0),(0,0,1)])

viz(t)
Meshes.HexahedronType
Hexahedron(p1, p2, ..., p8)

A hexahedron with points p1, p2, ..., p8.

h = 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(h)
Meshes.PyramidType
Pyramid(p1, p2, p3, p4, p5)

A pyramid with points p1, p2, p3, p4, p5.

p = Pyramid([(0,0,0),(1,0,0),(1,1,0),(0,1,0),(0,0,1)])

viz(p)