mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-12-24 01:00:25 +00:00
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(GOLDBERG)
|
||||
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;
|
||||
int relspin = -4; // for horocycles it must go the other way
|
||||
if(quotient) relspin = 0;
|
||||
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);
|
||||
if(h->move(i)->alt == h->alt->move(j)) {
|
||||
relspin = (i-j+S7) % S7;
|
||||
@ -163,8 +163,9 @@ void hrmap::generateAlts(heptagon *h, int levs, bool link_cdata) {
|
||||
} }
|
||||
// h[relspin] matches alt[0]
|
||||
//printf("{%d~%d}\n", h->distance, h->alt->distance);
|
||||
for(int i=0; i<S7; i++) {
|
||||
int ir = (S7+i-relspin)%S7;
|
||||
if(h->type != h->alt->type) return;
|
||||
for(int i=0; i<h->type; i++) {
|
||||
int ir = gmod(i-relspin, h->type);
|
||||
heptagon *hm = h->alt->move(ir);
|
||||
heptagon *ho = createStep(h, i);
|
||||
// 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;
|
||||
}
|
||||
|
||||
heptagon *alt = tailored_alloc<heptagon> (S7);
|
||||
heptagon *alt = tailored_alloc<heptagon> (h->type);
|
||||
allmaps.push_back(newAltMap(alt));
|
||||
//printf("new alt {%p}\n", alt);
|
||||
alt->s = firststate;
|
||||
|
@ -724,6 +724,7 @@ enum eGeometry {
|
||||
gTernary, gNIH, gSolN, gInfOrder, gSpace336, gSpace344, gCrystal344,
|
||||
gArnoldCat, gArbitrary, gInfOrder4, gCrystal534,
|
||||
gSpace535, gSpace536, gSeifertCover, gSeifertWeber, gHomologySphere,
|
||||
gInfOrderMixed,
|
||||
gGUARD};
|
||||
|
||||
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 qDEPRECATED = Flag(21);
|
||||
static const flagtype qINFMIXED = Flag(22);
|
||||
|
||||
// note: dnext assumes that x&7 equals 7
|
||||
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}","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},
|
||||
{"{?,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
|
||||
|
||||
|
@ -667,6 +667,8 @@ void geometry_information::generate_floorshapes() {
|
||||
#endif
|
||||
|
||||
else if(GOLDBERG) { /* will be generated on the fly */ }
|
||||
|
||||
else if(inforder::mixed()) { /* will be generated on the fly */ }
|
||||
|
||||
#if CAP_BT
|
||||
else if(kite::in()) {
|
||||
@ -868,6 +870,34 @@ EX int shvid(cell *c) {
|
||||
return kite::getshape(c->master);
|
||||
else if(geometry == gBinary4 || geometry == gTernary)
|
||||
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)
|
||||
return 0;
|
||||
else
|
||||
|
@ -66,6 +66,12 @@ namespace gp { extern gp::local_info draw_li; }
|
||||
#endif
|
||||
|
||||
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];
|
||||
if(h->c.mirror(d)) T = T * Mirror;
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
if(among(geometry, gFieldQuotient, gBring, gMacbeath)) {
|
||||
@ -326,7 +332,7 @@ EX bool no_easy_spin() {
|
||||
ld hrmap_standard::spin_angle(cell *c, int d) {
|
||||
if(WDIM == 3) return SPIN_NOT_AVAILABLE;
|
||||
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;
|
||||
if(IRREGULAR) {
|
||||
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) {
|
||||
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(c->type == S6 && (i&1)) return cgi.hexhexdist;
|
||||
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;
|
||||
#endif
|
||||
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) {
|
||||
@ -1231,12 +1231,18 @@ void hrmap_standard::draw() {
|
||||
bool draw = drawcell_subs(c, actualV(hs, V1));
|
||||
|
||||
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);
|
||||
if(s2 == hsError) continue;
|
||||
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);
|
||||
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 bool in() { return S3 >= OINF; }
|
||||
|
||||
EX bool mixed() { return cgflags & qINFMIXED; }
|
||||
|
||||
EX int alt_degree;
|
||||
|
||||
struct hrmap_inforder : hrmap_hyperbolic {
|
||||
|
||||
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;
|
||||
h->c.connect(direction, h1, par ? 1 + hrand(2) : 0, false);
|
||||
|
||||
@ -24,7 +32,7 @@ EX namespace inforder {
|
||||
h1->s = hsA;
|
||||
h1->cdata = NULL;
|
||||
h1->distance = h->distance + (par ? -1 : 1);
|
||||
h1->c7 = newCell(S7, h1);
|
||||
h1->c7 = newCell(deg, h1);
|
||||
|
||||
return h1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user