|
| NSatBlock (const NSatBlock &cloneMe) |
| Creates a new clone of the given block. More...
|
|
| ~NSatBlock () |
| Destroys all internal arrays. More...
|
|
virtual NSatBlock * | clone () const =0 |
| Returns a newly created clone of this saturated block structure. 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 | adjustSFS (NSFSpace &sfs, bool reflect) const =0 |
| Adjusts the given Seifert fibred space to insert the contents of this saturated 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...
|
|
virtual void | writeAbbr (std::ostream &out, bool tex=false) const =0 |
| Writes an abbreviated name or symbol for this block to the given output stream. More...
|
|
bool | operator< (const NSatBlock &compare) const |
| Implements a consistent ordering of saturated blocks. More...
|
|
| ShareableObject () |
| Default constructor that does nothing. More...
|
|
virtual | ~ShareableObject () |
| Default destructor that does nothing. More...
|
|
virtual void | writeTextShort (std::ostream &out) const =0 |
| Writes this object in short text format to the given output stream. More...
|
|
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 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...
|
|
Represents a saturated block in a Seifert fibred space.
A saturated block is a connected set of tetrahedra built from a subset of fibres (no fibres may enter or exit the boundary of the block). In addition, the boundary of this block must be a ring of saturated annuli, as described by the NSatAnnulus class. Aside from this ring of saturated annuli, there may be no other boundary triangles within the block.
The boundary annuli are numbered consecutively as illustrated below, where the markings 0 and 1 within the triangles represent the first and second triangle of each annulus (see the NSatAnnulus class notes for details). Note that the following diagram is viewed from inside the block.
-+---+---+---+---+---+---+-
|0 /|0 /|0 /|0 /|0 /|0 /|
... | / | / | / | / | / | / | ...
|/ 1|/ 1|/ 1|/ 1|/ 1|/ 1|
-+---+---+---+---+---+---+-
Annulus # ... n-2 n-1 0 1 2 3 ...
The ring of boundary annuli may optionally be twisted, so that together the annuli form a long Mobius band. In this case, for the purposes of labelling and marking annuli, the twist occurs between annuli n-1 and 0. Be careful when dealing with blocks with twisted boundaries, since with twists it is possible to identify an edge with itself in reverse (thus producing something that is not a 3-manifold triangulation).
Each saturated block corresponds to a piece of the base orbifold of the larger Seifert fibred space. For the purpose of connecting the base orbifold together, we assume that the boundary of this particular piece runs horizontally in the diagram above (specifically following the horizontal edges of the boundary annuli, as described in the NSatAnnulus class notes). Insisting on such a boundary may lead to (1,k) twists within the block; these are accounted for by the virtual adjustSFS() routine.
Saturated blocks are generally joined to one another (or themselves) along their boundary annuli. For this purpose, each saturated block contains a list of which annulus of this block is adjacent to which annulus of which other block. Adjacencies may be reflected, meaning that the adjacent annulus has its fibres reversed (i.e., the adjacent annulus has undergone an up-to-down reflection); they may also be backwards, meaning that the first triangle of one annulus is joined to the second triangle of the other (and vice versa).
- Warning
- In addition to mandatory overrides such as clone() and adjustSFS(), some subclasses will need to override the virtual routine transform() in order to correctly adjust additional triangulation-specific information stored in the subclass. See the transform() documentation for further details.
virtual void regina::NSatBlock::adjustSFS |
( |
NSFSpace & |
sfs, |
|
|
bool |
reflect |
|
) |
| const |
|
pure 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 fibre-reversing 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.
- Parameters
-
sfs | the Seifert fibred space to adjust. |
reflect | true if this block is to be reflected, or false if it should be inserted directly. |
Implemented in regina::NSatLayering, regina::NSatReflectorStrip, regina::NSatCube, regina::NSatTriPrism, regina::NSatLST, and regina::NSatMobius.
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.
- Python:
- The second argument avoidTets is not present. An empty list will be passed instead.
- Parameters
-
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. |
- Returns
- details of the saturated block if one was found, or
null
if none was found.
void regina::NSatBlock::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.
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.
- Precondition
- Annulus thisAnnulus of this block has no block adjacent to it.
- Warning
- If you wish to trace around an entire boundary ring, you will need to adjust the argument followPrev according to whether or not the current annulus is reflected horizontally (since, under a horizontal reflection, "next" becomes "previous" and vice versa).
- Python:
- This routine only takes two arguments (thisAnnulus and followPrev). The return value is a tuple of four values: the block returned in nextBlock, the integer returned in nextAnnulus, the boolean returned in refVert, and the boolean returned in refHoriz.
- Parameters
-
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. |