// this generates data for Klein's Quartic (-geo 0 -quartic) and Bolza surface (in -geo 7 -quartic) and 2x Bolza (-geo7 -quartic2) // Copyright (C) 2018 Zeno Rogue, see 'hyper.cpp' for details #include "../init.cpp" using namespace hr; int qty; namespace hr { cellwalker& operator += (cellwalker& cw, int spin); cellwalker& operator += (cellwalker& cw, wstep_t); } void recursive(cell *c, int col, int dir, int dbl) { c->landparam = col; c->mondir = dir; c->monst = moButterfly; if(S7 == 7) { for(int i=0; i<7; i++) { for(int j=3; j<5; j++) { cellwalker cw(c, dir + i); for(int u=0; u<4; u++) { cw += wstep; cw += j; } cw += -dir; if(cw.c->landparam == -1) recursive(cw.c, col^dbl, dir, dbl); } } } if(S7 == 8) { for(int i=0; i<8; i++) { cellwalker cw(c, dir); cw += i; cw += wstep; cw += 4; cw += wstep; cw += (4-i); // if(cw.c->landparam == -1) recursive(cw.c, (col ^ 1)); if(cw.c->landparam == -1) recursive(cw.c, col ^ dbl, cw.spin, dbl); } } } void generate_quartic(bool dbl) { celllister clgen(cwt.c, S7==7?10:8, 1000000, NULL); int d; for(cell *c1: clgen.lst) { c1->landparam = -1; d = celldist(c1); } for(cell *c1: clgen.lst) if(c1->landparam == -1) { recursive(c1, qty, 0, dbl); qty++; if(dbl) qty++; } vector colors; for(cell *c1: clgen.lst) { if(celldist(c1) >= d-1) continue; if(c1->mov[c1->mondir]->landparam > c1->mov[c1->mondir ^ 4]->landparam) c1->mondir ^= 4; } if(0) for(cell *c1: clgen.lst) { if(celldist(c1) >= d-2) continue; vector connections; cellwalker cw(c1, c1->mondir); for(int i=0; ilandparam * S7 + (cwx.spin - cwx.c->mondir + MODFIXER) % S7); cw += 1; } printf("/* %03d */", c1->landparam); for(int i=0; ilandparam = colors[c1->landparam % qty]; } } int readArgs() { using namespace arg; if(0) ; else if(argis("-quartic")) { PHASE(3); start_game(); generate_quartic(0); } else if(argis("-quartic2")) { PHASE(3); start_game(); generate_quartic(1); } else return 1; return 0; } auto hook = addHook(hooks_args, 100, readArgs); // Bolza:: genus 2 => Euler characteristic -2 // octagon: -2/6 // ~> 6 octagons