From 3f2bb8f6bd0c084bfeb2a22ced46e1feed7110fb Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sun, 23 Feb 2025 20:54:23 +0100 Subject: [PATCH] rogueviz::fundamental:: now works with valences greater than 3 --- rogueviz/fundamental.cpp | 44 +++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/rogueviz/fundamental.cpp b/rogueviz/fundamental.cpp index 7df03890..0cb6ed4c 100644 --- a/rogueviz/fundamental.cpp +++ b/rogueviz/fundamental.cpp @@ -59,6 +59,21 @@ shiftmatrix labelpos(shiftpoint h1, shiftpoint h2) { ld widthfactor = 5; ld label_scale = 1; +bool single_edges = false; +bool fill_faces = true; + +int group_count(cellwalker cw) { + if(is_connected(cw)) return 0; + auto cw1 = cw; + int groups = 0; + do { + if(!is_connected(cw1)) groups++; + cw1 = cw1 + wstep - 1; + } + while(cw1 != cw); + return groups; + } + void fundamental_marker() { if(!funmode || !quotient) return; same.clear(); @@ -86,15 +101,15 @@ void fundamental_marker() { } } - while(true) { + while(fill_faces) { int f = face_edges; for(int k=0; ktype; i++) { cellwalker cw(c, i); - if(is_connected(cw) && is_connected(cw+1) && !is_connected(cw+wstep-1)) { + if(group_count(cw) == 1) { face_edges++; - be_connected(cw+wstep-1); + be_connected(cw); } } } @@ -109,29 +124,33 @@ void fundamental_marker() { cell *c = cells[k]; for(int i=0; itype; i++) { cellwalker cw0(c, i); - if(!is_connected(cw0) && !is_connected(cw0+1) && !is_connected(cw0+wstep-1)) - corners++, cw = cw0; + if(single_edges) { + if(!is_connected(cw0)) corners++, cw = cw0; + } + else { + if(group_count(cw0) >= 3) corners++, cw = cw0; + } } } + + if(!corners) return; // printf("tree edges = %d, face edges = %d, corners = %d\n", tree_edges, face_edges, corners); vector cornerlist; map corner_id; - + for(int ci=0; ci= 3) break; } } auto corners0 = corners; @@ -200,6 +219,7 @@ void fundamental_marker() { auto cw = cornerlist[ci]; cellwalker cw1 = (cw+1+wstep); bool mirrored = false; + while(is_connected(cw1)) cw1 = cw1 + 1 + wstep; if(!corner_id.count(cw1)) cw1 = cw1 + wmirror - 1, mirrored = true; if(!corner_id.count(cw1)) println(hlog, "still bad"); auto ci1 = corner_id[cw1];