diff --git a/euclid.cpp b/euclid.cpp index 46c6cbb3..90f78b45 100644 --- a/euclid.cpp +++ b/euclid.cpp @@ -429,6 +429,27 @@ EX namespace euclid3 { if(T0[2][0] != T0[2][2]) return false; return true; } + + EX intmatrix make_third_turn(int a, int b, int c) { + intmatrix T0; + T0[0][0] = a; + T0[0][1] = b; + T0[2][0] = c; + T0[0][2] = -T0[0][0]-T0[0][1]; + T0[1][0] = T0[0][1]; + T0[1][1] = T0[0][2]; + T0[1][2] = T0[0][0]; + T0[2][1] = T0[2][2] = c; + return T0; + } + + EX intmatrix make_quarter_turn(int a, int b, int c) { + intmatrix T0 = make_array (euzero, euzero, euzero); + T0[0][0] = a; + T0[0][1] = b; + T0[2][0] = c; + return T0; + } EX void build_torus3(eGeometry g) { @@ -489,6 +510,9 @@ EX namespace euclid3 { if(dim == 3) { if(valid_third_turn(T0)) { twisted &= 16; + if(g == gRhombic3 && (T0[2][2]&1)) twisted = 0; + if(g == gBitrunc3 && (T0[0][0]&1)) twisted = 0; + if(g == gBitrunc3 && (T0[1][1]&1)) twisted = 0; } else { twisted &= 7; @@ -706,6 +730,7 @@ EX namespace euclid3 { void torus_config_option(string name, char key, torus_config tc) { dialog::addBoolItem(name, make_pair(T_edit, twisted_edit) == tc && PURE, key); dialog::add_action([tc] { + stop_game(); tie(euclid3::T0, euclid3::twisted0) = tc; tie(T_edit, twisted_edit) = tc; set_variation(eVariation::pure); @@ -734,8 +759,20 @@ EX namespace euclid3 { for(int j=0; j