mixed infinite order
This commit is contained in:
parent
4fd196c6d8
commit
24b3d17eb4
11
bigstuff.cpp
11
bigstuff.cpp
|
@ -140,12 +140,12 @@ void hrmap::generateAlts(heptagon *h, int levs, bool link_cdata) {
|
||||||
if(h->c7) forCellEx(c2, h->c7) preventbarriers(c2);
|
if(h->c7) forCellEx(c2, h->c7) preventbarriers(c2);
|
||||||
if(GOLDBERG)
|
if(GOLDBERG)
|
||||||
for(int i=0; i<S7; i++) preventbarriers(createStep(h, i)->c7);
|
for(int i=0; i<S7; i++) preventbarriers(createStep(h, i)->c7);
|
||||||
for(int i=0; i<S7; i++)
|
for(int i=0; i<h->type; i++)
|
||||||
createStep(h->alt, i)->alt = h->alt->alt;
|
createStep(h->alt, i)->alt = h->alt->alt;
|
||||||
int relspin = -4; // for horocycles it must go the other way
|
int relspin = -4; // for horocycles it must go the other way
|
||||||
if(quotient) relspin = 0;
|
if(quotient) relspin = 0;
|
||||||
else {
|
else {
|
||||||
for(int j=0; j<S7; j++) for(int i=0; i<S7; i++) {
|
for(int j=0; j<h->type; j++) for(int i=0; i<h->type; i++) {
|
||||||
createStep(h, i);
|
createStep(h, i);
|
||||||
if(h->move(i)->alt == h->alt->move(j)) {
|
if(h->move(i)->alt == h->alt->move(j)) {
|
||||||
relspin = (i-j+S7) % S7;
|
relspin = (i-j+S7) % S7;
|
||||||
|
@ -163,8 +163,9 @@ void hrmap::generateAlts(heptagon *h, int levs, bool link_cdata) {
|
||||||
} }
|
} }
|
||||||
// h[relspin] matches alt[0]
|
// h[relspin] matches alt[0]
|
||||||
//printf("{%d~%d}\n", h->distance, h->alt->distance);
|
//printf("{%d~%d}\n", h->distance, h->alt->distance);
|
||||||
for(int i=0; i<S7; i++) {
|
if(h->type != h->alt->type) return;
|
||||||
int ir = (S7+i-relspin)%S7;
|
for(int i=0; i<h->type; i++) {
|
||||||
|
int ir = gmod(i-relspin, h->type);
|
||||||
heptagon *hm = h->alt->move(ir);
|
heptagon *hm = h->alt->move(ir);
|
||||||
heptagon *ho = createStep(h, i);
|
heptagon *ho = createStep(h, i);
|
||||||
// printf("[%p:%d ~ %p:%d] %p ~ %p\n",
|
// printf("[%p:%d ~ %p:%d] %p ~ %p\n",
|
||||||
|
@ -241,7 +242,7 @@ EX heptagon *createAlternateMap(cell *c, int rad, hstate firststate, int special
|
||||||
if(!polarb50(c)) return NULL;
|
if(!polarb50(c)) return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
heptagon *alt = tailored_alloc<heptagon> (S7);
|
heptagon *alt = tailored_alloc<heptagon> (h->type);
|
||||||
allmaps.push_back(newAltMap(alt));
|
allmaps.push_back(newAltMap(alt));
|
||||||
//printf("new alt {%p}\n", alt);
|
//printf("new alt {%p}\n", alt);
|
||||||
alt->s = firststate;
|
alt->s = firststate;
|
||||||
|
|
|
@ -724,6 +724,7 @@ enum eGeometry {
|
||||||
gTernary, gNIH, gSolN, gInfOrder, gSpace336, gSpace344, gCrystal344,
|
gTernary, gNIH, gSolN, gInfOrder, gSpace336, gSpace344, gCrystal344,
|
||||||
gArnoldCat, gArbitrary, gInfOrder4, gCrystal534,
|
gArnoldCat, gArbitrary, gInfOrder4, gCrystal534,
|
||||||
gSpace535, gSpace536, gSeifertCover, gSeifertWeber, gHomologySphere,
|
gSpace535, gSpace536, gSeifertCover, gSeifertWeber, gHomologySphere,
|
||||||
|
gInfOrderMixed,
|
||||||
gGUARD};
|
gGUARD};
|
||||||
|
|
||||||
enum eGeometryClass { gcHyperbolic, gcEuclid, gcSphere, gcSolNIH, gcNil, gcProduct, gcSL2 };
|
enum eGeometryClass { gcHyperbolic, gcEuclid, gcSphere, gcSolNIH, gcNil, gcProduct, gcSL2 };
|
||||||
|
@ -788,6 +789,7 @@ static const flagtype qOPTQ = Flag(19);
|
||||||
static const flagtype qSINGLE = Flag(20);
|
static const flagtype qSINGLE = Flag(20);
|
||||||
|
|
||||||
static const flagtype qDEPRECATED = Flag(21);
|
static const flagtype qDEPRECATED = Flag(21);
|
||||||
|
static const flagtype qINFMIXED = Flag(22);
|
||||||
|
|
||||||
// note: dnext assumes that x&7 equals 7
|
// note: dnext assumes that x&7 equals 7
|
||||||
static const int SEE_ALL = 50;
|
static const int SEE_ALL = 50;
|
||||||
|
@ -900,6 +902,7 @@ EX vector<geometryinfo> ginf = {
|
||||||
{"{5,3,5}","SWh", "{5,3,5} quotient", "535c", 12, 5, qsSMALLB | qANYQ, 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,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},
|
{"{5,3,3}","SW", "Poincaré homology sphere", "533s", 12, 3, qsSINGLE, giSphere3, 0x31400, {{7, 2}}, eVariation::pure},
|
||||||
|
{"{?,oo}", "none", "{3/4,∞} (infinite triangles and squares)", "ooxm", 3, OINF, qIDEAL | qINFMIXED, giHyperb2, 0x49400, {{6, 6}}, eVariation::pure},
|
||||||
};
|
};
|
||||||
// bits: 9, 10, 15, 16, (reserved for later) 17, 18
|
// bits: 9, 10, 15, 16, (reserved for later) 17, 18
|
||||||
|
|
||||||
|
|
|
@ -667,6 +667,8 @@ void geometry_information::generate_floorshapes() {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
else if(GOLDBERG) { /* will be generated on the fly */ }
|
else if(GOLDBERG) { /* will be generated on the fly */ }
|
||||||
|
|
||||||
|
else if(inforder::mixed()) { /* will be generated on the fly */ }
|
||||||
|
|
||||||
#if CAP_BT
|
#if CAP_BT
|
||||||
else if(kite::in()) {
|
else if(kite::in()) {
|
||||||
|
@ -868,6 +870,34 @@ EX int shvid(cell *c) {
|
||||||
return kite::getshape(c->master);
|
return kite::getshape(c->master);
|
||||||
else if(geometry == gBinary4 || geometry == gTernary)
|
else if(geometry == gBinary4 || geometry == gTernary)
|
||||||
return c->master->zebraval;
|
return c->master->zebraval;
|
||||||
|
else if(inforder::mixed()) {
|
||||||
|
int t = c->type;
|
||||||
|
static vector<bool> computed;
|
||||||
|
if(isize(computed) <= t) computed.resize(t+1);
|
||||||
|
if(!computed[t]) {
|
||||||
|
computed[t] = true;
|
||||||
|
cell model;
|
||||||
|
heptagon modelh;
|
||||||
|
model.type = t;
|
||||||
|
modelh.type = t;
|
||||||
|
S7 = t;
|
||||||
|
for(int i=0; i<S7; i++) {
|
||||||
|
model.move(i) = &model;
|
||||||
|
modelh.move(i) = &modelh;
|
||||||
|
model.c.setspin(i, i, false);
|
||||||
|
modelh.c.setspin(i, i, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
cgi.tessf = edge_of_triangle_with_angles(0, M_PI/t, M_PI/t);
|
||||||
|
cgi.crossf = cgi.tessf;
|
||||||
|
|
||||||
|
println(hlog, "generating floorshapes for ", t);
|
||||||
|
cgi.generate_floorshapes_for(t, &model, 0, 0);
|
||||||
|
cgi.finishshape();
|
||||||
|
cgi.extra_vertices();
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
}
|
||||||
else if(PURE)
|
else if(PURE)
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
|
|
|
@ -66,6 +66,12 @@ namespace gp { extern gp::local_info draw_li; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
transmatrix hrmap_standard::adj(heptagon *h, int d) {
|
transmatrix hrmap_standard::adj(heptagon *h, int d) {
|
||||||
|
if(inforder::mixed()) {
|
||||||
|
int t0 = h->type;
|
||||||
|
int t1 = h->cmove(d)->type;
|
||||||
|
int sp = h->c.spin(d);
|
||||||
|
return spin(-d * 2 * M_PI / t0) * xpush(spacedist(h->c7, d)) * spin(M_PI + 2*M_PI*sp/t1);
|
||||||
|
}
|
||||||
transmatrix T = cgi.heptmove[d];
|
transmatrix T = cgi.heptmove[d];
|
||||||
if(h->c.mirror(d)) T = T * Mirror;
|
if(h->c.mirror(d)) T = T * Mirror;
|
||||||
int sp = h->c.spin(d);
|
int sp = h->c.spin(d);
|
||||||
|
@ -120,7 +126,7 @@ transmatrix hrmap_standard::relative_matrix(heptagon *h2, heptagon *h1, const hy
|
||||||
}
|
}
|
||||||
if(bestdist < 1e8) return T;
|
if(bestdist < 1e8) return T;
|
||||||
}
|
}
|
||||||
for(int d=0; d<S7; d++) if(h1->move(d) == h2) {
|
for(int d=0; d<h1->type; d++) if(h1->move(d) == h2) {
|
||||||
return gm * adj(h1, d) * where;
|
return gm * adj(h1, d) * where;
|
||||||
}
|
}
|
||||||
if(among(geometry, gFieldQuotient, gBring, gMacbeath)) {
|
if(among(geometry, gFieldQuotient, gBring, gMacbeath)) {
|
||||||
|
@ -326,7 +332,7 @@ EX bool no_easy_spin() {
|
||||||
ld hrmap_standard::spin_angle(cell *c, int d) {
|
ld hrmap_standard::spin_angle(cell *c, int d) {
|
||||||
if(WDIM == 3) return SPIN_NOT_AVAILABLE;
|
if(WDIM == 3) return SPIN_NOT_AVAILABLE;
|
||||||
ld hexshift = 0;
|
ld hexshift = 0;
|
||||||
if(c == c->master->c7 && (S7 % 2 == 0) && BITRUNCATED) hexshift = cgi.hexshift + 2*M_PI/S7;
|
if(c == c->master->c7 && (S7 % 2 == 0) && BITRUNCATED) hexshift = cgi.hexshift + 2*M_PI/c->type;
|
||||||
else if(cgi.hexshift && c == c->master->c7) hexshift = cgi.hexshift;
|
else if(cgi.hexshift && c == c->master->c7) hexshift = cgi.hexshift;
|
||||||
if(IRREGULAR) {
|
if(IRREGULAR) {
|
||||||
auto id = irr::cellindex[c];
|
auto id = irr::cellindex[c];
|
||||||
|
@ -345,6 +351,18 @@ EX ld cellgfxdist(cell *c, int d) { return currentmap->spacedist(c, d); }
|
||||||
|
|
||||||
double hrmap_standard::spacedist(cell *c, int i) {
|
double hrmap_standard::spacedist(cell *c, int i) {
|
||||||
if(NONSTDVAR || WDIM == 3) return hrmap::spacedist(c, i);
|
if(NONSTDVAR || WDIM == 3) return hrmap::spacedist(c, i);
|
||||||
|
if(inforder::mixed()) {
|
||||||
|
int t0 = c->type;
|
||||||
|
int t1 = c->cmove(i)->type;
|
||||||
|
auto halfmove = [] (int i) {
|
||||||
|
if(i == 1) return 0.0;
|
||||||
|
if(i == 2) return 0.1;
|
||||||
|
return edge_of_triangle_with_angles(0, M_PI/i, M_PI/i);
|
||||||
|
};
|
||||||
|
ld tessf0 = halfmove(t0);
|
||||||
|
ld tessf1 = halfmove(t1);
|
||||||
|
return (tessf0 + tessf1) / 2;
|
||||||
|
}
|
||||||
if(!BITRUNCATED) return cgi.tessf;
|
if(!BITRUNCATED) return cgi.tessf;
|
||||||
if(c->type == S6 && (i&1)) return cgi.hexhexdist;
|
if(c->type == S6 && (i&1)) return cgi.hexhexdist;
|
||||||
return cgi.crossf;
|
return cgi.crossf;
|
||||||
|
|
14
hypgraph.cpp
14
hypgraph.cpp
|
@ -994,7 +994,7 @@ EX transmatrix actualV(const heptspin& hs, const transmatrix& V) {
|
||||||
if(bt::in()) return V;
|
if(bt::in()) return V;
|
||||||
#endif
|
#endif
|
||||||
if(kite::in()) return V;
|
if(kite::in()) return V;
|
||||||
return (hs.spin || !BITRUNCATED) ? V * spin(hs.spin*2*M_PI/S7 + master_to_c7_angle()) : V;
|
return (hs.spin || !BITRUNCATED) ? V * spin(hs.spin*2*M_PI/hs.at->type + master_to_c7_angle()) : V;
|
||||||
}
|
}
|
||||||
|
|
||||||
EX bool point_behind(hyperpoint h) {
|
EX bool point_behind(hyperpoint h) {
|
||||||
|
@ -1231,12 +1231,18 @@ void hrmap_standard::draw() {
|
||||||
bool draw = drawcell_subs(c, actualV(hs, V1));
|
bool draw = drawcell_subs(c, actualV(hs, V1));
|
||||||
|
|
||||||
if(sphere) draw = true;
|
if(sphere) draw = true;
|
||||||
|
|
||||||
if(draw) for(int d=0; d<S7; d++) {
|
if(draw) for(int d=0; d<c->type; d++) {
|
||||||
hstate s2 = transition(s, d);
|
hstate s2 = transition(s, d);
|
||||||
if(s2 == hsError) continue;
|
if(s2 == hsError) continue;
|
||||||
heptspin hs2 = hs + d + wstep;
|
heptspin hs2 = hs + d + wstep;
|
||||||
transmatrix Vd = V * cgi.heptmove[d];
|
transmatrix Vd;
|
||||||
|
if(inforder::mixed()) {
|
||||||
|
int d1 = gmod(hs.spin+d, c->type);
|
||||||
|
Vd = V * spin(-2*M_PI*d/c->type) * xpush(spacedist(c, d1)) * spin(M_PI);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Vd = V * cgi.heptmove[d];
|
||||||
bandfixer bf(Vd);
|
bandfixer bf(Vd);
|
||||||
drawn_cells.emplace_back(hs2, s2, Vd, band_shift);
|
drawn_cells.emplace_back(hs2, s2, Vd, band_shift);
|
||||||
}
|
}
|
||||||
|
|
12
inforder.cpp
12
inforder.cpp
|
@ -13,10 +13,18 @@ namespace hr {
|
||||||
|
|
||||||
EX namespace inforder {
|
EX namespace inforder {
|
||||||
|
|
||||||
|
EX bool in() { return S3 >= OINF; }
|
||||||
|
|
||||||
|
EX bool mixed() { return cgflags & qINFMIXED; }
|
||||||
|
|
||||||
|
EX int alt_degree;
|
||||||
|
|
||||||
struct hrmap_inforder : hrmap_hyperbolic {
|
struct hrmap_inforder : hrmap_hyperbolic {
|
||||||
|
|
||||||
heptagon *create_step(heptagon *h, int direction) {
|
heptagon *create_step(heptagon *h, int direction) {
|
||||||
auto h1 = tailored_alloc<heptagon> (S7);
|
int deg = h->type;
|
||||||
|
if(mixed()) deg = 7 - deg;
|
||||||
|
auto h1 = tailored_alloc<heptagon> (deg);
|
||||||
bool par = h->s == hsA && direction == 0;
|
bool par = h->s == hsA && direction == 0;
|
||||||
h->c.connect(direction, h1, par ? 1 + hrand(2) : 0, false);
|
h->c.connect(direction, h1, par ? 1 + hrand(2) : 0, false);
|
||||||
|
|
||||||
|
@ -24,7 +32,7 @@ EX namespace inforder {
|
||||||
h1->s = hsA;
|
h1->s = hsA;
|
||||||
h1->cdata = NULL;
|
h1->cdata = NULL;
|
||||||
h1->distance = h->distance + (par ? -1 : 1);
|
h1->distance = h->distance + (par ? -1 : 1);
|
||||||
h1->c7 = newCell(S7, h1);
|
h1->c7 = newCell(deg, h1);
|
||||||
|
|
||||||
return h1;
|
return h1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue