earc.c0int del 20; step(d){ del = d; } arc(x,y,x0,y0,x1,y1){ double pc; double sqrt(); int flg,m,xc,yc,xs,ys,qs,qf; float dx,dy,r; char use; dx = x-x0; dy = y-y0; r = dx*dx+dy*dy; pc = r; pc = sqrt(pc); flg = pc/4; if(flg == 0)step(1); else if(flg < del)step(flg); xc = xs = x0; yc = ys = y0; move(xs,ys); if(x0 == x1 && y0 == y1)flg=0; else flg=1; qs = quad(x,y,x0,y0); qf = quad(x,y,x1,y1); if(abs(x-x1) < abs(y-y1)){ use = 'x'; if(qs == 2 || qs ==3)m = -1; else m=1; } else { use = 'y'; if(qs > 2)m= -1; else m= 1; } while(1){ switch(use){ case 'x': if(qs == 2 || qs == 3)yc =- del; else yc =+ del; dy = yc-y; pc = r-dy*dy; xc = m*sqrt(pc)+x; if((x < xs && x >= xc) || ( x > xs && x <= xc) || (y < ys && y >= yc) || ( y > ys && y <= yc) ) { if(++qs > 4)qs=1; if(qs == 2 || qs == 3)m= -1; else m=1; flg=1; } cont(xc,yc); xs = xc; ys = yc; if(qs == qf && flg == 1) switch(qf){ case 3: case 4: if(xs >= x1)return; continue; case 1: case 2: if(xs <= x1)return; } continue; case 'y': if(qs > 2)xc =+ del; else xc =- del; dx = xc-x; pc = r-dx*dx; yc = m*sqrt(pc)+y; if((x < xs && x >= xc) || ( x > xs && x <= xc ) || (y < ys && y >= yc) || (y > ys && y <= yc) ) { if(++qs > 4)qs=1; if(qs > 2)m = -1; else m = 1; flg=1; } cont(xc,yc); xs = xc; ys = yc; if(qs == qf && flg == 1) switch(qs){ case 1: case 4: if(ys >= y1)return; continue; case 2: case 3: if(ys <= y1)return; } } } } quad(x,y,xp,yp){ if(x < xp) if(y <= yp)return(1); else return(4); else if(x > xp) if(y < yp)return(2); else return(3); else if(y < yp)return(2); else return(4); } abs(a){ if(a < 0)return(-a); return(a); } circle.c(circle(x,y,r){ arc(x,y,x+r,y,x+r,y); } close.ci#include closevt(){ putch(037); fflush(stdout); } closepl(){ putch(037); fflush(stdout); } (dot.c dot(){ } float obotx 0.; float oboty 0.; float botx 0.; float boty 0.; float scalex 1.; float scaley 1.; int scaleflag; int oloy -1; int ohiy -1; int ohix -1; int oextra -1; cont(x,y){ int hix,hiy,lox,loy,extra; int n; x = (x-obotx)*scalex + botx; y = (y-oboty)*scaley + boty; hix=(x>>7) & 037; hiy=(y>>7) & 037; lox = (x>>2)&037; loy=(y>>2)&037; extra=x&03+(y<<2)&014; n = (abs(hix-ohix) + abs(hiy-ohiy) + 6) / 12; if(hiy != ohiy){ putch(hiy|040); ohiy=hiy; } if(hix != ohix){ if(extra != oextra){ putch(extra|0140); oextra=extra; } putch(loy|0140); putch(hix|040); ohix=hix; oloy=loy; } else{ if(extra != oextra){ putch(extra|0140); putch(loy|0140); oextra=extra; oloy=loy; } else if(loy != oloy){ putch(loy|0140); oloy=loy; } } putch(lox|0100); while(n--) putch(0); } putch(c){ putc(c,stdout); } box.c rbox(x0, y0, x1, y1) { move(x0, y0); cont(x0, y1); cont(x1, y1); cont(x1, y0); cont(x0, y0); move(x1, y1); }