From 7ed3ee6098d9f0bd8d00dc035214894af5d2e47d Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Mon, 22 Apr 2019 14:48:42 +0200 Subject: [PATCH] rogueviz:: collatz:: 3D trees --- rogueviz.cpp | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/rogueviz.cpp b/rogueviz.cpp index eb29029d..7344bbb6 100644 --- a/rogueviz.cpp +++ b/rogueviz.cpp @@ -280,6 +280,8 @@ namespace collatz { double s2, s3, p2, p3; double cshift = -1; + transmatrix T2, T3; + edgetype *collatz1, *collatz2; void start() { @@ -295,6 +297,9 @@ namespace collatz { addedge(0, 0, 1, false, collatz::collatz1); vd.name = "1"; storeall(); + + T2 = spin(collatz::s2) * xpush(collatz::p2); + T3 = spin(collatz::s3) * xpush(collatz::p3); } } @@ -1342,7 +1347,7 @@ bool drawVertex(const transmatrix &V, cell *c, shmup::monster *m) { int i0 = isize(vdata); vdata.resize(i0+1); vertexdata& vdn = vdata[i0]; - createViz(i0, m->base, m->at * spin(collatz::s2) * xpush(collatz::p2)); + createViz(i0, m->base, m->at * collatz::T2); virtualRebase(vdn.m, true); vdn.cp = perturb(cp); @@ -1366,7 +1371,7 @@ bool drawVertex(const transmatrix &V, cell *c, shmup::monster *m) { if(m3 % 3 == 2 && s != "2" && s != "1") { vdata.resize(i0+2); vertexdata& vdn = vdata[i0+1]; - createViz(i0+1, m->base, m->at * spin(collatz::s3) * xpush(collatz::p3)); + createViz(i0+1, m->base, m->at * collatz::T3); virtualRebase(vdn.m, true); vdn.cp = perturb(cp); vdn.data = 0; @@ -1615,6 +1620,16 @@ bool turn(int delta) { #define CAP_RVSLIDES (CAP_TOUR && !ISWEB) #endif +int dimid(char x) { + if(x >= 'a' && x < 'a' + DIM) return x - 'a'; + else if(x >= '0' && x < '0' + DIM) return x - '0'; + else if(x >= 'x' && x < 'x' + DIM) return x - 'x'; + else { + println(hlog, "incorrect dimension ID"); + throw hr_exception(); + } + } + #if CAP_COMMANDLINE int readArgs() { using namespace arg; @@ -1698,6 +1713,22 @@ int readArgs() { start(); } + else if(argis("-collatz3")) { + PHASE(3); + using namespace collatz; + s2 = p2 = s3 = p3 = 0; + start(); + shift(); + transmatrix *T = &T2; + while(true) { + if(arg::pos >= isize(arg::argument)) break; + else if(argis("fd")) { shift(); *T = *T * xpush(argf()); shift(); } + else if(argcs()[0] == 't') { shift(); *T = *T * hr::cspin(dimid(argcs()[1]),dimid(argcs()[2]),argf()); shift(); } + else if(argis("/")) { shift(); if(T == &T2) T = &T3; else break; } + else break; + } + } + else if(argis("-spiral")) { PHASE(3); ld mul = 2;