Regina Calculation Engine

A degenerate zerotetrahedron saturated block that corresponds to attaching a Mobius band to a single annulus boundary. More...
#include <subcomplex/nsatblocktypes.h>
Public Types  
typedef std::set< NTetrahedron * >  TetList 
The data structure used to store a list of tetrahedra that should not be examined by isBlock(). More...  
Public Member Functions  
NSatMobius (const NSatMobius &cloneMe)  
Constructs a clone of the given block structure. More...  
int  position () const 
Describes how the Mobius band is attached to the boundary annulus. More...  
virtual NSatBlock *  clone () const 
Returns a newly created clone of this saturated block structure. More...  
virtual void  adjustSFS (NSFSpace &sfs, bool reflect) const 
Adjusts the given Seifert fibred space to insert the contents of this saturated block. More...  
virtual void  writeTextShort (std::ostream &out) const 
Writes this object in short text format to the given output stream. More...  
virtual void  writeAbbr (std::ostream &out, bool tex=false) const 
Writes an abbreviated name or symbol for this block to the given output stream. More...  
unsigned  nAnnuli () const 
Returns the number of annuli on the boundary of this saturated block. More...  
const NSatAnnulus &  annulus (unsigned which) const 
Returns details of the requested annulus on the boundary of this saturated block. More...  
bool  twistedBoundary () const 
Is the ring of boundary annuli twisted to form a long Mobius strip? More...  
bool  hasAdjacentBlock (unsigned whichAnnulus) const 
Returns whether there is another saturated block listed as being adjacent to the given boundary annulus of this block. More...  
NSatBlock *  adjacentBlock (unsigned whichAnnulus) const 
Returns the saturated block listed as being adjacent to the given boundary annulus of this block. More...  
unsigned  adjacentAnnulus (unsigned whichAnnulus) const 
Returns which specific annulus of the adjacent block is listed as being adjacent to the given boundary annulus of this block. More...  
bool  adjacentReflected (unsigned whichAnnulus) const 
Returns whether the adjacency along the given boundary annulus of this block is reflected. More...  
bool  adjacentBackwards (unsigned whichAnnulus) const 
Returns whether the adjacency along the given boundary annulus of this block is backwards. More...  
void  setAdjacent (unsigned whichAnnulus, NSatBlock *adjBlock, unsigned adjAnnulus, bool adjReflected, bool adjBackwards) 
Lists the given saturated block as being adjacent to the given boundary annulus of this block. More...  
virtual void  transform (const NTriangulation *originalTri, const NIsomorphism *iso, NTriangulation *newTri) 
Adjusts the structure of this block according to the given isomorphism between triangulations. More...  
void  nextBoundaryAnnulus (unsigned thisAnnulus, NSatBlock *&nextBlock, unsigned &nextAnnulus, bool &refVert, bool &refHoriz, bool followPrev) 
Finds the next (or previous) boundary annulus around from this, treating all adjacent blocks as part of a single large saturated region. More...  
std::string  getAbbr (bool tex=false) const 
Returns an abbreviated name or symbol for this block. More...  
bool  operator< (const NSatBlock &compare) const 
Implements a consistent ordering of saturated blocks. More...  
Input and Output  
virtual void  writeTextLong (std::ostream &out) const 
Writes this object in long text format to the given output stream. More...  
std::string  str () const 
Returns the output from writeTextShort() as a string. More...  
std::string  toString () const 
A deprecated alias for str(), which returns the output from writeTextShort() as a string. More...  
std::string  detail () const 
Returns the output from writeTextLong() as a string. More...  
std::string  toStringLong () const 
A deprecated alias for detail(), which returns the output from writeTextLong() as a string. More...  
Static Public Member Functions  
static NSatMobius *  isBlockMobius (const NSatAnnulus &annulus, TetList &avoidTets) 
Determines whether the given annulus is a boundary annulus for a block of this type (Mobius band). More...  
static NSatBlock *  isBlock (const NSatAnnulus &annulus, TetList &avoidTets) 
Determines whether the given annulus is in fact a boundary annulus for a recognised type of saturated block. More...  
Static Protected Member Functions  
static bool  isBad (NTetrahedron *t, const TetList &list) 
Determines whether the given tetrahedron is contained within the given list. More...  
template<class List >  
static bool  isBad (NTetrahedron *t, const List &list) 
Determines whether the given tetrahedron is contained within the given list. More...  
static bool  notUnique (NTetrahedron *test) 
Determines whether the given tetrahedron pointer is null. More...  
static bool  notUnique (NTetrahedron *test, NTetrahedron *other1) 
Determines whether the given tetrahedron pointer is null or equal to another from the given list. More...  
static bool  notUnique (NTetrahedron *test, NTetrahedron *other1, NTetrahedron *other2) 
Determines whether the given tetrahedron pointer is null or equal to another from the given list. More...  
static bool  notUnique (NTetrahedron *test, NTetrahedron *other1, NTetrahedron *other2, NTetrahedron *other3) 
Determines whether the given tetrahedron pointer is null or equal to another from the given list. More...  
static bool  notUnique (NTetrahedron *test, NTetrahedron *other1, NTetrahedron *other2, NTetrahedron *other3, NTetrahedron *other4) 
Determines whether the given tetrahedron pointer is null or equal to another from the given list. More...  
Protected Attributes  
unsigned  nAnnuli_ 
The number of boundary annuli. More...  
NSatAnnulus *  annulus_ 
Details of each boundary annulus, as seen from the inside of this saturated block. More...  
bool  twistedBoundary_ 
Is the ring of boundary annuli twisted to form a Mobius band? More...  
NSatBlock **  adjBlock_ 
The saturated block joined to each boundary annulus; this may be null if there is no adjacency or if this information is not known. More...  
unsigned *  adjAnnulus_ 
Describes which specific annulus of the adjacent saturated block is joined to each boundary annulus of this block. More...  
bool *  adjReflected_ 
Describes whether the adjacency for each boundary annulus is reflected (see the class notes above). More...  
bool *  adjBackwards_ 
Describes whether the adjacency for each boundary annulus is backwards (see the class notes above). More...  
A degenerate zerotetrahedron saturated block that corresponds to attaching a Mobius band to a single annulus boundary.
This is a degenerate case of the layered solid torus (see the class NSatLST), where instead of joining a solid torus to an annulus boundary we join a Mobius band. The Mobius band can be thought of as a zerotetrahedron solid torus with two boundary triangles, which in fact are opposite sides of the same triangle. By attaching a zerotetrahedron Mobius band to an annulus boundary, we are effectively joining the two triangles of the annulus together.
The meridinal disc of this zerotetrahedron solid torus meets the three edges of the annulus in 1, 1 and 2 places, so it is in fact a degenerate (1,1,2) layered solid torus. Note that the weight 2 edge is the boundary edge of the Mobius strip.

