}
if (!freopen(argv[2],"rb",stdin)) diee("open input");
+
+ mgraph_prepare();
characterise_input();
read_input();
{ +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 & ~XMASK) + dy[e];
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 }};
#define FOR_VPEDGE(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) */
typedef double Vertices[N][D3];
struct Vertices { Vertices a; };
+void mgraph_prepare(void);
+
#endif /*MGRAPH_H*/
r= sigaction(SIGINT,&sa,0);
if (r) diee("sigaction SIGINT");
+ mgraph_prepare();
graph_layout_prepare();
printing_init();
energy_init();
errno= 0; r= fread(&in,sizeof(in),1,stdin);
if (r!=1) diee("fread");
+ mgraph_prepare();
blank_outvertices();
compute_outvertices();
transform_outvertices();
if (argc!=1) { fputs("need no args\n",stderr); exit(8); }
+ mgraph_prepare();
+
printf("%d %d %d %d %d\n%%-%d.%dg\n",
X*Y, N, X, Y, D3,
prec+5,prec);
struct pollfd *polls=0;
int motion_deferred=0, motion_x=-1, motion_y=-1;
+ mgraph_prepare();
topocheck();
if (argc==1) { printf("topology self-consistent, ok\n"); exit(0); }