* / \
* 4/ 5\
*
- * vertex number: 0000 | y | x
- * YBITS XBITS
+ * vertex number: 0000 | y | x
+ * (YBITS) XBITS
*/
#ifndef MGRAPH_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 Y ((1<<YBITS) - 1)
+#define YMASK (Y << YSHIFT)
#else
-#define XBITS (DEFBITS / 10)
-#define YBITS (DEFBITS % 10)
+#define XBITS (DEFSZ % 10)
+#define Y ((DEFSZ / 10)*2+1)
#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 YMASK (Y << YSHIFT)
#define V6 6
+#define V3 3
#define FOR_VERTEX(v) \
for ((v)=0; (v)<N; (v)++)
-#define FOR_VPEDGE(v,e) \
+#define FOR_VPEDGE(e) \
for ((e)=0; (e)<V6; (e)++)
int edge_end2(unsigned v1, int e);
#define EDGE_END2 edge_end2
-/* 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);
-#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) \
- FOR_VPEDGE((v1),(e)) \
+ FOR_VPEDGE((e)) \
if (((v2)= EDGE_END2((v1),(e)), \
(init), \
(v2)) < 0) { otherwise; } else
for ((vy)=0; (vy)<Y; (vy)+=Y-1) \
for ((vx)=0; (v)= (vy)<<YSHIFT | (vx), (vx)<X; (vx)++)
+int vertices_span_join_p(int v0, int v1);
+
typedef double Vertices[N][D3];
struct Vertices { Vertices a; };