/* ps.c - Don Yang (uguu.org) PostScript maze renderer. 07/14/01 */ #include #include"ps.h" #include"triangle.h" /* Local data */ static FILE *Output; /* Local functions */ static void PS_Edge(Triangle *triangle); static void PS_Goal(Triangle *triangle); static void PS_Header(Vertex *points); static void PS_Maze(Triangle *triangles); static void PS_Path(Triangle *triangle); static void PS_Solution(Triangle *triangles); /**************************************************************** RenderPS */ void RenderPS(Triangle *triangles, Vertex *points, FILE *output) { Output = output; PS_Header(points); PS_Maze(triangles); } /* RenderPS() */ /******************************************************** RenderPSComplete */ void RenderPSComplete(Triangle *triangles, Vertex *points, FILE *output) { Output = output; PS_Header(points); PS_Solution(triangles); PS_Maze(triangles); } /* RenderPSComplete() */ /***************************************************************** PS_Edge */ static void PS_Edge(Triangle *triangle) { if( triangle->flags & TRIANGLE_WALL1 ) { fprintf(Output, "%d %d e\n", triangle->v[Edge1[0]]->id, triangle->v[Edge2[0]]->id); } if( triangle->flags & TRIANGLE_WALL2 ) { fprintf(Output, "%d %d e\n", triangle->v[Edge1[1]]->id, triangle->v[Edge2[1]]->id); } if( triangle->flags & TRIANGLE_WALL3 ) { fprintf(Output, "%d %d e\n", triangle->v[Edge1[2]]->id, triangle->v[Edge2[2]]->id); } } /* PS_Edge() */ /***************************************************************** PS_Goal */ static void PS_Goal(Triangle *triangle) { if( triangle->flags & TRIANGLE_GOAL ) { fprintf(Output, "%d %d %d t\n", triangle->v[0]->id, triangle->v[1]->id, triangle->v[2]->id); } } /* PS_Goal() */ /*************************************************************** PS_Header */ static void PS_Header(Vertex *points) { Vertex *v; /* Header */ fputs( "%!PS-Adobe-2.0\n" "% Header / functions\n" "1 setlinecap 1 setlinejoin 1 setlinewidth\n" /* Index to coordinate converter */ "/i\n{\n" "\tdup x exch get\n" "\texch y exch get\n" "} def\n" /* Draw edge */ "/e\n{\n" "\tnewpath\n" "\ti moveto\n" "\ti lineto\n" "\tstroke\n" "} def\n" /* Draw triangle */ "/t\n{\n" "\tnewpath\n" "\ti moveto\n" "\ti lineto\n" "\ti lineto\n" "\tclosepath fill\n" "} def\n", Output); /* Write used vertices */ AssignVertexID(points); /* (triangle.c)*/ fputs("\n% Vertices\n/x [\n", Output); for(v = points; v; v = v->next) { if( v->id >= 0 ) fprintf(Output, "%g\n", v->x); } fputs("] def\n/y [\n", Output); for(v = points; v; v = v->next) { if( v->id >= 0 ) fprintf(Output, "%g\n", v->y); } fputs("] def\n", Output); } /* PS_Header() */ /***************************************************************** PS_Maze */ static void PS_Maze(Triangle *triangles) { /* Draw edges */ fputs("\n% Maze\n0 setgray\n", Output); Apply(triangles, PS_Edge); /* (triangle.c) */ /* Goal */ fputs("\n% Goal\n1 0 0 setrgbcolor\n", Output); Apply(triangles, PS_Goal); (void)fputs("showpage\n", Output); } /* PS_Maze() */ /***************************************************************** PS_Path */ static void PS_Path(Triangle *triangle) { if( (triangle->flags & TRIANGLE_PATH) && !(triangle->flags & TRIANGLE_GOAL) ) { fprintf(Output, "%d %d %d t\n", triangle->v[0]->id, triangle->v[1]->id, triangle->v[2]->id); } } /* PS_Path() */ /************************************************************* PS_Solution */ static void PS_Solution(Triangle *triangles) { /* Draw solution path */ fputs("\n% Solution\n0.65 0.85 1 setrgbcolor\n", Output); Apply(triangles, PS_Path); /* (triangle.c) */ } /* PS_Solution() */