diff --git a/classes.cpp b/classes.cpp index a9aa0a86..2ab79d53 100644 --- a/classes.cpp +++ b/classes.cpp @@ -723,7 +723,7 @@ enum eGeometry { gKiteDart2, gKiteDart3, gNil, gProduct, gRotSpace, gTernary, gNIH, gSolN, gInfOrder, gSpace336, gSpace344, gCrystal344, gArnoldCat, gArbitrary, gInfOrder4, gCrystal534, - gSpace535, gSpace536, gSeifertCover, + gSpace535, gSpace536, gSeifertCover, gSeifertWeber, gHomologySphere, gGUARD}; enum eGeometryClass { gcHyperbolic, gcEuclid, gcSphere, gcSolNIH, gcNil, gcProduct, gcSL2 }; @@ -785,6 +785,7 @@ static const flagtype qNIH = 65536; static const flagtype qIDEAL = 131072; static const flagtype qHUGE_BOUNDED = 262144; static const flagtype qOPTQ = Flag(19); +static const flagtype qSINGLE = Flag(20); // note: dnext assumes that x&7 equals 7 static const int SEE_ALL = 50; @@ -807,6 +808,8 @@ static const flagtype qsSMALLBF = qsSMALLB | qsFIELD | qANYQ; static const flagtype qsSMALLBE = qsSMALLB | qELLIPTIC | qANYQ; static const flagtype qsBP = qBINARY | qKITE; +static const flagtype qsSINGLE = qANYQ | qSMALL | qBOUNDED | qSINGLE; + EX geometryinfo1 giEuclid2 = { gcEuclid, 2, 2, 3, {1,1, 0,0 } }; EX geometryinfo1 giHyperb2 = { gcHyperbolic, 2, 2, 3, {1,1,-1,0 } }; EX geometryinfo1 giSphere2 = { gcSphere, 2, 2, 3, {1,1,+1,0 } }; @@ -893,6 +896,8 @@ EX vector ginf = { {"{5,3,5}","none", "{5,3,5} hyperbolic honeycomb", "535", 12, 5, 0, giHyperb3, 0x31400, {{7, 2}}, eVariation::pure}, {"{5,3,6}","none", "{5,3,6} hyperbolic honeycomb", "536", 12, 6, qIDEAL, giHyperb3, 0x31400, {{7, 2}}, eVariation::pure}, {"{5,3,5}","SWh", "{5,3,5} quotient", "535c", 12, 5, qsSMALLB | qANYQ, giHyperb3, 0x31400, {{7, 2}}, eVariation::pure}, + {"{5,3,5}","SW", "Seifert-Weber space", "535s", 12, 5, qsSINGLE, giHyperb3, 0x31400, {{7, 2}}, eVariation::pure}, + {"{5,3,3}","SW", "Poincaré homology sphere", "533s", 12, 3, qsSINGLE, giSphere3, 0x31400, {{7, 2}}, eVariation::pure}, }; // bits: 9, 10, 15, 16, (reserved for later) 17, 18 diff --git a/reg3.cpp b/reg3.cpp index d1328a25..0a8159ed 100644 --- a/reg3.cpp +++ b/reg3.cpp @@ -687,6 +687,20 @@ EX namespace reg3 { return res; } + struct hrmap_singlecell : hrmap_quotient3 { + hrmap_singlecell(ld angle) { + generate(); + initialize(1); + tmatrices[0].resize(S7); + for(int b=0; bc.connect(b, allh[0], (b+S7/2) % S7, false); + transmatrix T = reg3::adjmoves[b]; + hyperpoint p = tC0(T); + tmatrices[0][b] = rspintox(p) * xpush(hdist0(p)) * cspin(2, 1, angle) * spintox(p); + } + } + }; + struct hrmap_seifert_cover : hrmap_quotient3 { hrmap_seifert_cover() { @@ -1014,6 +1028,8 @@ EX namespace reg3 { EX hrmap* new_map() { if(geometry == gSeifertCover) return new seifert_weber::hrmap_seifert_cover; + if(geometry == gSeifertWeber) return new seifert_weber::hrmap_singlecell(108*degree); + if(geometry == gHomologySphere) return new seifert_weber::hrmap_singlecell(36*degree); if(quotient && !sphere) return new hrmap_field3; return new hrmap_reg3; } @@ -1039,6 +1055,7 @@ EX int celldistance(cell *c1, cell *c2) { EX bool pseudohept(cell *c) { auto m = regmap(); + if(cgflags & qSINGLE) return true; if(sphere) { hyperpoint h = tC0(m->relative_matrix(c->master, regmap()->origin, C0)); if(S7 == 12) {