/* * Copyright (C) 1994-1995. James Darrell McCauley. (darrell@mccauley-usa.com) * http://mccauley-usa.com/ * * This program is free software under the GPL (>=v2) * Read the file GPL.TXT coming with GRASS for details. */ #include /* for getpid() */ #include #include #include #include #include #include "quaddefs.h" #ifndef RAND_MAX #define RAND_MAX (pow(2.0,31.0)-1) #endif #define R_INIT srand #define RANDOM(lo,hi) ((double) rand() / (double)RAND_MAX * (hi-lo) + lo) /* #define R_MAX 1.0 #define R_INIT srand48 #define RANDOM(lo,hi) (drand48()/R_MAX*(hi-lo)+lo) */ /* * returns Z struct filled with centers of n non-overlapping circles of * radius r contained completely within window */ COOR *find_quadrats (int n, double r, struct Cell_head window, int verbose) { int i = 1, j, overlapped; unsigned k; double east, north, e_max, e_min, n_max, n_min; COOR *quads=NULL; quads = (COOR *) G_malloc ( n * sizeof(COOR) ); if (quads == NULL) G_fatal_error ("cannot allocate memory for quadrats"); srand ((unsigned int)getpid()); /* R_INIT (1); */ e_max = window.east - r; e_min = window.west + r; n_max = window.north - r; n_min = window.south + r; quads[0].x = RANDOM (e_min, e_max); quads[0].y = RANDOM (n_min, n_max); while (i < n) { k=0; if (verbose) G_percent (i, n, 1); overlapped = 1; while (overlapped) { east = RANDOM (e_min, e_max); north = RANDOM (n_min, n_max); k++; overlapped = 0; for (j = i; j >= 0; --j) { if (hypot (quads[j].x - east, quads[j].y - north) < 2 * r) { overlapped = 1; j = -1; } } if (k==n*n) G_warning("Having difficulties fitting that many circles with that radius"); if (k==2*n*n) G_fatal_error("Maximum number of iterations exceeded\nTry smaller radius or smaller number of quads"); } if (verbose) G_percent (i, n, 1); quads[i].x = east; quads[i].y = north; i++; } return quads; }