home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-385-Vol-1of3.iso
/
s
/
sep91.zip
/
9N09122A
< prev
next >
Wrap
Text File
|
1991-05-13
|
4KB
|
156 lines
/* Listing 1 */
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <time.h> /* for use by randomize */
#define MAX_CIRCLES 150
double distance( double x, double y, int i);
void generate_circles();
void exit_if_kbhit();
typedef struct {
int x;
int y;
int r;
} circle_type;
circle_type c[ MAX_CIRCLES];
int N, rmax;
/************************************************/
void generate_circles()
/* this function draws a series of circles at random */
/* positions, each one after the first touching the */
/* nearest circle that has been previously drawn */
{
int xmax, ymax, x_pos, y_pos, radius;
randomize(); /* initialize the random numbers */
xmax = getmaxx(); /* maximum x and y positions */
ymax = getmaxy(); /* that can be displayed */
rmax = max( xmax, ymax)/2;
/* divisor of 2 can be changed to allow */
/* different maximum radii */
/* select random position and draw first circle */
x_pos = rand() % xmax;
y_pos = rand() % ymax;
radius = rand() % rmax;
c[0].x = x_pos;
c[0].y = y_pos;
c[0].r = radius;
circle( x_pos, y_pos, radius);
/* select and draw remaining randomly placed circles */
/* each tangent to the nearest previously drawn */
/* circle */
for ( N = 1; N <= MAX_CIRCLES; N++)
{
do
{
exit_if_kbhit();
x_pos = rand() % xmax;
y_pos = rand() % ymax;
radius = new_radius( x_pos, y_pos);
} while (radius <= 0);
radius = min( rmax, radius);
circle( x_pos, y_pos, radius);
c[N].x = x_pos;
c[N].y = y_pos;
c[N].r = radius;
}
}
/************************************************/
int new_radius( int x, int y)
/* returns the distance from the point x,y to the */
/* nearest circle; aborts and returns the */
/* calculated negative or zero distance if x,y lies */
/* on or inside another circle */
{
int i, radius;
radius = rmax;
for ( i = 0; i <= N; i++)
{
radius = min( radius, (int)distance(x,y,i));
if ( radius <= 0) return radius;
}
return radius;
}
/************************************************/
double distance( double x, double y, int i)
/* returns the distance from the point x,y to */
/* circle i; returns a negative or zero distance */
/* if x,y is inside or on circle i */
{
double xdist, ydist, distancesq;
xdist = x - c[i].x;
ydist = y - c[i].y;
distancesq = xdist*xdist + ydist*ydist;
return ( sqrt( distancesq) - c[i].r);
}
/************************************************/
int main(void)
/* initializes Borland Graphics Interface in */
/* "audodetect" mode using default background */
/* and foreground colors, checks for errors in */
/* initialization, calls routine to draw circles, */
/* when finished waits for keystroke to erase */
/* screen and exit */
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode != grOk) /* an error occurred */
{
printf("Graphics error: %s\n",
grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
generate_circles();
getch();
closegraph();
return 0;
}
/************************************************/
void exit_if_kbhit()
/* exits program if a key has been struck */
/* returns otherwise */
{
if ( kbhit())
{
getch();
closegraph();
exit(1);
}
}