2 * Vertices in strip are numbered as follows:
4 * ___ X-2 ___ X-1 ___ 0 ___ 1 ___ 2 ___ 3 ___ 4 __
6 * / \ / \ / \ / \ / \ / \ / \
7 * / \ / \ / \ / \ / \ / \ / \
8 * X-3 ___ X-2 ___ X-1 ___ 0 ___ 1 ___ 2 ___ 3 ___ 4
9 * Y-2 Y-2 Y-2 1 1 1 1 1
10 * \ / \ / \ / \ / \ / \ / \ /
11 * \ / \ / \ / \ / \ / \ / \ /
12 * ___ X-3 ___ X-2 ___ X-1 ___ 0 ___ 1 ___ 2 ___ 3 __
15 * . . . . . . . . . . . . . . .
17 * X-4 ___ X-3 ___ X-2 ___ X-1 ___ 0 ___ 1 ___ 2 ___ 3
18 * 1 1 1 1 Y-2 Y-2 Y-2 Y-2
19 * \ / \ / \ / \ / \ / \ / \ /
20 * \ / \ / \ / \ / \ / \ / \ /
21 * ___ X-4 ___ X-3 ___ X-2 ___ X-1 ___ 0 ___ 1 ___ 2 __
25 * 0 <= x < X x = distance along
26 * 0 <= y < Y y = distance across
28 * Vertices are in reading order from diagram above ie x varies fastest.
30 * Y must be even. The actual location opposite (0,0) is (X-(Y-1)/2,0),
31 * and likewise opposite (0,Y-1) is ((Y-1)/2,0).
33 * We label edges as follows:
42 * (This numbering permits the order-4 nodes at the strip's edge
43 * to have a contiguous edge numbering 2..5 or 0..3.)
45 * When we iterate over edges, we iterate first over vertices and then
46 * over edges 0 to 2, disregarding edges 3 to 5.
57 /* vertex number: 0000 | y | x
64 #define Y1 (1 << YSHIFT)
65 #define YMASK (Y-1 << YSHIFT)
71 #define FOR_VERTEX(v) \
72 for ((v)=0; (v)<N; (v)++)
74 #define VE_MIN(v) ((v) & YMASK ? 0 : 2)
75 #define VE_MAX(v) (~(v) & YMASK ? V6 : 4)
77 #define FOR_VPEDGE(v,e) \
78 for ((e)=VE_MIN(v); (e)<VE_MAX(v); (e)++)
80 extern int edge_end2(unsigned v1, int e);
81 #define EDGE_END2 edge_end2
83 #define FOR_VEDGE(v1,e) \
85 if (((v2)= EDGE_END2((v1),(e))) < 0) ; else
87 #define FOR_EDGE(v1,e,v2) \
89 FOR_VEDGE((v1),(e),(v2))
91 #define FOR_COORD(k) \
92 for ((k)=0; (k)<D3; (k)++)
94 #define K FOR_COORD(k)