chiark / gitweb /
show title
[moebius2.git] / mgraph.c
1 /*
2  * Graph topology
3  */
4
5 #include "mgraph.h"
6
7 static const unsigned dx[2][V6]= {{  +1,   0,  -1,  -1,  -1,   0  },
8                                   {  +1,  +1,   0,  -1,   0,  +1  }},
9                       dy[V6]=     {   0, -Y1, -Y1,   0, +Y1, +Y1  };
10
11 static int edge_end2(unsigned v1, int e) {
12   unsigned x, y;
13
14   y= (v1 & ~XMASK) + dy[e];
15   if (y >= Y*Y1) return -1;
16
17   x= (v1 & XMASK) + dx[(v1 >> YSHIFT) & 1][e];
18   if (x & ~XMASK) {
19     //int orgy= y;
20     y= (Y-1)*Y1 - y;
21     x &= XMASK;;
22     //printf("%40s %02x -%d-> %02x  (was %02x) \n", "", v1, e, x|y, x|orgy);
23   }
24   
25   return x | y;
26 }
27
28 short edge_end2_memo[N][V6];
29
30 void mgraph_prepare(void) {
31   int v, e;
32   FOR_VERTEX(v, INNER)
33     FOR_VPEDGE(e)
34       edge_end2_memo[v][e]= edge_end2(v,e);
35 }
36
37 static const unsigned reverse[2][V6]= {{ 3, 4, 5, 0, 1, 2 },
38                                        { 3, 2, 1, 0, 5, 4 }};
39
40 int edge_reverse(int v1, int e) {
41   unsigned x2;
42   int flip, eprime;
43
44   x2= (v1 & XMASK) + dx[(v1 >> YSHIFT) & 1][e];
45   flip= !!(x2 & ~XMASK);
46   eprime= reverse[flip][e];
47 //  printf("%60s %02x -%d->,<-%d- (%02x) [x2=%x flip=%d]\n","",
48 //       v1,e,eprime, EDGE_END2(v1,e), x2,flip);
49   return eprime;
50 }
51
52 int vertices_span_join_p(int v0, int v1) {
53   int v0x= v0 & XMASK;
54   int v1x= v1 & XMASK;
55   int diff= v0x-v1x;
56   return diff < -2 || diff > 2;
57 }