diff --git a/cell.cpp b/cell.cpp index c33b7cac..e641b766 100644 --- a/cell.cpp +++ b/cell.cpp @@ -1745,10 +1745,7 @@ EX bool is_boundary(cell *c) { /** compute the distlimit for a tessellation automatically */ EX int auto_compute_range(cell *c) { - if(sphere) { - cgi.base_distlimit = SEE_ALL; - return SEE_ALL; - } + if(sphere) return SEE_ALL; cgi.base_distlimit = 0; const int expected_count = 400; celllister cl(c, 1000, expected_count, NULL); @@ -1779,7 +1776,27 @@ EX int getDistLimit() { return res = hybrid::in_underlying_geometry([&] { return max(getDistLimit()-1, 0); }); - return ginf[geometry].distlimit[!BITRUNCATED]; + res = ginf[geometry].distlimit[!BITRUNCATED]; + if(GOLDBERG_INV) { + if(!cgi.gpdata) return res = 0; + println(hlog, "original = ", res); + using gp::param; + auto& scale = cgi.gpdata->scale; + if(S3 == 3) + res = (res + log(scale) / log(2.618)) / scale; + else + res = 3 * max(param.first, param.second) + 2 * min(param.first, param.second); + if(S7 == 12) + res = 2 * param.first + 2 * param.second + 1; + if(res > SEE_ALL) + res = SEE_ALL; + } + if(IRREGULAR) { + auto scale = irr::compute_scale(); + res = (res + log(scale) / log(2.618)) / scale; + if(res > 25) res = 25; + } + return res; } EX cell out_of_bounds; diff --git a/geometry.cpp b/geometry.cpp index 839944f9..862efc55 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -549,7 +549,7 @@ hpcshape transmatrix corners; transmatrix corners_for_triangle; transmatrix rotator; - ld alpha; + ld alpha, scale; int area; int pshid[3][8][GOLDBERG_LIMIT][GOLDBERG_LIMIT][8]; vector> id_to_params; diff --git a/goldberg.cpp b/goldberg.cpp index 17b49f70..3f5820db 100644 --- a/goldberg.cpp +++ b/goldberg.cpp @@ -708,7 +708,8 @@ EX namespace gp { else cgi.gpdata->area = x * x + y * y; next = point3(x+y/2., -y * sqrt(3) / 2, 0); - ld scale = 1 / hypot_d(2, next); + auto& scale = cgi.gpdata->scale; + scale = 1 / hypot_d(2, next); if(!GOLDBERG) scale = 1; if(special_fake()) scale = 1; cgi.crossf *= scale; @@ -718,14 +719,6 @@ EX namespace gp { // spin = spintox(next); // ispin = rspintox(next); cgi.gpdata->alpha = -atan2(next[1], next[0]) * 6 / S7; - if(S3 == 3) - cgi.base_distlimit = (cgi.base_distlimit + log(scale) / log(2.618)) / scale; - else - cgi.base_distlimit = 3 * max(param.first, param.second) + 2 * min(param.first, param.second); - if(S7 == 12) - cgi.base_distlimit = 2 * param.first + 2 * param.second + 1; - if(cgi.base_distlimit > SEE_ALL) - cgi.base_distlimit = SEE_ALL; DEBB(DF_GEOM | DF_POLY, ("scale = ", scale)); } } diff --git a/irregular.cpp b/irregular.cpp index a0516753..0a7912c3 100644 --- a/irregular.cpp +++ b/irregular.cpp @@ -476,15 +476,17 @@ bool step(int delta) { return false; } +EX ld compute_scale() { + return sqrt(isize(cells_of_heptagon) * 1. / isize(cells)); + } + EX void compute_geometry() { if(IRREGULAR) { - ld scale = sqrt(isize(cells_of_heptagon) * 1. / isize(cells)); + ld scale = compute_scale(); cgi.crossf *= scale; cgi.rhexf *= scale; cgi.hexhexdist *= scale; cgi.hexvdist *= scale; - cgi.base_distlimit = (cgi.base_distlimit + log(scale) / log(2.618)) / scale; - if(cgi.base_distlimit > 25) cgi.base_distlimit = 25; } }