On this page we look at topological aspects of simplicial complexes such as boundaries and cycles.
The algorithms here assume that the simplexes (faces) are wound in a consistent way. To illustrate this we will take an example:
Here we have two triangles joined by an adjacent side. The arrows show the order that the vertices indexes are listed. It is important that they are defined in a consistent way. Here all triangles go anticlockwise. So the arrows on the adjacent line go in opposite directions. We interpret this as allowing us to cancel out these arrows. This leaves the boundary shown in red: 
We can use the code to do this as follows:  (1) > ASIMP := FiniteSimplicialComplex(Integer) (1) FiniteSimplicialComplex(Integer) Type: Type (2) > v1:List(List(NNI)) := [[1::NNI,2::NNI,3::NNI],[4::NNI,2::NNI,1::NNI]] (2) [[1,2,3],[4,2,1]] Type: List(List(NonNegativeInteger)) (3) > sc1 := simplicialComplex([],4,v1)$ASIMP (3) points 1..4 (1,2,3) (1,2,4) Type: FiniteSimplicialComplex(Integer) (4) > boundary(sc1)$ASIMP (4) points 1..4 (1,3) (2,3) (1,4) (2,4) Type: FiniteSimplicialComplex(Integer) 
In the case of a single line its boundary is the end points. As shown here:  (5) > v2:List(List(NNI)) := [[1::NNI,2::NNI]] (5) [[1,2]] Type: List(List(NonNegativeInteger)) (6) > sc2 := simplicialComplex([],2,v2)$ASIMP (6) points 1..2 (1,2) Type: FiniteSimplicialComplex(Integer) (7) > boundary(sc2)$ASIMP (7) points 1..2 (1) (2) Type: FiniteSimplicialComplex(Integer) 
Graphs, Surfaces and Homology  Peter Giblin.
