From fedb170b55f6e9162b3374217a788f5911d4dc5d Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Thu, 5 Sep 2019 09:56:49 +0200 Subject: [PATCH] struct fpattern exported --- fieldpattern.cpp | 900 ++++++++++++++++++++++++----------------------- 1 file changed, 459 insertions(+), 441 deletions(-) diff --git a/fieldpattern.cpp b/fieldpattern.cpp index 5863a9f0..66f686cc 100644 --- a/fieldpattern.cpp +++ b/fieldpattern.cpp @@ -31,41 +31,45 @@ struct fgeomextra { extern int subpathid; extern int subpathorder; -#define MWDIM (prod ? 3 : WDIM+1) - bool isprime(int n) { for(int k=2; k3) break; - Field = pw==1? Prime : Prime*Prime; - - if(pw == 2) { - for(wsquare=1; wsquare sqrts(Prime, 0); - for(int k=1-Prime; k sqrts(Field); - for(int k=0; k markers; + + int getdist(pair a, vector& dists); + int getdist(pair a, pair b); + int dijkstra(vector& dists, vector indist[MAXDIST]); + void analyze(); - int getdist(pair a, vector& dists) { - if(!a.second) return dists[a.first]; - int m = MAXDIST; - int ma = dists[a.first]; - int mb = dists[connections[btspin(a.first, 3)]]; - int mc = dists[connections[btspin(a.first, 4)]]; - m = min(m, 1 + ma); - m = min(m, 1 + mb); - m = min(m, 1 + mc); - if(m <= 2 && ma+mb+mc <= m*3-2) return m-1; // special case - m = min(m, 2 + dists[connections[btspin(a.first, 2)]]); - m = min(m, 2 + dists[connections[btspin(a.first, 5)]]); - m = min(m, 2 + dists[connections[btspin(connections[btspin(a.first, 3)], 5)]]); - return m; - } - - int getdist(pair a, pair b) { - if(a.first == b.first) return a.second == b.second ? 0 : 1; - if(b.first) a.first = gmul(a.first, inverses[b.first]), b.first = 0; - return getdist(a, b.second ? disthex : disthep); - } - int maxdist, otherpole, circrad, wallid, wallorder, riverid; - int dijkstra(vector& dists, vector indist[MAXDIST]) { - int N = connections.size(); - dists.resize(N); - for(int i=0; i indist[MAXDIST]; - - indist[0].push_back(0); - int md0 = dijkstra(disthep, indist); - - indist[1].push_back(0); - indist[1].push_back(connections[3]); - indist[1].push_back(connections[4]); - indist[2].push_back(connections[btspin(connections[3], 5)]); - indist[2].push_back(connections[2]); - indist[2].push_back(connections[5]); - int md1 = dijkstra(disthex, indist); - - maxdist = max(md0, md1); - - otherpole = 0; - - for(int i=0; i disthep[otherpole]) otherpole = i; - // for(int r=0; r3) break; + Field = pw==1? Prime : Prime*Prime; + + if(pw == 2) { + for(wsquare=1; wsquare sqrts(Prime, 0); + for(int k=1-Prime; k sqrts(Field); + for(int k=0; k a, vector& dists) { + if(!a.second) return dists[a.first]; + int m = MAXDIST; + int ma = dists[a.first]; + int mb = dists[connections[btspin(a.first, 3)]]; + int mc = dists[connections[btspin(a.first, 4)]]; + m = min(m, 1 + ma); + m = min(m, 1 + mb); + m = min(m, 1 + mc); + if(m <= 2 && ma+mb+mc <= m*3-2) return m-1; // special case + m = min(m, 2 + dists[connections[btspin(a.first, 2)]]); + m = min(m, 2 + dists[connections[btspin(a.first, 5)]]); + m = min(m, 2 + dists[connections[btspin(connections[btspin(a.first, 3)], 5)]]); + return m; + } + +int fpattern::getdist(pair a, pair b) { + if(a.first == b.first) return a.second == b.second ? 0 : 1; + if(b.first) a.first = gmul(a.first, inverses[b.first]), b.first = 0; + return getdist(a, b.second ? disthex : disthep); + } + +int fpattern::dijkstra(vector& dists, vector indist[MAXDIST]) { + int N = connections.size(); + dists.resize(N); + for(int i=0; i indist[MAXDIST]; + + indist[0].push_back(0); + int md0 = dijkstra(disthep, indist); + + indist[1].push_back(0); + indist[1].push_back(connections[3]); + indist[1].push_back(connections[4]); + indist[2].push_back(connections[btspin(connections[3], 5)]); + indist[2].push_back(connections[2]); + indist[2].push_back(connections[5]); + int md1 = dijkstra(disthex, indist); + + maxdist = max(md0, md1); + + otherpole = 0; + + for(int i=0; i disthep[otherpole]) otherpole = i; + // for(int r=0; r