#include #include #include #include "local_proto.h" static int first; static int prevx, prevy; int get_circle (FILE *fd, struct Categories *labels) { int ok; static struct point /* used to build 1/4 arc of the circle */ { int x,y; } *points = NULL; char east[128], north[128]; int cx, cy, px, py; int radius; int i,count; double r2, atx, aty; fprintf (stdout,"Mark the center of the circle\n"); instructions(0); instructions(1); cx = cy = -9999; if (!get_point (&cx, &cy, east, north)) return 0; px = cx+10; py = cy+10; first = 1; do { fprintf (stdout,"Mark a point on the perimeter\n"); if (first) instructions(0); instructions(1); first = 0; if (!get_point (&px, &py, east, north)) return 0; radius = (int) (hypot((double)(cx-px), (double)(cy-py)) + 0.5); if (radius <= 0) { fprintf (stdout,"Circle too small\n"); instructions(1); } } while (radius <= 0); r2 = (double) radius * radius; points = (struct point *) G_realloc (points, sizeof(*points) * radius + 1); count = 0; for (atx=(double)radius, aty = 0.0; atx >= aty; /*empty*/) { points[count].x = (int) (atx+0.5); points[count].y = (int) (aty+0.5); count++; aty += 1.0; atx = sqrt (r2 - aty*aty); } first = 1; fprintf(fd, "AREA (circle)\n"); /* 0 to 45 degrees */ for (i=0; i=0; i--) draw_and_record (fd, points[i].y, points[i].x, cx, cy); /* 90 to 135 degrees */ for (i=0; i=0; i--) draw_and_record (fd, -points[i].x, points[i].y, cx, cy); /* 180 to 225 degrees */ for (i=0; i=0; i--) draw_and_record (fd, -points[i].y, -points[i].x, cx, cy); /* 270 to 315 degrees */ for (i=0; i=0; i--) draw_and_record (fd, points[i].x, -points[i].y, cx, cy); R_flush(); get_category (fd, "circle", labels); return 1; } int draw_and_record (FILE *fd, int x, int y, int cx, int cy) { char east[128], north[128]; x += cx; y += cy; get_east_north(x, y, east, north); fprintf (fd, " %s %s\n", east, north); if (!first) black_and_white_line (prevx, prevy, x, y); first = 0; prevx = x; prevy = y; return 0; }