xref: /original-bsd/lib/libplot/imagen/arc.c (revision c3e32dec)
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;
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