chiark / gitweb /
better with more bendingness costs
[moebius2.git] / mgraph.h
index e98fa850a53658bacf17ff452d03d2341c89afa9..63fd5dca82ae60e4a78d865bcbb3cdad71a04527 100644 (file)
--- a/mgraph.h
+++ b/mgraph.h
@@ -60,8 +60,8 @@
  *                  /  \
  *                4/   5\
  *
  *                  /  \
  *                4/   5\
  *
- * vertex number:   0000 | y     | x
- *                        YBITS   XBITS
+ * vertex number:   0000 | y      | x
+ *                        (YBITS)   XBITS
  */
 
 #ifndef MGRAPH_H
  */
 
 #ifndef MGRAPH_H
 
 #include "common.h"
 
 
 #include "common.h"
 
-#ifndef DEFBITS
+#ifndef DEFSZ /* DEFSZ may be (Y/2-1)*10 + XBITS ie Y is 2*<tens>+1 */
 #define XBITS 3
 #define YBITS 3
 #define XBITS 3
 #define YBITS 3
+#define Y ((1<<YBITS) - 1)
+#define YMASK (Y << YSHIFT)
 #else
 #else
-#define XBITS (DEFBITS / 10)
-#define YBITS (DEFBITS % 10)
+#define XBITS  (DEFSZ % 10)
+#define Y      ((DEFSZ / 10)*2+1)
 #endif
 
 #define X (1<<XBITS)
 #endif
 
 #define X (1<<XBITS)
-#define Y ((1<<YBITS) - 1)
 
 #define N (X*Y)
 #define XMASK (X-1)
 #define YSHIFT XBITS
 #define Y1 (1 << YSHIFT)
 
 #define N (X*Y)
 #define XMASK (X-1)
 #define YSHIFT XBITS
 #define Y1 (1 << YSHIFT)
-#define YMASK (Y << YSHIFT)
 
 #define V6 6
 
 #define V6 6
+#define V3 3
+
 
 
-#define FOR_VERTEX(v) \
-  for ((v)=0; (v)<N; (v)++)
+/* Loop constructors are macros of the form
+ *    LOOP(v,zero,n, precomp)
+ * which work much like this one:
+ */
+#define INNER(v,zero,n, precomp)  \
+  for ((v)=(zero); precomp, (v)<(n); (v)++)
 
 
-#define FOR_VPEDGE(v,e) \
+#define FOR_VERTEX(v,loop) \
+  loop ((v), 0, N, NOTHING)
+
+#define FOR_VPEDGE(e) \
   for ((e)=0; (e)<V6; (e)++)
 
   for ((e)=0; (e)<V6; (e)++)
 
-int edge_end2(unsigned v1, int e);
-#define EDGE_END2 edge_end2
+extern short edge_end2_memo[][V6];
+#define EDGE_END2(v1,e) edge_end2_memo[v1][e]
 
 
-/* given v1,e  s.t.  v2==EDGE_END2(v1,e) >= 0,
- * returns  eprime s.t. v1==EDGE_END2(v2,eprime) */
+/* given    v1,e     s.t.  v2==EDGE_END2(v1,e) >= 0,
+ * returns  eprime   s.t.  v1==EDGE_END2(v2,eprime) */
 int edge_reverse(int v1, int e);
 
 int edge_reverse(int v1, int e);
 
-#define RIM_VERTEX_P(v) (((v) & YMASK) == 0 || ((v) & YMASK) == (Y-1)*Y1)
+#define EDGE_OPPOSITE(e) (((e)+V3) % V6)
+
+#define RIM_VERTEX_P(v) (((v) & ~XMASK) == 0 || ((v) & ~XMASK) == (Y-1)*Y1)
 
 #define FOR_VEDGE_X(v1,e,v2,init,otherwise)    \
 
 #define FOR_VEDGE_X(v1,e,v2,init,otherwise)    \
-  FOR_VPEDGE((v1),(e))                         \
+  FOR_VPEDGE((e))                              \
     if (((v2)= EDGE_END2((v1),(e)),            \
         (init),                                \
         (v2)) < 0) { otherwise; } else
     if (((v2)= EDGE_END2((v1),(e)),            \
         (init),                                \
         (v2)) < 0) { otherwise; } else
@@ -114,15 +125,22 @@ int edge_reverse(int v1, int e);
 #define FOR_VEDGE(v1,e,v2)                     \
   FOR_VEDGE_X(v1,e,v2,NOTHING,NOTHING)
 
 #define FOR_VEDGE(v1,e,v2)                     \
   FOR_VEDGE_X(v1,e,v2,NOTHING,NOTHING)
 
-#define FOR_EDGE(v1,e,v2)                      \
-  FOR_VERTEX((v1))                             \
+#define FOR_EDGE(v1,e,v2, loop)                        \
+  FOR_VERTEX((v1), loop)                       \
     FOR_VEDGE((v1),(e),(v2))
 
     FOR_VEDGE((v1),(e),(v2))
 
-#define FOR_RIM_VERTEX(vy,vx,v)                                        \
-  for ((vy)=0; (vy)<Y; (vy)+=Y-1)                              \
-    for ((vx)=0; (v)= (vy)<<YSHIFT | (vx), (vx)<X; (vx)++)
+#define FOR_NEAR_RIM_VERTEX(vy,vx,v, disttorim, loop)          \
+  for ((vy)=(disttorim); (vy)<Y; (vy)+=Y-1-2*(disttorim))      \
+    loop ((vx), 0, X, (v)= (vy)<<YSHIFT | (vx))
+
+#define FOR_RIM_VERTEX(vy,vx,v, loop)          \
+  FOR_NEAR_RIM_VERTEX((vy),(vx),(v), 0, loop)
+
+int vertices_span_join_p(int v0, int v1);
 
 typedef double Vertices[N][D3];
 struct Vertices { Vertices a; };
 
 
 typedef double Vertices[N][D3];
 struct Vertices { Vertices a; };
 
+void mgraph_prepare(void);
+
 #endif /*MGRAPH_H*/
 #endif /*MGRAPH_H*/