inherited 
The data structure used to store a list of tetrahedra that should not be examined by isBlock().

inline 
Constructs a clone of the given block structure.
cloneMe  the block structure to clone. 

inlineinherited 
Returns which specific annulus of the adjacent block is listed as being adjacent to the given boundary annulus of this block.
whichAnnulus  indicates which boundary annulus of this block should be examined; this must be between 0 and nAnnuli()1 inclusive. 

inlineinherited 
Returns whether the adjacency along the given boundary annulus of this block is backwards.
See the class notes for a discussion of backwards adjacencies.
whichAnnulus  indicates which boundary annulus of this block should be examined; this must be between 0 and nAnnuli()1 inclusive. 
true
if the corresponding adjacency is backwards, or false
if it is not.

inlineinherited 
Returns the saturated block listed as being adjacent to the given boundary annulus of this block.
whichAnnulus  indicates which boundary annulus of this block should be examined; this must be between 0 and nAnnuli()1 inclusive. 

inlineinherited 
Returns whether the adjacency along the given boundary annulus of this block is reflected.
See the class notes for a discussion of reflected adjacencies.
whichAnnulus  indicates which boundary annulus of this block should be examined; this must be between 0 and nAnnuli()1 inclusive. 
true
if the corresponding adjacency is reflected, or false
if it is not.

