Showing the changes to sys/src/cmd/plot/libplot (35 of 7733 files). Show all
Unified · Split
| @@ -0,0 +1,8 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void box(double x0, double y0, double x1, double y1){ | ||
| 3 | move(x0, y0); | ||
| 4 | vec(x0, y1); | ||
| 5 | vec(x1, y1); | ||
| 6 | vec(x1, y0); | ||
| 7 | vec(x0, y0); | ||
| 8 | } | ||
| @@ -0,0 +1,5 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void cfill(char *s){ | ||
| 3 | int k=bcolor(s); | ||
| 4 | if(k>=0) e1->backgr=k; | ||
| 5 | } | ||
| @@ -0,0 +1,12 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void circ(double xc, double yc, double r){ | ||
| 3 | Point p; | ||
| 4 | int rad; | ||
| 5 | p.x=SCX(xc); | ||
| 6 | p.y=SCY(yc); | ||
| 7 | if (r < 0) | ||
| 8 | rad=SCR(-r); | ||
| 9 | else | ||
| 10 | rad=SCR(r); | ||
| 11 | ellipse(screen, p, rad, rad, 0, getcolor(e1->foregr), ZP); | ||
| 12 | } | ||
| @@ -0,0 +1,4 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void closepl(void){ | ||
| 3 | m_finish(); | ||
| 4 | } | ||
| @@ -0,0 +1,4 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void color(char *s){ | ||
| 3 | e1->foregr=bcolor(s); | ||
| 4 | } | ||
| @@ -0,0 +1,12 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void plotdisc(double xc, double yc, double r){ | ||
| 3 | Point p; | ||
| 4 | int rad; | ||
| 5 | p.x=SCX(xc); | ||
| 6 | p.y=SCY(yc); | ||
| 7 | if (r < 0) | ||
| 8 | rad=SCR(-r); | ||
| 9 | else | ||
| 10 | rad=SCR(r); | ||
| 11 | fillellipse(screen, p, rad, rad, getcolor(e1->foregr), ZP); | ||
| 12 | } | ||
| @@ -0,0 +1,4 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void doublebuffer(void){ | ||
| 3 | m_dblbuf(); | ||
| 4 | } | ||
| @@ -0,0 +1,6 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void dpoint(double x, double y){ | ||
| 3 | draw(screen, Rect(SCX(x), SCY(y), SCX(x)+1, SCY(y)+1), getcolor(e1->foregr), | ||
| 4 | nil, ZP); | ||
| 5 | move(x, y); | ||
| 6 | } | ||
| @@ -0,0 +1,5 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void erase(void){ | ||
| 3 | m_swapbuf(); | ||
| 4 | m_clrwin(clipminx, clipminy, clipmaxx, clipmaxy, e1->backgr); | ||
| 5 | } | ||
| @@ -0,0 +1,167 @@ | |||
| 1 | /* | ||
| 2 | * fill -- polygon tiler | ||
| 3 | * Updating the edgelist from scanline to scanline could be quicker if no | ||
| 4 | * edges cross: we can just merge the incoming edges. If the scan-line | ||
| 5 | * filling routine were a parameter, we could do textured | ||
| 6 | * polygons, polyblt, and other such stuff. | ||
| 7 | */ | ||
| 8 | #include "mplot.h" | ||
| 9 | typedef enum{ | ||
| 10 | Odd=1, | ||
| 11 | Nonzero=~0 | ||
| 12 | }Windrule; | ||
| 13 | typedef struct edge Edge; | ||
| 14 | struct edge{ | ||
| 15 | Point p; /* point of crossing current scan-line */ | ||
| 16 | int maxy; /* scan line at which to discard edge */ | ||
| 17 | int dx; /* x increment if x fraction<1 */ | ||
| 18 | int dx1; /* x increment if x fraction>=1 */ | ||
| 19 | int x; /* x fraction, scaled by den */ | ||
| 20 | int num; /* x fraction increment for unit y change, scaled by den */ | ||
| 21 | int den; /* x fraction increment for unit x change, scaled by num */ | ||
| 22 | int dwind; /* increment of winding number on passing this edge */ | ||
| 23 | Edge *next; /* next edge on current scanline */ | ||
| 24 | Edge *prev; /* previous edge on current scanline */ | ||
| 25 | }; | ||
| 26 | static void insert(Edge *ep, Edge **yp){ | ||
| 27 | while(*yp && (*yp)->p.x<ep->p.x) yp=&(*yp)->next; | ||
| 28 | ep->next=*yp; | ||
| 29 | *yp=ep; | ||
| 30 | if(ep->next){ | ||
| 31 | ep->prev=ep->next->prev; | ||
| 32 | ep->next->prev=ep; | ||
| 33 | if(ep->prev) | ||
| 34 | ep->prev->next=ep; | ||
| 35 | } | ||
| 36 | else | ||
| 37 | ep->prev=0; | ||
| 38 | } | ||
| 39 | static void polygon(int cnt[], double *pts[], Windrule w, int v){ | ||
| 40 | Edge *edges, *ep, *nextep, **ylist, **eylist, **yp; | ||
| 41 | Point p, q, p0, p1, p10; | ||
| 42 | int i, dy, nbig, y, left, right, wind, nwind, nvert; | ||
| 43 | int *cntp; | ||
| 44 | double **ptsp, *xp; | ||
| 45 | nvert=0; | ||
| 46 | for(cntp=cnt;*cntp;cntp++) nvert+=*cntp; | ||
| 47 | edges=(Edge *)malloc(nvert*sizeof(Edge)); | ||
| 48 | if(edges==0){ | ||
| 49 | NoSpace: | ||
| 50 | fprintf(stderr, "polygon: no space\n"); | ||
| 51 | exits("malloc failed"); | ||
| 52 | } | ||
| 53 | ylist=(Edge **)malloc(Dy(screen->r)*sizeof(Edge *)); | ||
| 54 | if(ylist==0) goto NoSpace; | ||
| 55 | eylist=ylist+Dy(screen->r); | ||
| 56 | for(yp=ylist;yp!=eylist;yp++) *yp=0; | ||
| 57 | ep=edges; | ||
| 58 | for(cntp=cnt,ptsp=pts;*cntp;cntp++,ptsp++){ | ||
| 59 | p.x=SCX((*ptsp)[*cntp*2-2]); | ||
| 60 | p.y=SCY((*ptsp)[*cntp*2-1]); | ||
| 61 | nvert=*cntp; | ||
| 62 | for(xp=*ptsp,i=0;i!=nvert;xp+=2,i++){ | ||
| 63 | q=p; | ||
| 64 | p.x=SCX(xp[0]); | ||
| 65 | p.y=SCY(xp[1]); | ||
| 66 | if(p.y==q.y) continue; | ||
| 67 | if(p.y<q.y){ | ||
| 68 | p0=p; | ||
| 69 | p1=q; | ||
| 70 | ep->dwind=1; | ||
| 71 | } | ||
| 72 | else{ | ||
| 73 | p0=q; | ||
| 74 | p1=p; | ||
| 75 | ep->dwind=-1; | ||
| 76 | } | ||
| 77 | if(p1.y<=screen->r.min.y) continue; | ||
| 78 | if(p0.y>=screen->r.max.y) continue; | ||
| 79 | ep->p=p0; | ||
| 80 | if(p1.y>screen->r.max.y) | ||
| 81 | ep->maxy=screen->r.max.y; | ||
| 82 | else | ||
| 83 | ep->maxy=p1.y; | ||
| 84 | p10=subpt(p1, p0); | ||
| 85 | if(p10.x>=0){ | ||
| 86 | ep->dx=p10.x/p10.y; | ||
| 87 | ep->dx1=ep->dx+1; | ||
| 88 | } | ||
| 89 | else{ | ||
| 90 | p10.x=-p10.x; | ||
| 91 | ep->dx=-(p10.x/p10.y); /* this nonsense rounds toward zero */ | ||
| 92 | ep->dx1=ep->dx-1; | ||
| 93 | } | ||
| 94 | ep->x=0; | ||
| 95 | ep->num=p10.x%p10.y; | ||
| 96 | ep->den=p10.y; | ||
| 97 | if(ep->p.y<screen->r.min.y){ | ||
| 98 | dy=screen->r.min.y-ep->p.y; | ||
| 99 | ep->x+=dy*ep->num; | ||
| 100 | nbig=ep->x/ep->den; | ||
| 101 | ep->p.x+=ep->dx1*nbig+ep->dx*(dy-nbig); | ||
| 102 | ep->x%=ep->den; | ||
| 103 | ep->p.y=screen->r.min.y; | ||
| 104 | } | ||
| 105 | insert(ep, ylist+(ep->p.y-screen->r.min.y)); | ||
| 106 | ep++; | ||
| 107 | } | ||
| 108 | } | ||
| 109 | left = 0; | ||
| 110 | for(yp=ylist,y=screen->r.min.y;yp!=eylist;yp++,y++){ | ||
| 111 | wind=0; | ||
| 112 | for(ep=*yp;ep;ep=nextep){ | ||
| 113 | nwind=wind+ep->dwind; | ||
| 114 | if(nwind&w){ /* inside */ | ||
| 115 | if(!(wind&w)){ | ||
| 116 | left=ep->p.x; | ||
| 117 | if(left<screen->r.min.x) left=screen->r.min.x; | ||
| 118 | } | ||
| 119 | } | ||
| 120 | else if(wind&w){ | ||
| 121 | right=ep->p.x; | ||
| 122 | if(right>=screen->r.max.x) right=screen->r.max.x; | ||
| 123 | #define BART_BUG_FIXED /* what goes on here?? -rob */ | ||
| 124 | #ifdef BART_BUG_FIXED | ||
| 125 | if(right>left) | ||
| 126 | line(screen, Pt(left, y), Pt(right, y), Endsquare, Endsquare, 0, getcolor(v), ZP); | ||
| 127 | #else | ||
| 128 | if(right>left){ | ||
| 129 | switch(v){ | ||
| 130 | default: | ||
| 131 | segment(&screen, Pt(left, y), Pt(right, y), | ||
| 132 | ~0, D&~S); | ||
| 133 | segment(&screen, Pt(left, y), Pt(right, y), | ||
| 134 | v, f); | ||
| 135 | break; | ||
| 136 | case 0: | ||
| 137 | segment(&screen, Pt(left, y), Pt(right, y), | ||
| 138 | ~0, D&~S); | ||
| 139 | break; | ||
| 140 | case 3: | ||
| 141 | segment(&screen, Pt(left, y), Pt(right, y), | ||
| 142 | v, f); | ||
| 143 | break; | ||
| 144 | } | ||
| 145 | } | ||
| 146 | #endif | ||
| 147 | } | ||
| 148 | wind=nwind; | ||
| 149 | nextep=ep->next; | ||
| 150 | if(++ep->p.y!=ep->maxy){ | ||
| 151 | ep->x+=ep->num; | ||
| 152 | if(ep->x>=ep->den){ | ||
| 153 | ep->x-=ep->den; | ||
| 154 | ep->p.x+=ep->dx1; | ||
| 155 | } | ||
| 156 | else | ||
| 157 | ep->p.x+=ep->dx; | ||
| 158 | insert(ep, yp+1); | ||
| 159 | } | ||
| 160 | } | ||
| 161 | } | ||
| 162 | free((char *)edges); | ||
| 163 | free((char *)ylist); | ||
| 164 | } | ||
| 165 | void fill(int num[], double *ff[]){ | ||
| 166 | polygon(num, ff, Odd, e1->foregr); | ||
| 167 | } | ||
| @@ -0,0 +1,16 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void frame(double xs, double ys, double xf, double yf){ | ||
| 3 | register double osidex, osidey; | ||
| 4 | osidex = e1->sidex; | ||
| 5 | osidey = e1->sidey; | ||
| 6 | e1->left = e0->left + xs * e0->sidex; | ||
| 7 | e1->bottom = e0->bottom + ys * e0->sidey; | ||
| 8 | e1->sidex = (xf-xs)*e0->sidex; | ||
| 9 | e1->sidey = (yf-ys)*e0->sidey; | ||
| 10 | e1->scalex *= (e1->sidex / osidex); | ||
| 11 | e1->scaley *= (e1->sidey / osidey); | ||
| 12 | e1->quantum=e0->quantum/sqrt(e1->scalex*e1->scalex + | ||
| 13 | e1->scaley*e1->scaley); | ||
| 14 | if(e1->quantum < .01) | ||
| 15 | e1->quantum = .01; | ||
| 16 | } | ||
| @@ -0,0 +1,4 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void grade(double x){ | ||
| 3 | e1->grade = x; | ||
| 4 | } | ||
| @@ -0,0 +1,5 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void plotline(double x0, double y0, double x1, double y1){ | ||
| 3 | move(x0, y0); | ||
| 4 | vec(x1, y1); | ||
| 5 | } | ||
| @@ -0,0 +1,142 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | Image *offscreen; | ||
| 3 | /* | ||
| 4 | * Clear the window from x0, y0 to x1, y1 (inclusive) to color c | ||
| 5 | */ | ||
| 6 | void m_clrwin(int x0, int y0, int x1, int y1, int c){ | ||
| 7 | draw(offscreen, Rect(x0, y0, x1+1, y1+1), getcolor(c), nil, ZP); | ||
| 8 | } | ||
| 9 | /* | ||
| 10 | * Draw text between pointers p and q with first character centered at x, y. | ||
| 11 | * Use color c. Centered if cen is non-zero, right-justified if right is non-zero. | ||
| 12 | * Returns the y coordinate for any following line of text. | ||
| 13 | */ | ||
| 14 | int m_text(int x, int y, char *p, char *q, int c, int cen, int right){ | ||
| 15 | Point tsize; | ||
| 16 | USED(c); | ||
| 17 | tsize=stringsize(font, p); | ||
| 18 | if(cen) x -= tsize.x/2; | ||
| 19 | else if(right) x -= tsize.x; | ||
| 20 | stringn(offscreen, Pt(x, y-tsize.y/2), getcolor(c), ZP, font, p, q-p); | ||
| 21 | return y+tsize.y; | ||
| 22 | } | ||
| 23 | /* | ||
| 24 | * Draw the vector from x0, y0 to x1, y1 in color c. | ||
| 25 | * Clipped by caller | ||
| 26 | */ | ||
| 27 | void m_vector(int x0, int y0, int x1, int y1, int c){ | ||
| 28 | line(offscreen, Pt(x0, y0), Pt(x1, y1), Endsquare, Endsquare, 0, getcolor(c), ZP); | ||
| 29 | } | ||
| 30 | char *scanint(char *s, int *n){ | ||
| 31 | while(*s<'0' || '9'<*s){ | ||
| 32 | if(*s=='\0'){ | ||
| 33 | fprint(2, "plot: bad -Wxmin,ymin,xmax,ymax\n"); | ||
| 34 | exits("bad arg"); | ||
| 35 | } | ||
| 36 | s++; | ||
| 37 | } | ||
| 38 | *n=0; | ||
| 39 | while('0'<=*s && *s<='9'){ | ||
| 40 | *n=*n*10+*s-'0'; | ||
| 41 | s++; | ||
| 42 | } | ||
| 43 | return s; | ||
| 44 | } | ||
| 45 | char *rdenv(char *name){ | ||
| 46 | char *v; | ||
| 47 | int fd, size; | ||
| 48 | fd=open(name, OREAD); | ||
| 49 | if(fd<0) return 0; | ||
| 50 | size=seek(fd, 0, 2); | ||
| 51 | v=malloc(size+1); | ||
| 52 | if(v==0){ | ||
| 53 | fprint(2, "Can't malloc: %r\n"); | ||
| 54 | exits("no mem"); | ||
| 55 | } | ||
| 56 | seek(fd, 0, 0); | ||
| 57 | read(fd, v, size); | ||
| 58 | v[size]=0; | ||
| 59 | close(fd); | ||
| 60 | return v; | ||
| 61 | } | ||
| 62 | /* | ||
| 63 | * Startup initialization | ||
| 64 | */ | ||
| 65 | void m_initialize(char *s){ | ||
| 66 | static int first=1; | ||
| 67 | int dx, dy; | ||
| 68 | USED(s); | ||
| 69 | if(first){ | ||
| 70 | if(initdraw(0,0,"plot") < 0) | ||
| 71 | sysfatal("initdraw: %r"); | ||
| 72 | einit(Emouse); | ||
| 73 | clipminx=mapminx=screen->r.min.x+4; | ||
| 74 | clipminy=mapminy=screen->r.min.y+4; | ||
| 75 | clipmaxx=mapmaxx=screen->r.max.x-5; | ||
| 76 | clipmaxy=mapmaxy=screen->r.max.y-5; | ||
| 77 | dx=clipmaxx-clipminx; | ||
| 78 | dy=clipmaxy-clipminy; | ||
| 79 | if(dx>dy){ | ||
| 80 | mapminx+=(dx-dy)/2; | ||
| 81 | mapmaxx=mapminx+dy; | ||
| 82 | } | ||
| 83 | else{ | ||
| 84 | mapminy+=(dy-dx)/2; | ||
| 85 | mapmaxy=mapminy+dx; | ||
| 86 | } | ||
| 87 | first=0; | ||
| 88 | offscreen = screen; | ||
| 89 | } | ||
| 90 | } | ||
| 91 | /* | ||
| 92 | * Clean up when finished | ||
| 93 | */ | ||
| 94 | void m_finish(void){ | ||
| 95 | m_swapbuf(); | ||
| 96 | } | ||
| 97 | void m_swapbuf(void){ | ||
| 98 | if(offscreen!=screen) | ||
| 99 | draw(screen, offscreen->r, offscreen, nil, offscreen->r.min); | ||
| 100 | flushimage(display, 1); | ||
| 101 | } | ||
| 102 | void m_dblbuf(void){ | ||
| 103 | if(offscreen==screen){ | ||
| 104 | offscreen=allocimage(display, insetrect(screen->r, 4), screen->chan, 0, -1); | ||
| 105 | if(offscreen==0){ | ||
| 106 | fprintf(stderr, "Can't double buffer\n"); | ||
| 107 | offscreen=screen; | ||
| 108 | } | ||
| 109 | } | ||
| 110 | } | ||
| 111 | /* Assume colormap entry because | ||
| 112 | * Use cache to avoid repeated allocation. | ||
| 113 | */ | ||
| 114 | struct{ | ||
| 115 | int v; | ||
| 116 | Image *i; | ||
| 117 | }icache[32]; | ||
| 118 | |||
| 119 | Image* | ||
| 120 | getcolor(int v) | ||
| 121 | { | ||
| 122 | Image *i; | ||
| 123 | int j; | ||
| 124 | |||
| 125 | for(j=0; j<nelem(icache); j++) | ||
| 126 | if(icache[j].v==v && icache[j].i!=nil) | ||
| 127 | return icache[j].i; | ||
| 128 | |||
| 129 | i = allocimage(display, Rect(0, 0, 1, 1), RGB24, 1, v); | ||
| 130 | if(i == nil){ | ||
| 131 | fprint(2, "plot: can't allocate image for color: %r\n"); | ||
| 132 | exits("allocimage"); | ||
| 133 | } | ||
| 134 | for(j=0; j<nelem(icache); j++) | ||
| 135 | if(icache[j].i == nil){ | ||
| 136 | icache[j].v = v; | ||
| 137 | icache[j].i = i; | ||
| 138 | break; | ||
| 139 | } | ||
| 140 | |||
| 141 | return i; | ||
| 142 | } | ||
| @@ -0,0 +1,40 @@ | |||
| 1 | </$objtype/mkfile | ||
| 2 | |||
| 3 | LIB=../libplot.a$O | ||
| 4 | OFILES=box.$O\ | ||
| 5 | cfill.$O\ | ||
| 6 | circ.$O\ | ||
| 7 | closepl.$O\ | ||
| 8 | color.$O\ | ||
| 9 | disk.$O\ | ||
| 10 | doublebuffer.$O\ | ||
| 11 | dpoint.$O\ | ||
| 12 | erase.$O\ | ||
| 13 | fill.$O\ | ||
| 14 | frame.$O\ | ||
| 15 | grade.$O\ | ||
| 16 | line.$O\ | ||
| 17 | machdep.$O\ | ||
| 18 | move.$O\ | ||
| 19 | openpl.$O\ | ||
| 20 | parabola.$O\ | ||
| 21 | pen.$O\ | ||
| 22 | poly.$O\ | ||
| 23 | ppause.$O\ | ||
| 24 | pprompt.$O\ | ||
| 25 | range.$O\ | ||
| 26 | rarc.$O\ | ||
| 27 | restore.$O\ | ||
| 28 | rmove.$O\ | ||
| 29 | rvec.$O\ | ||
| 30 | save.$O\ | ||
| 31 | sbox.$O\ | ||
| 32 | spline.$O\ | ||
| 33 | subr.$O\ | ||
| 34 | text.$O\ | ||
| 35 | vec.$O\ | ||
| 36 | whoami.$O\ | ||
| 37 | |||
| 38 | HFILES=mplot.h\ | ||
| 39 | |||
| 40 | </sys/src/cmd/mklib | ||
| @@ -0,0 +1,5 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void move(double xx, double yy){ | ||
| 3 | e1->copyx = xx; | ||
| 4 | e1->copyy = yy; | ||
| 5 | } | ||
| @@ -0,0 +1,47 @@ | |||
| 1 | #include <u.h> | ||
| 2 | #include <libc.h> | ||
| 3 | #include <stdio.h> | ||
| 4 | #include <draw.h> | ||
| 5 | #include <event.h> | ||
| 6 | #define SCX(A) ((((A) - e1->xmin)*e1->scalex + e1->left)+.5) | ||
| 7 | #define SCY(A) ((((A) - e1->ymin)*e1->scaley + e1->bottom)+.5) | ||
| 8 | #define SCR(A) ((A)*e1->scalex+.5) | ||
| 9 | #define unorm(y) (double)(e1->sidey - y) | ||
| 10 | #define BIGINT 0x3FFFFFFF /* a large, but valid, int */ | ||
| 11 | extern struct penvir { | ||
| 12 | double left, bottom; | ||
| 13 | double xmin, ymin; | ||
| 14 | double scalex, scaley; | ||
| 15 | double sidex, sidey; | ||
| 16 | double copyx, copyy; | ||
| 17 | double quantum; | ||
| 18 | double grade; | ||
| 19 | int pgap; | ||
| 20 | double pslant; | ||
| 21 | int pmode, foregr, backgr; | ||
| 22 | } *e0, *e1, *esave; | ||
| 23 | #define RADIAN 57.3 /* radians per degree */ | ||
| 24 | struct seg { | ||
| 25 | int x, y, X, Y; | ||
| 26 | char stat; | ||
| 27 | }; | ||
| 28 | |||
| 29 | /* | ||
| 30 | * display parameters | ||
| 31 | */ | ||
| 32 | int clipminx, clipminy, clipmaxx, clipmaxy; /* clipping rectangle */ | ||
| 33 | int mapminx, mapminy, mapmaxx, mapmaxy; /* centered square */ | ||
| 34 | /* | ||
| 35 | * Prototypes | ||
| 36 | */ | ||
| 37 | #include "../plot.h" | ||
| 38 | void m_clrwin(int, int, int, int, int); | ||
| 39 | void m_finish(void); | ||
| 40 | void m_initialize(char *); | ||
| 41 | int m_text(int, int, char *, char *, int, int, int); | ||
| 42 | void m_vector(int, int, int, int, int); | ||
| 43 | void m_swapbuf(void); | ||
| 44 | void m_dblbuf(void); | ||
| 45 | int bcolor(char *); | ||
| 46 | void sscpy(struct penvir *, struct penvir *); | ||
| 47 | Image *getcolor(int); | ||
| @@ -0,0 +1,12 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void openpl(char *s){ | ||
| 3 | m_initialize(s); | ||
| 4 | e0->left=mapminx; | ||
| 5 | e0->bottom=mapmaxy; | ||
| 6 | e0->sidex=mapmaxx-mapminx; | ||
| 7 | e0->sidey=mapminy-mapmaxy; | ||
| 8 | e0->scalex=e0->sidex; | ||
| 9 | e0->scaley=e0->sidey; | ||
| 10 | sscpy(e0, e1); | ||
| 11 | move(0., 0.); | ||
| 12 | } | ||
| @@ -0,0 +1,32 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void parabola(double x0, double y0, double x1, double y1, double xb, double yb){ | ||
| 3 | register double x, y, t; | ||
| 4 | double c0x, c0y, c1x, c1y; | ||
| 5 | double dt, d2, d1; | ||
| 6 | d1 = sqrt((xb - x0) * (xb - x0) + (yb - y0) * (yb - y0)); | ||
| 7 | d2 = sqrt((xb - x1) * (xb - x1) + (yb - y1) * (yb - y1)); | ||
| 8 | if (d1 <= e1->quantum || d2 <= e1->quantum) { | ||
| 9 | plotline(x0, y0, x1, y1); | ||
| 10 | return; | ||
| 11 | } | ||
| 12 | c0x = x0 + x1 - 2. * xb; | ||
| 13 | c1x = 2. * (xb - x0); | ||
| 14 | c0y = y0 + y1 - 2. * yb; | ||
| 15 | c1y = 2. * (yb - y0); | ||
| 16 | move(x0, y0); | ||
| 17 | dt = e1->quantum / d1; | ||
| 18 | dt /= e1->grade; | ||
| 19 | for (t = dt; t < 0.5; t += dt) { | ||
| 20 | x = (c0x * t + c1x) * t + x0; | ||
| 21 | y = (c0y * t + c1y) * t + y0; | ||
| 22 | vec(x, y); | ||
| 23 | } | ||
| 24 | dt = e1->quantum / d2; | ||
| 25 | dt /= e1->grade; | ||
| 26 | for (; t < 1.0; t += dt) { | ||
| 27 | x = (c0x * t + c1x) * t + x0; | ||
| 28 | y = (c0y * t + c1y) * t + y0; | ||
| 29 | vec(x, y); | ||
| 30 | } | ||
| 31 | vec(x1, y1); | ||
| 32 | } | ||
| @@ -0,0 +1,6 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void pen(char *s){ | ||
| 3 | /* BUG: NO OP */ | ||
| 4 | USED(s); | ||
| 5 | /* was this error: color(s); */ | ||
| 6 | } | ||
| @@ -0,0 +1,17 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void plotpoly(int num[], double *ff[]){ | ||
| 3 | double *xp, *yp, **fp; | ||
| 4 | int i, *n; | ||
| 5 | n = num; | ||
| 6 | fp = ff; | ||
| 7 | while((i = *n++)){ | ||
| 8 | xp = *fp++; | ||
| 9 | yp = xp+1; | ||
| 10 | move(*xp, *yp); | ||
| 11 | while(--i){ | ||
| 12 | xp += 2; | ||
| 13 | yp += 2; | ||
| 14 | vec(*xp, *yp); | ||
| 15 | } | ||
| 16 | } | ||
| 17 | } | ||
| @@ -0,0 +1,7 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void ppause(void){ | ||
| 3 | char aa[4]; | ||
| 4 | fflush(stdout); | ||
| 5 | read(0, aa, 4); | ||
| 6 | erase(); | ||
| 7 | } | ||
| @@ -0,0 +1,5 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void | ||
| 3 | pprompt(void){ | ||
| 4 | fprintf(stderr, ":"); | ||
| 5 | } | ||
| @@ -0,0 +1,11 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void range(double x0, double y0, double x1, double y1){ | ||
| 3 | e1->xmin = x0; | ||
| 4 | e1->ymin = y0; | ||
| 5 | e1->scalex = e1->sidex / (x1 - x0 ); | ||
| 6 | e1->scaley = e1->sidey / (y1 - y0 ); | ||
| 7 | e1->quantum=e0->quantum/sqrt(e1->scalex*e1->scalex + | ||
| 8 | e1->scaley*e1->scaley); | ||
| 9 | if(e1->quantum < .01) | ||
| 10 | e1->quantum = .01; | ||
| 11 | } | ||
| @@ -0,0 +1,44 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | /* arc plotting routine */ | ||
| 3 | /* from x1,y1 to x2,y2 */ | ||
| 4 | /* with center xc,yc and radius rr */ | ||
| 5 | /* integrates difference equation */ | ||
| 6 | /* negative rr draws counterclockwise */ | ||
| 7 | #define PI4 0.7854 | ||
| 8 | void rarc(double x1, double y1, double x2, double y2, double xc, double yc, double rr){ | ||
| 9 | register double dx, dy, a, b; | ||
| 10 | double ph, dph, rd, xnext; | ||
| 11 | register int n; | ||
| 12 | dx = x1 - xc; | ||
| 13 | dy = y1 - yc; | ||
| 14 | rd = sqrt(dx * dx + dy * dy); | ||
| 15 | if (rd / e1->quantum < 1.0) { | ||
| 16 | move(xc, yc); | ||
| 17 | vec(xc, yc); | ||
| 18 | return; | ||
| 19 | } | ||
| 20 | dph = acos(1.0 - (e1->quantum / rd)); | ||
| 21 | if (dph > PI4) | ||
| 22 | dph = PI4; | ||
| 23 | ph=atan2((y2-yc),(x2 - xc)) - atan2(dy, dx); | ||
| 24 | if (ph < 0) | ||
| 25 | ph += 6.2832; | ||
| 26 | if (rr < 0) | ||
| 27 | ph = 6.2832 - ph; | ||
| 28 | if (ph < dph) | ||
| 29 | plotline(x1, y1, x2, y2); | ||
| 30 | else { | ||
| 31 | n = ph / dph; | ||
| 32 | a = cos(dph); | ||
| 33 | b = sin(dph); | ||
| 34 | if (rr < 0) | ||
| 35 | b = -b; | ||
| 36 | move(x1, y1); | ||
| 37 | while ((n--) >= 0) { | ||
| 38 | xnext = dx * a - dy * b; | ||
| 39 | dy = dx * b + dy * a; | ||
| 40 | dx = xnext; | ||
| 41 | vec(dx + xc, dy + yc); | ||
| 42 | } | ||
| 43 | } | ||
| 44 | } | ||
| @@ -0,0 +1,5 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void restore(void){ | ||
| 3 | e1--; | ||
| 4 | move(e1->copyx, e1->copyy); | ||
| 5 | } | ||
| @@ -0,0 +1,6 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void rmove(double xx, double yy){ | ||
| 3 | e1->copyx += xx; | ||
| 4 | e1->copyy += yy; | ||
| 5 | move(e1->copyx, e1->copyy); | ||
| 6 | } | ||
| @@ -0,0 +1,6 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void rvec(double xx, double yy){ | ||
| 3 | e1->copyx += xx; | ||
| 4 | e1->copyy += yy; | ||
| 5 | vec(e1->copyx, e1->copyy); | ||
| 6 | } | ||
| @@ -0,0 +1,5 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void save(void){ | ||
| 3 | sscpy(e1, e1 + 1); | ||
| 4 | e1++; | ||
| 5 | } | ||
| @@ -0,0 +1,13 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | void sbox(double xx0, double yy0, double xx1, double yy1){ | ||
| 3 | int x0=SCX(xx0), y0=SCY(yy0), x1=SCX(xx1), y1=SCY(yy1); | ||
| 4 | int t; | ||
| 5 | if(x1<x0){ t=x0; x0=x1; x1=t; } | ||
| 6 | if(y1<y0){ t=y0; y0=y1; y1=t; } | ||
| 7 | if(x0<clipminx) x0=clipminx; | ||
| 8 | if(y0<clipminy) y0=clipminy; | ||
| 9 | if(x1>clipmaxx) x1=clipmaxx; | ||
| 10 | if(y1>clipmaxy) y1=clipmaxy; | ||
| 11 | if(x1<x0 || y1<y0) return; | ||
| 12 | m_clrwin(x0, y0, x1, y1, e1->backgr); | ||
| 13 | } | ||
| @@ -0,0 +1,51 @@ | |||
| 1 | /* | ||
| 2 | Produce spline (uniform knots, second order) | ||
| 3 | from guiding points | ||
| 4 | */ | ||
| 5 | #include "mplot.h" | ||
| 6 | void splin(int mode, int num[], double *ff[]){ | ||
| 7 | int i, *np, n; | ||
| 8 | double xa, ya, xc, yc, *xp, *yp, *xp0, *yp0, *xpe, *ype; | ||
| 9 | double **fp; | ||
| 10 | np = num; | ||
| 11 | fp = ff; | ||
| 12 | while((n = *np++)){ | ||
| 13 | xp = *fp++; | ||
| 14 | yp = xp + 1; | ||
| 15 | xp0 = xp; | ||
| 16 | yp0 = yp; | ||
| 17 | xpe = xp0 + 2 * (n - 1); | ||
| 18 | ype = yp0 + 2 * (n - 1); | ||
| 19 | if (n < 3) { | ||
| 20 | plotline(*xp, *yp, *(xp + 2), *(yp + 2)); | ||
| 21 | continue; | ||
| 22 | } | ||
| 23 | if (mode == 4) { /*closed curve*/ | ||
| 24 | xa = 0.5 * (*xpe + *(xpe - 2)); | ||
| 25 | xc = 0.5 * (*xpe + *xp0); | ||
| 26 | ya = 0.5 * (*ype + *(ype - 2)); | ||
| 27 | yc = 0.5 * (*ype + *yp0); | ||
| 28 | parabola(xa, ya, xc, yc, *xpe, *ype); | ||
| 29 | xa = 0.5 * (*xpe + *xp0); | ||
| 30 | xc = 0.5 * (*(xp0 + 2) + *xp0); | ||
| 31 | ya = 0.5 * (*ype + *yp0); | ||
| 32 | yc = 0.5 * (*(yp0 + 2) + *yp0); | ||
| 33 | parabola(xa, ya, xc, yc, *xp0, *yp0); | ||
| 34 | } | ||
| 35 | else { /*open curve with multiple endpoints*/ | ||
| 36 | if (mode % 2) /*odd mode makes first point double*/ | ||
| 37 | plotline(*xp0,*yp0,0.5*(*xp0+*(xp0+2)),0.5*(*yp0+*(yp0+2))); | ||
| 38 | } | ||
| 39 | xp += 2; | ||
| 40 | yp += 2; | ||
| 41 | for (i = 1; i < (n - 1); i++, xp += 2, yp += 2) { | ||
| 42 | xa = 0.5 * (*(xp - 2) + *xp); | ||
| 43 | xc = 0.5 * ( *xp + *(xp + 2)); | ||
| 44 | ya = 0.5 * (*(yp - 2) + *yp); | ||
| 45 | yc = 0.5 * ( *yp + *(yp + 2)); | ||
| 46 | parabola(xa, ya, xc, yc, *xp, *yp); | ||
| 47 | } | ||
| 48 | if(mode >= 2 && mode != 4) | ||
| 49 | plotline(0.5*(*(xpe-2)+*xpe),0.5*(*(ype-2)+*ype),*xpe,*ype); | ||
| 50 | } | ||
| 51 | } | ||
| @@ -0,0 +1,78 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | #define pSMALL 0.5 | ||
| 3 | struct penvir E[9] = { | ||
| 4 | { 0., 1024., 0., 0., 1., -1.,1024., -1024., 0., 0., pSMALL, 1., 1, 0.,1, DBlack, DWhite}, | ||
| 5 | { 0., 1024., 0., 0., 1., -1.,1024., -1024., 0., 0., pSMALL, 1., 1, 0.,1, DBlack, DWhite}, | ||
| 6 | { 0., 1024., 0., 0., 1., -1.,1024., -1024., 0., 0., pSMALL, 1., 1, 0.,1, DBlack, DWhite}, | ||
| 7 | { 0., 1024., 0., 0., 1., -1.,1024., -1024., 0., 0., pSMALL, 1., 1, 0.,1, DBlack, DWhite}, | ||
| 8 | { 0., 1024., 0., 0., 1., -1.,1024., -1024., 0., 0., pSMALL, 1., 1, 0.,1, DBlack, DWhite}, | ||
| 9 | { 0., 1024., 0., 0., 1., -1.,1024., -1024., 0., 0., pSMALL, 1., 1, 0.,1, DBlack, DWhite}, | ||
| 10 | { 0., 1024., 0., 0., 1., -1.,1024., -1024., 0., 0., pSMALL, 1., 1, 0.,1, DBlack, DWhite}, | ||
| 11 | { 0., 1024., 0., 0., 1., -1.,1024., -1024., 0., 0., pSMALL, 1., 1, 0.,1, DBlack, DWhite} | ||
| 12 | }; | ||
| 13 | struct penvir *e0 = E, *e1 = &E[1], *esave; | ||
| 14 | bcolor(char *s){ | ||
| 15 | int c; | ||
| 16 | while (*s != 0) { | ||
| 17 | switch (*s) { | ||
| 18 | case '0': case '1': case '2': case '3': case '4': | ||
| 19 | case '5': case '6': case '7': case '8': case '9': | ||
| 20 | c=0; | ||
| 21 | while('0'<=*s && *s<='9') | ||
| 22 | c=c*10+*s++-'0'; | ||
| 23 | if(c < 0) | ||
| 24 | return DBlack; | ||
| 25 | return cmap2rgba(c); | ||
| 26 | case 'k': case 'z': /* zero was old name for kblack */ | ||
| 27 | return(DBlack); | ||
| 28 | case 'r': | ||
| 29 | return(DRed); | ||
| 30 | case 'g': | ||
| 31 | return(DGreen); | ||
| 32 | case 'b': | ||
| 33 | return(DBlue); | ||
| 34 | case 'm': | ||
| 35 | return(DMagenta); | ||
| 36 | case 'y': | ||
| 37 | return(DYellow); | ||
| 38 | case 'c': | ||
| 39 | return(DCyan); | ||
| 40 | case 'w': | ||
| 41 | return(DWhite); | ||
| 42 | case 'R': | ||
| 43 | return(atoi(s + 1)); | ||
| 44 | case 'G': | ||
| 45 | e1->pgap = atof(s + 1); | ||
| 46 | return(-1); | ||
| 47 | case 'A': | ||
| 48 | e1->pslant = (180. - atof(s + 1)) / RADIAN; | ||
| 49 | return(-1); | ||
| 50 | } | ||
| 51 | while (*++s != 0) | ||
| 52 | if (*s == '/') { | ||
| 53 | s++; | ||
| 54 | break; | ||
| 55 | } | ||
| 56 | } | ||
| 57 | return DBlack; | ||
| 58 | } | ||
| 59 | void sscpy(struct penvir *a, struct penvir *b){ /* copy 'a' onto 'b' */ | ||
| 60 | b->left = a->left; | ||
| 61 | b->bottom = a->bottom; | ||
| 62 | b->xmin = a->xmin; | ||
| 63 | b->ymin = a->ymin; | ||
| 64 | b->scalex = a->scalex; | ||
| 65 | b->scaley = a->scaley; | ||
| 66 | b->sidex = a->sidex; | ||
| 67 | b->sidey = a->sidey; | ||
| 68 | b->copyx = a->copyx; | ||
| 69 | b->copyy = a->copyy; | ||
| 70 | b->quantum = a->quantum; | ||
| 71 | b->grade = a->grade; | ||
| 72 | b->pmode = a->pmode; | ||
| 73 | b->foregr = a->foregr; | ||
| 74 | b->backgr = a->backgr; | ||
| 75 | } | ||
| 76 | void idle(void){} | ||
| 77 | |||
| 78 | void ptype(char *s){USED(s);} | ||
| @@ -0,0 +1,39 @@ | |||
| 1 | /* | ||
| 2 | t string Place the string so that its first character is | ||
| 3 | centered on the current point (default). If | ||
| 4 | string begins with `\C' (`\R'), it is centered | ||
| 5 | (right-adjusted) on the current point. A | ||
| 6 | backslash at the beginning of the string may be | ||
| 7 | escaped with another backslash. | ||
| 8 | */ | ||
| 9 | #include "mplot.h" | ||
| 10 | void text(char *s){ | ||
| 11 | register int kx, ky; | ||
| 12 | int centered, right, more; | ||
| 13 | char *ss; | ||
| 14 | ss=s; | ||
| 15 | for(;;){ | ||
| 16 | centered=right=more=0; | ||
| 17 | if(*ss=='\\'){ | ||
| 18 | ss++; | ||
| 19 | switch(*ss){ | ||
| 20 | case 'C': centered++; ss++; break; | ||
| 21 | case 'R': right++; ss++; break; | ||
| 22 | case 'L': ss++; break; | ||
| 23 | case 'n': --ss; break; | ||
| 24 | } | ||
| 25 | } | ||
| 26 | for(s=ss;*ss!='\0';ss++) | ||
| 27 | if(ss[0]=='\\' && ss[1]=='n'){ | ||
| 28 | more++; | ||
| 29 | break; | ||
| 30 | } | ||
| 31 | kx = SCX(e1->copyx); | ||
| 32 | ky = SCY(e1->copyy); | ||
| 33 | ky=m_text(kx, ky, s, ss, e1->foregr, centered, right); | ||
| 34 | if(!more)break; | ||
| 35 | e1->copyy = ( (double)(ky) - e1->bottom)/e1->scaley + e1->ymin + .5; | ||
| 36 | move(e1->copyx, e1->copyy); | ||
| 37 | ss+=2; | ||
| 38 | } | ||
| 39 | } | ||
| @@ -0,0 +1,26 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | #define code(x, y) ((x<clipminx?1:x>clipmaxx?2:0)|(y<clipminy?4:y>clipmaxy?8:0)) | ||
| 3 | void vec(double xx, double yy){ | ||
| 4 | int x0, y0, x1, y1, c0, c1, c, tx, ty; | ||
| 5 | double t; | ||
| 6 | t=SCX(e1->copyx); if(fabs(t)>BIGINT) return; x0=t; | ||
| 7 | t=SCY(e1->copyy); if(fabs(t)>BIGINT) return; y0=t; | ||
| 8 | t=SCX(xx); if(fabs(t)>BIGINT) return; x1=t; | ||
| 9 | t=SCY(yy); if(fabs(t)>BIGINT) return; y1=t; | ||
| 10 | e1->copyx=xx; | ||
| 11 | e1->copyy=yy; | ||
| 12 | /* clipping -- what a concept */ | ||
| 13 | c0=code(x0, y0); | ||
| 14 | c1=code(x1, y1); | ||
| 15 | while(c0|c1){ | ||
| 16 | if(c0&c1) return; | ||
| 17 | c=c0?c0:c1; | ||
| 18 | if(c&1) ty=y0+(y1-y0)*(clipminx-x0)/(x1-x0), tx=clipminx; | ||
| 19 | else if(c&2) ty=y0+(y1-y0)*(clipmaxx-x0)/(x1-x0), tx=clipmaxx; | ||
| 20 | else if(c&4) tx=x0+(x1-x0)*(clipminy-y0)/(y1-y0), ty=clipminy; | ||
| 21 | else tx=x0+(x1-x0)*(clipmaxy-y0)/(y1-y0), ty=clipmaxy; | ||
| 22 | if(c==c0) x0=tx, y0=ty, c0=code(x0, y0); | ||
| 23 | else x1=tx, y1=ty, c1=code(x1, y1); | ||
| 24 | } | ||
| 25 | m_vector(x0, y0, x1, y1, e1->foregr); | ||
| 26 | } | ||
| @@ -0,0 +1,4 @@ | |||
| 1 | #include "mplot.h" | ||
| 2 | char *whoami(void){ | ||
| 3 | return("ramtek"); | ||
| 4 | } | ||