diff --git a/crystal.cpp b/crystal.cpp index a1612187..9caedaf3 100644 --- a/crystal.cpp +++ b/crystal.cpp @@ -687,6 +687,11 @@ EX color_t colorize(cell *c, char whichCanvas) { return res; } + case '/': { + int s = ico[1] + ico[2] + ico[3] + ico[0]; + if(s > 0) return 0x1FF20FF; + else if (s < -2) return 0x1C0C0C0; + } } return res; } diff --git a/nonisotropic.cpp b/nonisotropic.cpp index 477372ce..2fe57c2b 100644 --- a/nonisotropic.cpp +++ b/nonisotropic.cpp @@ -774,6 +774,7 @@ EX namespace nilv { { point31(0,0,0.5), point31(-0.5,0.5,0.25), point31(-0.5,-0.5,0.75), point31(0,0,0.5), point31(-0.5,-0.5,0.75), point31(-0.5,-0.5,0.5), point31(0,0,0.5), point31(-0.5,-0.5,0.5), point31(0.5,-0.5,0.5), point31(0,0,0.5), point31(0.5,-0.5,0.5), point31(0.5,-0.5,0.25), point31(0,0,0.5), point31(0.5,-0.5,0.25), point31(0.5,0.5,0.75), point31(0,0,0.5), point31(0.5,0.5,0.75), point31(0.5,0.5,0.5), point31(0,0,0.5), point31(0.5,0.5,0.5), point31(-0.5,0.5,0.5), point31(0,0,0.5), point31(-0.5,0.5,0.5), point31(-0.5,0.5,0.25), }, }}; + EX int zgmod(int a, int b) { return b ? a%b : a; } array nilperiod, nilperiod_edit; @@ -805,7 +806,7 @@ EX namespace nilv { heptagon *create_step(heptagon *parent, int d) override { auto p = coords[parent]; auto q = p * movevectors[d]; - for(int a=0; a<3; a++) if(nilperiod[a]) q[a] = gmod(q[a], nilperiod[a]); + for(int a=0; a<3; a++) q[a] = zgmod(q[a], nilperiod[a]); auto child = get_at(q); parent->c.connect(d, child, (d + nilv_S7/2) % nilv_S7, false); return child; @@ -857,6 +858,27 @@ EX namespace nilv { return nisot::translate(s0) * formula_exp(h * x); } +EX color_t colorize(cell *c, char whichCanvas) { + mvec at = ((hrmap_nil*)currentmap)->coords[c->master]; + color_t res = 0; + + auto setres = [&] (int z, color_t which) { + if(zgmod(at[2] - z, nilperiod[2]) == 0) res = which; + if(zgmod(at[2] - z-1, nilperiod[2]) == 0) res = which; + }; + + if(at[1] == 0 && at[0] >=0 && at[0] < 4) + setres(-at[0], gradient(0x1FF0000, 0x10000FF, 0, at[0], 4)); + else if(at[0] == 4 && at[1] >= 0 && at[1] < 4) + setres(at[1]*3-4, gradient(0x10000FF, 0x100FF00, 0, at[1], 4)); + else if(at[1] == 4 && at[0] >= 0 && at[0] <= 4) + setres(4+at[0], gradient(0x100FF00, 0x1FFFF00, 4, at[0], 0)); + else if(at[0] == 0 && at[1] >= 0 && at[1] <= 4) + setres(at[1], gradient(0x1FFFF00, 0x1FF0000, 4, at[1], 0)); + + return res; + } + EX void prepare_niltorus3() { nilperiod_edit = nilperiod; } diff --git a/pattern2.cpp b/pattern2.cpp index 1d9ef8b3..b9f04b00 100644 --- a/pattern2.cpp +++ b/pattern2.cpp @@ -1540,8 +1540,11 @@ EX namespace patterns { if(i != -1) return i; switch(whichCanvas) { #if CAP_CRYSTAL - case 'K': case '#': case '=': case 'O': - return crystal::colorize(c, whichCanvas); + case 'K': case '#': case '=': case 'O': case '/': + if(nil) + return nilv::colorize(c, whichCanvas); + else + return crystal::colorize(c, whichCanvas); #endif case 'A': #if CAP_ARCM @@ -1702,6 +1705,10 @@ EX namespace patterns { dialog::addSelItem(XLAT("Cage"), "Crystal", '#'); dialog::addSelItem(XLAT("Hyperplanes"), "Crystal", '='); dialog::addSelItem(XLAT("Honeycomb"), "Crystal", 'O'); + dialog::addSelItem(XLAT("Diagonal"), "Crystal", '/'); + } + if(nil) { + dialog::addSelItem(XLAT("Penrose staircase"), "Nil", '/'); } dialog::addSelItem(XLAT("sides"), "sides", 'B');