1 /*-
2 * Copyright (c) 1985, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.proprietary.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)arc.c 8.1 (Berkeley) 06/04/93";
10 #endif /* not lint */
11
12 int del = 20;
step(d)13 step(d){
14 del = d;
15 }
arc(x,y,x0,y0,x1,y1)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 = pc > 0 ? sqrt(pc) : 0;
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*(pc > 0 ? sqrt(pc) : 0)+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*(pc > 0 ? sqrt(pc) : 0)+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 }
quad(x,y,xp,yp)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