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 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.
source

Concrete

Segment

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 Rope, Ring, Line.

source
Segment((0., 0.), (1.,1.)) |> viz

Rope

Meshes.RopeType
Rope(p1, p2, ..., pn)

An open polygonal chain from a sequence of points p1, p2, ..., pn.

See also Chain and Ring.

source
Rope((0.,0.), (1.,0.5), (1.,1.), (2.,0.)) |> viz

Ring

Meshes.RingType
Ring(p1, p2, ..., pn)

A closed polygonal chain from a sequence of points p1, p2, ..., pn.

See also Chain and Rope.

source
Ring((0.,0.), (1.,0.5), (1.,1.), (2.,0.)) |> viz

Ngon

Meshes.NgonType
Ngon(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.

source
Triangle((0.,0.), (1.,0.), (0.,1.)) |> viz

PolyArea

Meshes.PolyAreaType
PolyArea(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).

source
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

Tetrahedron((0,0,0),(1,0,0),(0,1,0),(0,0,1)) |> viz

Hexahedron

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

Pyramid((0,0,0),(1,0,0),(1,1,0),(0,1,0),(0,0,1)) |> viz