virtual 
Adjusts the given Seifert fibred space to insert the contents of this saturated block.
In particular, the space should be adjusted as though an ordinary solid torus (base orbifold a disc, no twists or exceptional fibres) had been replaced by this block. This description does not make sense for blocks with twisted boundary; the twisted case is discussed below.
If the argument reflect is true
, it should be assumed that this saturated block is being reflected before being inserted into the larger Seifert fibred space. That is, any twists or exceptional fibres should be negated before being added.
Regarding the signs of exceptional fibres: Consider a saturated block containing a solid torus whose meridinal curve runs p times horizontally around the boundary in order through annuli 0,1,... and follows the fibres q times from bottom to top (as depicted in the diagram in the NSatBlock class notes). Then this saturated block adds a positive (p, q) fibre to the underlying Seifert fibred space.
If the ring of saturated annuli bounding this block is twisted then the situation becomes more complex. It can be proven that such a block must contain a twisted reflector boundary in the base orbifold (use Z_2 homology with fibrereversing paths to show that the base orbifold must contain another twisted boundary component, and then recall that real boundaries are not allowed inside blocks).
In this twisted boundary case, it should be assumed that the twisted reflector boundary is already stored in the given Seifert fibred space. This routine should make any further changes that are required (there may well be none). That is, the space should be adjusted as though a trivial Seifert fibred space over the annulus with one twisted reflector boundary (and one twisted puncture corresponding to the block boundary) had been replaced by this block. In particular, this routine should not add the reflector boundary itself.
sfs  the Seifert fibred space to adjust. 
reflect  true if this block is to be reflected, or false if it should be inserted directly. 
Implements regina::NSatBlock.

inlineinherited 
Returns details of the requested annulus on the boundary of this saturated block.
Annuli are numbered from 0 to nAnnuli()1 as described in the class notes.
which  indicates which boundary annulus is requested; this must be between 0 and nAnnuli()1 inclusive. 

inlinevirtual 
Returns a newly created clone of this saturated block structure.
A clone of the correct subclass of NSatBlock will be returned. For this reason, each subclass of NSatBlock must implement this routine.
Implements regina::NSatBlock.

inherited 
Returns the output from writeTextLong() as a string.

inherited 
Returns an abbreviated name or symbol for this block.
This name will reflect the particular block type, but may not provide thorough details.
The name will be no more than a handful of characters long, and will not include a newline (or surrounding dollar signs in TeX mode).
tex  true if the name should be formatted for TeX, or false if it should be in plain text format. 

inlineinherited 
Returns whether there is another saturated block listed as being adjacent to the given boundary annulus of this block.
whichAnnulus  indicates which boundary annulus of this block should be examined; this must be between 0 and nAnnuli()1 inclusive. 
true
if the given boundary annulus has an adjacent block listed, or false
otherwise.

staticprotectedinherited 
Determines whether the given tetrahedron is contained within the given list.
This is intended as a helper routine for isBlock() and related routines.
t  the tetrahedron to search for. 
list  the list in which to search. 
true
if and only if the given tetrahedron was found.

inlinestaticprotectedinherited 
Determines whether the given tetrahedron is contained within the given list.
This is intended as a helper routine for isBlock() and related routines. It is a generic routine for working with arbitrary list types.
List::const_iterator
that span the given list can be obtained by calling list.begin()
and list.end()
.t  the tetrahedron to search for. 
list  the list in which to search. 
true
if and only if the given tetrahedron was found.

