diff options
Diffstat (limited to 'usr/src/ucbcmd/plot/libplot/t4014/arc.c')
-rw-r--r-- | usr/src/ucbcmd/plot/libplot/t4014/arc.c | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/usr/src/ucbcmd/plot/libplot/t4014/arc.c b/usr/src/ucbcmd/plot/libplot/t4014/arc.c new file mode 100644 index 0000000000..a5ceb326d7 --- /dev/null +++ b/usr/src/ucbcmd/plot/libplot/t4014/arc.c @@ -0,0 +1,141 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ +/* All Rights Reserved */ + + +#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */ + +/* + * Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc. + * All Rights Reserved. + */ + +int 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); +} |