|
|
researchv10 Norman
/* Map-plotting functions for PostScript */
#include "plot.h"
static double _a,_b,_c,_d, _ox, _oy;
static int anystroke = 0;
static char *fontname = "/Times-Roman";
static int fontsize = 10;
#define xs(_x) (_ox = _a*(_x)+_b)
#define ys(_y) (_oy = _c*(_y)+_d)
void
space(int xmin, int ymin, int xmax, int ymax)
{
_a = 6.5*72/(xmax-xmin);
_b = -_a*xmin + 1.0*72;
_c = 6.5*72/(ymax-ymin);
_d = -_c*ymin + 3.5*72;
}
/* open the plotting output */
void
erase(void)
{
printf("%%!PS\n"
"%%Creator: map\n"
"%%BoundingBox: 72 252 540 720\n"
"%%EndComments\n"
"/m /moveto load def\n"
"/s /stroke load def\n"
"/t {moveto show} bind def\n"
"/v /lineto load def\n"
"%%EndProlog\n"
"gsave\n"
"/Helvetica findfont 10 scalefont setfont\n"
"1 setlinecap\n"
"1 setlinejoin\n"
".5 setlinewidth\n");
printf("%s findfont\n"
"/scale %d def\n"
"scale scalefont\n"
"setfont\n", fontname, fontsize);
printf("newpath\n"
"72 72 m\n");
anystroke = 1;
}
/* close the plotting output */
void
closepl(void)
{
printf("showpage\ngrestore\n");
}
/* make sure the page or screen is clear */
void
openpl(void)
{
anystroke = 0;
}
/* plot a point at _x,_y, which becomes current */
void
point(int _x, int _y)
{
move(_x, _y);
cont(_x, _y);
}
/* place text, first letter at current point, which does not change */
void
label(char *_s)
{
if(anystroke)
printf("s\n");
printf("(%s) %.1f %.1f scale .3 mul sub t\n",_s,_ox,_oy);
anystroke = 0;
}
/* draw line from current point to _x,_y, which becomes current */
void
cont(int _x, int _y)
{
printf("%.1f %.1f v\n", xs(_x),ys(_y));
anystroke = 1;
}
/* _x,_y becomes current point */
void
move(int _x, int _y)
{
if(anystroke)
printf("s\n");
printf("%.1f %.1f m\n", xs(_x), ys(_y));
anystroke = 1;
}
struct dashpat {
char *name;
char *pat;
double width;
} pattern[] = {
"solid", "[] 0", 0.5,
"dotted", "[3 6] 0", 0,
"dotdash", "[18 6 3 6] 0", .5,
};
/* specify style for drawing lines: "dotted", "solid", "dotdash" */
void
linemod(char *s)
{
int i;
for(i=0; i<sizeof(pattern)/sizeof(*pattern); i++)
if(strcmp(s,pattern[i].name) == 0)
break;
if(i >= sizeof(pattern)/sizeof(*pattern))
i = 0;
if(anystroke)
printf("s\n");
printf("%f setlinewidth\n%s setdash\n",
pattern[i].width, pattern[i].pat);
anystroke = 0;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.