staticinherited 
Determines whether the given annulus is in fact a boundary annulus for a recognised type of saturated block.
The annulus should be represented from the inside of the proposed saturated block.
Only certain types of saturated block are recognised by this routine. More exotic saturated blocks will not be identified, and this routine will return null
in such cases.
The given list of tetrahedra will not be examined by this routine. That is, only saturated blocks that do not contain any of these tetrahedra will be considered. As a consequence, if the given annulus uses any of these tetrahedra then null
will be returned.
If a block is found on the other hand, all of the tetrahedra within this block will be added to the given list.
In the event that a block is found, it is guaranteed that the given annulus will be listed as annulus number 0 in the block structure, without any horizontal or vertical reflection.
annulus  the proposed boundary annulus that should form part of the new saturated block. 
avoidTets  the list of tetrahedra that should not be considered, and to which any new tetrahedra will be added. 
null
if none was found.

static 
Determines whether the given annulus is a boundary annulus for a block of this type (Mobius band).
This routine is a specific case of NSatBlock::isBlock(); see that routine for further details.
annulus  the proposed boundary annulus that should form part of the new saturated block. 
avoidTets  the list of tetrahedra that should not be considered, and to which any new tetrahedra will be added. 
null
if none was found.

inlineinherited 
Returns the number of annuli on the boundary of this saturated block.

inherited 
Finds the next (or previous) boundary annulus around from this, treating all adjacent blocks as part of a single large saturated region.
Suppose that all saturated blocks are merged together according to adjacent boundary annuli, forming larger saturated structures. The remaining annuli that do not have adjacent blocks will group together to form several large boundary rings. Note that each boundary ring might involve annuli from several different blocks, and might or might not have a twist (thus forming a large Klein bottle instead of a large torus).
This routine is used to trace around such a boundary ring. It is assumed that annulus thisAnnulus of this block forms part of a boundary ring (i.e., it has no adjacent block). This routine will then return the next/previous annulus around from this in the large boundary ring. Here "next" means in the direction following from the second triangle of this annulus, and "previous" means in the direction following from the first triangle; the boolean argument followPrev controls which we will be used. This next/previous annulus might belong to another block, or it might even be this original annulus again.
The next/previous annulus itself is not returned, but rather a reference as to how it appears within its enclosing saturated block. Specifically, a block and corresponding annulus number will be returned in the arguments nextBlock and nextAnnulus respectively.
It is possible that the next/previous annulus as it appears within the returned block is oriented differently from how it appears within this large boundary ring. For this reason, two booleans are returned also. The argument refVert will describe whether the annulus is reflected vertically as it appears within the large boundary ring (i.e., the first and second triangles remain the same but the fibre direction is reversed). Similarly, the argument refHoriz will describe whether the annulus is reflected horizontally as it appears within the large boundary ring (i.e., first and second triangles are switched but the fibre direction is unchanged).
It is possible that both a horizontal and vertical reflection take place. Note that any kind of reflection will also affect the locations of the 0/1/2 markings as described in the NSatAnnulus class notes.
Finally, note that if the large boundary ring is twisted (i.e., it forms a Klein bottle), then following the entire boundary ring around using this routine will bring you back to the starting annulus but with the refVert flag set.
thisAnnulus  describes which original boundary annulus of this block to examine; this must be between 0 and nAnnuli()1 inclusive. 
nextBlock  a reference used to return the block containing the next boundary annulus around from thisAnnulus. 
nextAnnulus  a reference used to return the specific annulus number within nextBlock of the next annulus around; this will be between 0 and nextBlock>nAnnuli()1 inclusive, and the corresponding annulus will have no block adjacent to it. 
refVert  a reference used to return true if the next annulus around is vertically reflected, or false if not; see above for details. 
refHoriz  a reference used to return true if the next annulus around is horizontally reflected, or false if not; see above for details. 
followPrev  true if we should find the previous boundary annulus, or false if we should find the next boundary annulus. 

inlinestaticprotectedinherited 
Determines whether the given tetrahedron pointer is null.
This is intended as a helper routine for isBlock() and related routines. Despite its trivial implementation, it is provided to make long blocks of code easier to read and distinguish by functionality.
The name notUnique() may seem strang for what is essentially a nullity test; in fact this routine is offered as a degenerate case of other variants of notUnique() that take more tetrahedra as arguments.
test  the tetrahedron pointer to test. 
true
if test is null, or false
otherwise.

