X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;ds=sidebyside;f=mgraph.c;h=1e9cef0786e16c3fc6cafa464dfa4e67cb1922e8;hb=7f93208fa022d3c9f925f48e5469793bc3612b61;hp=cf57624262ae1c00224f6566cc112a81e6f50fb6;hpb=70df58c53bdd2c2b0de6a93e6c7c480730e6732a;p=moebius2.git diff --git a/mgraph.c b/mgraph.c index cf57624..1e9cef0 100644 --- a/mgraph.c +++ b/mgraph.c @@ -4,19 +4,54 @@ #include "mgraph.h" -static const unsigned dx[V6]= { +1, +1, 0, -1, -1, 0 }, - dy[V6]= { 0, -Y1, -Y1, 0, +Y1, +Y1 }; +static const unsigned dx[2][V6]= {{ +1, 0, -1, -1, -1, 0 }, + { +1, +1, 0, -1, 0, +1 }}, + dy[V6]= { 0, -Y1, -Y1, 0, +Y1, +Y1 }; -int edge_end2(unsigned v1, int e) { +static int edge_end2(unsigned v1, int e) { unsigned x, y; - y= (v1 & YMASK) + dy[e]; - if (y & ~YMASK) return -1; + y= (v1 & ~XMASK) + dy[e]; + if (y >= Y*Y1) return -1; - x= (v1 & XMASK) + dx[e]; + x= (v1 & XMASK) + dx[(v1 >> YSHIFT) & 1][e]; if (x & ~XMASK) { + //int orgy= y; y= (Y-1)*Y1 - y; x &= XMASK;; + //printf("%40s %02x -%d-> %02x (was %02x) \n", "", v1, e, x|y, x|orgy); } + return x | y; } + +short edge_end2_memo[N][V6]; + +void mgraph_prepare(void) { + int v, e; + FOR_VERTEX(v, INNER) + FOR_VPEDGE(e) + edge_end2_memo[v][e]= edge_end2(v,e); +} + +static const unsigned reverse[2][V6]= {{ 3, 4, 5, 0, 1, 2 }, + { 3, 2, 1, 0, 5, 4 }}; + +int edge_reverse(int v1, int e) { + unsigned x2; + int flip, eprime; + + x2= (v1 & XMASK) + dx[(v1 >> YSHIFT) & 1][e]; + flip= !!(x2 & ~XMASK); + eprime= reverse[flip][e]; +// printf("%60s %02x -%d->,<-%d- (%02x) [x2=%x flip=%d]\n","", +// v1,e,eprime, EDGE_END2(v1,e), x2,flip); + return eprime; +} + +int vertices_span_join_p(int v0, int v1) { + int v0x= v0 & XMASK; + int v1x= v1 & XMASK; + int diff= v0x-v1x; + return diff < -2 || diff > 2; +}