From f5a8b2a0c2d1c483f77c3e59cd40c593b83e9847 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Tue, 7 Nov 2017 14:39:26 +0100 Subject: [PATCH] more precise torus-rug rendering --- fieldpattern.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++++++++ geom-exp.cpp | 61 +----------------------------------------------- hyper.h | 2 +- hypgraph.cpp | 2 +- rug.cpp | 28 ++++++++++++++++------ 5 files changed, 85 insertions(+), 69 deletions(-) diff --git a/fieldpattern.cpp b/fieldpattern.cpp index 3a0e2868..3475a55e 100644 --- a/fieldpattern.cpp +++ b/fieldpattern.cpp @@ -720,6 +720,66 @@ fpattern& getcurrfp() { return fp43; } +// extra information for field quotient extra configuration + +struct primeinfo { + int p; + int cells; + bool squared; + }; + +struct fgeomextra { + eGeometry base; + vector primes; + int current_prime_id; + fgeomextra(eGeometry b, int i) : base(b), current_prime_id(i) {} + }; + +vector fgeomextras = { + fgeomextra(gNormal, 3), + fgeomextra(gOctagon, 1), + fgeomextra(g45, 0), + fgeomextra(g46, 3), + fgeomextra(g47, 0) + }; + +int current_extra = 0; + +void nextPrime(fgeomextra& ex) { + dynamicval g(geometry, ex.base); + int nextprime; + if(size(ex.primes)) + nextprime = ex.primes.back().p + 1; + else + nextprime = 2; + while(true) { + fieldpattern::fpattern fp(0); + fp.Prime = nextprime; + if(fp.solve() == 0) { + fp.build(); + ex.primes.emplace_back(primeinfo{nextprime, size(fp.matrices) / S7, (bool) fp.wsquare}); + break; + } + nextprime++; + } + } + +void nextPrimes(fgeomextra& ex) { + while(size(ex.primes) < 4) + nextPrime(ex); + } + +void enableFieldChange() { + fgeomextra& gxcur = fgeomextras[current_extra]; + fieldpattern::quotient_field_changed = true; + nextPrimes(gxcur); + dynamicval g(geometry, gQuotient2); + ginf[geometry].sides = ginf[gxcur.base].sides; + ginf[geometry].vertex = ginf[gxcur.base].vertex; + ginf[geometry].distlimit = ginf[gxcur.base].distlimit; + fieldpattern::current_quotient_field.init(gxcur.primes[gxcur.current_prime_id].p); + } + } #define currfp fieldpattern::getcurrfp() @@ -727,3 +787,4 @@ fpattern& getcurrfp() { int currfp_gmul(int a, int b) { return currfp.gmul(a,b); } int currfp_inverses(int i) { return currfp.inverses[i]; } int currfp_distwall(int i) { return currfp.distwall[i]; } + diff --git a/geom-exp.cpp b/geom-exp.cpp index 017272bf..5c020efe 100644 --- a/geom-exp.cpp +++ b/geom-exp.cpp @@ -29,67 +29,8 @@ string euchelp = int ewhichscreen = 2; -// extra information for field quotient extra configuration - -struct primeinfo { - int p; - int cells; - bool squared; - }; - -struct fgeomextra { - eGeometry base; - vector primes; - int current_prime_id; - fgeomextra(eGeometry b, int i) : base(b), current_prime_id(i) {} - }; - -vector fgeomextras = { - fgeomextra(gNormal, 3), - fgeomextra(gOctagon, 1), - fgeomextra(g45, 0), - fgeomextra(g46, 3), - fgeomextra(g47, 0) - }; - -int current_extra = 0; - -void nextPrime(fgeomextra& ex) { - dynamicval g(geometry, ex.base); - int nextprime; - if(size(ex.primes)) - nextprime = ex.primes.back().p + 1; - else - nextprime = 2; - while(true) { - fieldpattern::fpattern fp(0); - fp.Prime = nextprime; - if(fp.solve() == 0) { - fp.build(); - ex.primes.emplace_back(primeinfo{nextprime, size(fp.matrices) / S7, (bool) fp.wsquare}); - break; - } - nextprime++; - } - } - -void nextPrimes(fgeomextra& ex) { - while(size(ex.primes) < 4) - nextPrime(ex); - } - -void enableFieldChange() { - fgeomextra& gxcur = fgeomextras[current_extra]; - fieldpattern::quotient_field_changed = true; - nextPrimes(gxcur); - dynamicval g(geometry, gQuotient2); - ginf[geometry].sides = ginf[gxcur.base].sides; - ginf[geometry].vertex = ginf[gxcur.base].vertex; - ginf[geometry].distlimit = ginf[gxcur.base].distlimit; - fieldpattern::current_quotient_field.init(gxcur.primes[gxcur.current_prime_id].p); - } - void showQuotientConfig() { + using namespace fieldpattern; gamescreen(2); dialog::init(XLAT("advanced configuration")); fgeomextra& gxcur = fgeomextras[current_extra]; diff --git a/hyper.h b/hyper.h index 3365316e..07456cf2 100644 --- a/hyper.h +++ b/hyper.h @@ -1243,7 +1243,7 @@ void fullcenter(); void movecost(cell* from, cell *to); void checkmove(); -transmatrix eumove(int x, int y); +transmatrix eumove(ld x, ld y); transmatrix eumovedir(int d); int reptilemax(); diff --git a/hypgraph.cpp b/hypgraph.cpp index 4e366a96..6f778d85 100644 --- a/hypgraph.cpp +++ b/hypgraph.cpp @@ -363,7 +363,7 @@ void drawrec(const heptspin& hs, int lev, hstate s, const transmatrix& V) { int mindx=-7, mindy=-7, maxdx=7, maxdy=7; -transmatrix eumove(int x, int y) { +transmatrix eumove(ld x, ld y) { transmatrix Mat = Id; Mat[2][2] = 1; Mat[0][2] += (x + y * .5) * eurad; diff --git a/rug.cpp b/rug.cpp index 27b4fa3e..32de345e 100644 --- a/rug.cpp +++ b/rug.cpp @@ -34,6 +34,7 @@ GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers) namespace rug { double rugzoom = .3; +int torus_precision = 2; // hypersian rug datatypes and globals //------------------------------------- @@ -204,7 +205,7 @@ void buildTorusRug() { transmatrix z2 = inverse(z1); printf("h1 = %s\n", display(z2 * hyperpoint {22,1,0})); - auto addToruspoint = [&] (int x, int y) { + auto addToruspoint = [&] (ld x, ld y) { auto r = addRugpoint(C0, 0); hyperpoint onscreen; applymodel(tC0(eumove(x, y)), onscreen); @@ -226,15 +227,21 @@ void buildTorusRug() { r->valid = true; return r; }; + + int rugmax = min(torus_precision, 16); + ld rmd = rugmax; for(int i=0; i 16) torus_precision = 16; + dialog::addSelItem(XLAT("precision"), its(torus_precision), 'p'); + } dialog::display(); keyhandler = [] (int sym, int uni) { #if ISPANDORA @@ -850,6 +862,8 @@ void show() { } else if(uni == 'o') renderonce = !renderonce; + else if(uni == 'p' && torus_precision) + dialog::editNumber(torus_precision, 0, 16, 1, 2, "precision", "precision"); #if !ISPANDORA else if(uni == 'g') rendernogl = !rendernogl;