inlinestaticprotectedinherited 
Determines whether the given tetrahedron pointer is null or equal to another from the given list.
This is intended as a helper routine for isBlock() and related routines. Despite its trivial implementation, it is provided to make long blocks of code easier to read and distinguish by functionality.
test  the tetrahedron pointer to test. 
other1  another tetrahedron that will be compared with test. 
true
if test is null or equal to other1, or false
otherwise.

inlinestaticprotectedinherited 
Determines whether the given tetrahedron pointer is null or equal to another from the given list.
This is intended as a helper routine for isBlock() and related routines. Despite its trivial implementation, it is provided to make long blocks of code easier to read and distinguish by functionality.
test  the tetrahedron pointer to test. 
other1  another tetrahedron that will be compared with test. 
other2  another tetrahedron that will be compared with test. 
true
if test is null or equal to other1 or other2, or false
otherwise.

inlinestaticprotectedinherited 
Determines whether the given tetrahedron pointer is null or equal to another from the given list.
This is intended as a helper routine for isBlock() and related routines. Despite its trivial implementation, it is provided to make long blocks of code easier to read and distinguish by functionality.
test  the tetrahedron pointer to test. 
other1  another tetrahedron that will be compared with test. 
other2  another tetrahedron that will be compared with test. 
other3  another tetrahedron that will be compared with test. 
true
if test is null or equal to other1, other2 or other3, or false
otherwise.

inlinestaticprotectedinherited 
Determines whether the given tetrahedron pointer is null or equal to another from the given list.
This is intended as a helper routine for isBlock() and related routines. Despite its trivial implementation, it is provided to make long blocks of code easier to read and distinguish by functionality.
test  the tetrahedron pointer to test. 
other1  another tetrahedron that will be compared with test. 
other2  another tetrahedron that will be compared with test. 
other3  another tetrahedron that will be compared with test. 
other4  another tetrahedron that will be compared with test. 
true
if test is null or equal to other1, other2, other3 or other4, or false
otherwise.

inherited 
Implements a consistent ordering of saturated blocks.
This ordering is purely aesthetic on the part of the author, and is subject to change in future versions of Regina.
compare  the saturated block with which this will be compared. 
true
if this block comes before the given block according to the ordering of saturated blocks, or false
if either the blocks are identical or this block comes after the given block.

inline 
Describes how the Mobius band is attached to the boundary annulus.
The class notes discuss the weight two edge of the Mobius band (or equivalently the boundary edge of the Mobius band). The return value of this routine indicates which edge of the boundary annulus this weight two edge is joined to.
In the NSatAnnulus class notes, the three edges of the annulus are denoted vertical, horizontal and boundary, and the vertices of each triangle are given markings 0, 1 and 2.
The return value of this routine takes the value 0, 1 or 2 as follows:

inlineinherited 
Lists the given saturated block as being adjacent to the given boundary annulus of this block.
Both block structures (this and the given block) will be updated.
whichAnnulus  indicates which boundary annulus of this block has the new adjacency; this must be between 0 and nAnnuli()1 inclusive. 
adjBlock  the other saturated block that is adjacent to this. 
adjAnnulus  indicates which boundary annulus of the adjacent block meets the given boundary annulus of this block; this must be between 0 and adjBlock>nAnnuli()1 inclusive. 
adjReflected  indicates whether the new adjacency is reflected (see the class notes for details). 
adjBackwards  indicates whether the new adjacency is backwards (see the class notes for details). 

inherited 
Returns the output from writeTextShort() as a string.
__str__()
function.

inlineinherited 
A deprecated alias for str(), which returns the output from writeTextShort() as a string.

inlineinherited 
A deprecated alias for detail(), which returns the output from writeTextLong() as a string.

