123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- /* This file contains code for X-CHESS.
- Copyright (C) 1986 Free Software Foundation, Inc.
- This file is part of X-CHESS.
- X-CHESS is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY. No author or distributor
- accepts responsibility to anyone for the consequences of using it
- or for whether it serves any particular purpose or works at all,
- unless he says so in writing. Refer to the X-CHESS General Public
- License for full details.
- Everyone is granted permission to copy, modify and redistribute
- X-CHESS, but only under the conditions described in the
- X-CHESS General Public License. A copy of this license is
- supposed to have been given to you along with X-CHESS so you
- can know your rights and responsibilities. It should be in a
- file named COPYING. Among other things, the copyright notice
- and this notice must be preserved on all copies. */
- /* RCS Info: $Revision: 1.2 $ on $Date: 86/11/23 17:17:04 $
- * $Source: /users/faustus/xchess/RCS/XCircle.c,v $
- * Copyright (c) 1986 Wayne A. Christopher, U. C. Berkeley CAD Group
- * Permission is granted to do anything with this code except sell it
- * or remove this message.
- *
- */
- #include <stdio.h>
- #include <X/Xlib.h>
- #include <math.h>
- #define PI 3.1415926535897932384
- #define MAXVERTS 1000
- void
- XCircle(win, x, y, rad, start, end, width, height, pixel, func, planes)
- Window win;
- int x, y, rad;
- double start, end;
- int pixel;
- int width, height;
- int func, planes;
- {
- Vertex verts[MAXVERTS];
- double xp, yp, ang;
- int lx, ly, xpt, ypt, i;
- double gradincr = 2 / (double) rad;
- int bk = 0;
- while (end >= PI * 2)
- end -= PI * 2;
- while (start >= PI * 2)
- start -= PI * 2;
- while (end < 0)
- end += PI * 2;
- while (start < 0)
- start += PI * 2;
- if (end == start) {
- if (end < gradincr)
- end = end + PI * 2 - gradincr / 2;
- else
- end -= gradincr / 2;
- }
- for (ang = start, i = 0; i < MAXVERTS; ) {
- xp = x + rad * cos(ang);
- yp = y + rad * sin(ang);
- xpt = xp;
- ypt = yp;
- if (!i || (lx != xpt) || (ly != ypt)) {
- verts[i].x = xpt;
- verts[i].y = ypt;
- verts[i].flags = 0;
- i++;
- }
- lx = xpt;
- ly = ypt;
- if (bk)
- break;
- if (((ang < end) && (ang + gradincr > end)) || ((end < start)
- && (ang + gradincr > 2 * PI)
- && (ang + gradincr - 2 * PI > end))) {
- ang = end;
- bk = 1;
- } else if (ang == end) {
- break;
- } else {
- ang += gradincr;
- }
- if (ang >= PI * 2)
- ang -= PI * 2;
- }
- /* Now draw the thing.. */
- XDraw(win, verts, i, width, height, pixel, func, planes);
- return;
- }
- #ifdef notdef VertexCurved is screwed up
- void
- XCircle(win, x, y, rad, start, end, width, height, pixel, func, planes)
- Window win;
- int x, y, rad;
- double start, end;
- int pixel;
- int width, height;
- int func, planes;
- {
- Vertex verts[7];
- int i, j, sv, ev;
- int dp = 0;
- for (i = j = 0 ; i < 4; i++) {
- verts[j].x = x + rad * cos((double) (PI * i / 2));
- verts[j].y = y + rad * sin((double) (PI * i / 2));
- verts[j].flags = VertexCurved;
- if ((start >= PI * i / 2) && (start < PI * (i + 1) / 2) &&
- (start != end)) {
- j++;
- verts[j].x = x + rad * cos(start);
- verts[j].y = y + rad * sin(start);
- verts[j].flags = VertexCurved;
- sv = j;
- } else if ((end >= PI * i / 2) && (end < PI * (i + 1) / 2)
- && (start != end)) {
- j++;
- verts[j].x = x + rad * cos(end);
- verts[j].y = y + rad * sin(end);
- verts[j].flags = VertexCurved;
- ev = j;
- }
- j++;
- }
- verts[0].flags |= VertexStartClosed;
- verts[j].x = verts[0].x;
- verts[j].y = verts[0].y;
- verts[j].flags = (verts[0].flags & ~VertexStartClosed) |
- VertexEndClosed;
- for (i = 0; i < 15; i++) {
- if (dp)
- verts[i % 7].flags |= VertexDontDraw;
- if (i % 7 == ev)
- dp = 1;
- else if (i % 7 == sv)
- dp = 0;
- }
- XDraw(win, verts, j + 1, width, height, pixel, func, planes);
- return;
- }
- #endif notdef
|