1 /*- 2 * Copyright (c) 1985 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.proprietary.c% 6 */ 7 8 #ifndef lint 9 static char sccsid[] = "@(#)arc.c 5.2 (Berkeley) 04/22/91"; 10 #endif /* not lint */ 11 12 int del = 20; 13 step(d){ 14 del = d; 15 } 16 arc(x,y,x0,y0,x1,y1){ 17 double pc; 18 double sqrt(); 19 int flg,m,xc,yc,xs,ys,qs,qf; 20 float dx,dy,r; 21 char use; 22 dx = x-x0; 23 dy = y-y0; 24 r = dx*dx+dy*dy; 25 pc = r; 26 pc = sqrt(pc); 27 flg = pc/4; 28 if(flg == 0)step(1); 29 else if(flg < del)step(flg); 30 xc = xs = x0; 31 yc = ys = y0; 32 move(xs,ys); 33 if(x0 == x1 && y0 == y1)flg=0; 34 else flg=1; 35 qs = quad(x,y,x0,y0); 36 qf = quad(x,y,x1,y1); 37 if(abs(x-x1) < abs(y-y1)){ 38 use = 'x'; 39 if(qs == 2 || qs ==3)m = -1; 40 else m=1; 41 } 42 else { 43 use = 'y'; 44 if(qs > 2)m= -1; 45 else m= 1; 46 } 47 while(1){ 48 switch(use){ 49 case 'x': 50 if(qs == 2 || qs == 3)yc -= del; 51 else yc += del; 52 dy = yc-y; 53 pc = r-dy*dy; 54 xc = m*sqrt(pc)+x; 55 if((x < xs && x >= xc) || ( x > xs && x <= xc) || 56 (y < ys && y >= yc) || ( y > ys && y <= yc) ) 57 { 58 if(++qs > 4)qs=1; 59 if(qs == 2 || qs == 3)m= -1; 60 else m=1; 61 flg=1; 62 } 63 cont(xc,yc); 64 xs = xc; 65 ys = yc; 66 if(qs == qf && flg == 1) 67 switch(qf){ 68 case 3: 69 case 4: 70 if(xs >= x1)return; 71 continue; 72 case 1: 73 case 2: 74 if(xs <= x1)return; 75 } 76 continue; 77 case 'y': 78 if(qs > 2)xc += del; 79 else xc -= del; 80 dx = xc-x; 81 pc = r-dx*dx; 82 yc = m*sqrt(pc)+y; 83 if((x < xs && x >= xc) || ( x > xs && x <= xc ) || 84 (y < ys && y >= yc) || (y > ys && y <= yc) ) 85 { 86 if(++qs > 4)qs=1; 87 if(qs > 2)m = -1; 88 else m = 1; 89 flg=1; 90 } 91 cont(xc,yc); 92 xs = xc; 93 ys = yc; 94 if(qs == qf && flg == 1) 95 switch(qs){ 96 case 1: 97 case 4: 98 if(ys >= y1)return; 99 continue; 100 case 2: 101 case 3: 102 if(ys <= y1)return; 103 } 104 } 105 } 106 } 107 quad(x,y,xp,yp){ 108 if(x < xp) 109 if(y <= yp)return(1); 110 else return(4); 111 else if(x > xp) 112 if(y < yp)return(2); 113 else return(3); 114 else if(y < yp)return(2); 115 else return(4); 116 } 117 abs(a){ 118 if(a < 0)return(-a); 119 return(a); 120 } 121