virtualinherited 
Adjusts the structure of this block according to the given isomorphism between triangulations.
Any triangulationspecific information will be transformed accordingly (for instance, the routine NSatAnnulus::transform() will be called for each boundary annulus).
Information regarding adjacent blocks will not be changed. Only structural information for this particular block will be updated.
The given isomorphism must describe a mapping from originalTri to newTri, and this block must currently refer to tetrahedra in originalTri. After this routine is called the block will instead refer to the corresponding tetrahedra in newTri (with changes in vertex/face numbering also accounted for).
originalTri  the triangulation currently used by this saturated block. 
iso  the mapping from originalTri to newTri. 
newTri  the triangulation to be used by the updated block structure. 
Reimplemented in regina::NSatLST.

inlineinherited 
Is the ring of boundary annuli twisted to form a long Mobius strip?
Recall from the class notes that the twist occurs between boundary annuli nAnnuli()1 and 0.
true
if the ring of boundary annuli is twisted, or false
if not.

virtual 
Writes an abbreviated name or symbol for this block to the given output stream.
This name should reflect the particular block type, but need not provide thorough details.
The output should be no more than a handful of characters long, and no newline should be written. In TeX mode, no leading or trailing dollar signs should be written.
out  the output stream to which to write. 
tex  true if the output should be formatted for TeX, or false if it should be in plain text format. 
Implements regina::NSatBlock.

inlinevirtualinherited 
Writes this object in long text format to the given output stream.
The output should provide the user with all the information they could want. The output should be humanreadable, should not contain extremely long lines (so users can read the output in a terminal), and should end with a final newline.
The default implementation of this routine merely calls writeTextShort() and adds a newline.
out  the output stream to which to write. 
Reimplemented in regina::NSnapPeaTriangulation, regina::NGroupPresentation, regina::NHomMarkedAbelianGroup, regina::NNormalSurfaceList, regina::NTetrahedron, regina::NSatRegion, regina::NVertex, regina::NEdge, regina::Dim2Triangle, regina::NTriangle, regina::NLayeredSolidTorus, regina::NHomGroupPresentation, regina::NGenericIsomorphism< dim >, regina::NGenericIsomorphism< 2 >, regina::NGenericIsomorphism< 3 >, regina::NTriangulation, regina::NComponent, regina::NTxICore, regina::NTriSolidTorus, regina::NAngleStructureList, regina::Dim2Edge, regina::NBoundaryComponent, regina::NLayeredChain, regina::Dim2Vertex, regina::Dim2Component, regina::NScript, regina::NAugTriSolidTorus, regina::NSpiralSolidTorus, regina::NSurfaceFilterProperties, regina::NLayeredTorusBundle, regina::NManifold, regina::NPlugTriSolidTorus, regina::NMatrixInt, regina::NBlockedSFSTriple, regina::NPluggedTorusBundle, regina::Dim2Triangulation, regina::NSurfaceSubset, regina::NLayeredLensSpace, regina::NLayeredLoop, regina::NFileInfo, regina::NBlockedSFSLoop, regina::NSnappedBall, regina::NBlockedSFSPair, regina::Dim2BoundaryComponent, regina::NTrivialTri, regina::NL31Pillow, regina::NLayeredChainPair, regina::NText, regina::NSurfaceFilterCombination, and regina::NBlockedSFS.

virtual 
Writes this object in short text format to the given output stream.
The output should be humanreadable, should fit on a single line, and should not end with a newline.
out  the output stream to which to write. 
Implements regina::ShareableObject.

protectedinherited 
Describes which specific annulus of the adjacent saturated block is joined to each boundary annulus of this block.
Values may be undefined if the corresponding entries in the adjBlock array is null.

protectedinherited 
Describes whether the adjacency for each boundary annulus is backwards (see the class notes above).
Values may be undefined if the corresponding entries in the adjBlock array is null.

protectedinherited 
The saturated block joined to each boundary annulus; this may be null if there is no adjacency or if this information is not known.

protectedinherited 
Describes whether the adjacency for each boundary annulus is reflected (see the class notes above).
Values may be undefined if the corresponding entries in the adjBlock array is null.

protectedinherited 
Details of each boundary annulus, as seen from the inside of this saturated block.

protectedinherited 
The number of boundary annuli.

protectedinherited 
Is the ring of boundary annuli twisted to form a Mobius band?