AUSAM/source/libt/exprogs/pat.c
#include <cplot.h>
#include "ask.c"
#define magicnumber 497
/*
*
* Fancy pattern drawer
*
* Adrian Freed
*
*/
#define POINTMAX 200
float x[POINTMAX], y[POINTMAX], xt[POINTMAX], yt[POINTMAX], r;
int s;
int numpoi;
main( argc, argv )
char **argv;
int argc;
{
float xsmall, ysmall, xlarge, ylarge;
FILE *fd;
int j, k, t;
char ans[30];
char kc;
fd = NULL;
init( stdout );
swindow( 0, 1023, 0, 780 );
uwindow( -1.0, 1.0, -1.0, 1.0 );
while( argc-- != 1 )
{
argv++;
if( (fd = fopen( *argv, "r" )) == NULL )
{
perror( *argv );
continue;
}
if( reload( fd ) )
{
home();
alpha();
fprintf( stderr, "%s: bad format\n", *argv);
sleep(1);
}
else
{
bell();
genpat();
fclose(fd);
}
}
if( fd != NULL )
{
finish();
exit();
}
for( ;; )
{
erase();
srect( 10, 10, 1020, 770 );
/* Get pattern co-ords. */
kc = 0;
ucursor( &x[0], &y[0]);
upointa( x[0], y[0] );
for( numpoi = 1; kc != 'P'; numpoi++ )
{
kc = ucursor( &x[numpoi], &y[numpoi]);
udrawa( x[numpoi], y[numpoi] );
}
numpoi--;
for( ;; )
{
ask( 20, 700,"how many iterations? " , ans );
if( (s = atoi( ans )) == 0 ) continue;
ask( 20, 680, "spin rate? ", ans );
r = atof( ans );
/* copy co-ords into temporary array */
for( j=0; j<=numpoi; j++ )
{
xt[j] = x[j];
yt[j] = y[j];
}
/* Find minimum and maximum x and y */
xsmall = ysmall = 1.0;
xlarge = ylarge = -1.0;
for( k = 1; k < s; k++ )
{
for( j = 1; j <= numpoi; j++ )
{
xt[j] = xt[j] + ( xt[j-1] - xt[j] ) * (r);
yt[j] = yt[j] + ( yt[j-1] - yt[j] ) * (r);
if( xt[j] > xlarge ) xlarge = xt[j];
if( yt[j] > ylarge ) ylarge = yt[j];
if( xt[j] < xsmall ) xsmall = xt[j];
if( y[j] < ysmall ) ysmall = y[j];
}
xt[0] = xt[0] - ( xt[0] - xt[numpoi+1] )*(r);
yt[0] - yt[0] + ( yt[0] - yt[numpoi+1] )*(r);
if( xt[0] > xlarge ) xlarge = xt[0];
if( yt[0] > ylarge ) ylarge = yt[0];
if( xt[0] < xsmall ) xsmall = xt[0];
if( yt[0] < ysmall ) ysmall = yt[0];
}
/* Set up window according to pattern's size */
xsmall =- 0.20;
ysmall =- 0.20;
xlarge =+ 0.20;
ylarge =+ 0.20;
uwindow( xsmall, xlarge, ysmall, ylarge );
genpat();
ask(20, 50, "do you want that pattern? ", ans);
if( *ans == 'y' )
{
ask( 20, 30, "what would you like to call it? ", ans);
if( (fd = fopen( ans, "w" )) == NULL )
{
perror( ans );
}
else
{
dump( fd );
fflush( fd );
fclose( fd );
}
}
ask(20, 10, "do you want to enter a new pattern? ", ans);
if( *ans == 'y' ) break;
}
erase();
}
finish();
}
genpat()
{
register int j, k;
erase();
/* replace co-ords */
for( j=0; j <= numpoi; j++ )
{
xt[j] = x[j];
yt[j] = y[j];
}
/* Got to start somewhere */
umovea( xt[0], yt[0] );
for( k = 1; k < s; k++ )
{
for( j = 1; j <= numpoi; j++ )
{
udrawa( xt[j], yt[j] );
xt[j] = xt[j] + ( xt[j-1] - xt[j] ) * (r);
yt[j] = yt[j] + ( yt[j-1] - yt[j] ) * (r);
}
udrawa( xt[0], yt[0] );
xt[0] = xt[0] - ( xt[0] - xt[numpoi+1] )*(r);
yt[0] = yt[0] - ( yt[0] - yt[numpoi+1] )*(r);
}
}
dump( file )
FILE *file;
{
putw( magicnumber, file );
putw( numpoi, file );
fwrite( &r, sizeof( r ), 1, file );
fwrite( &s, sizeof( s ), 1, file );
fwrite( x, sizeof( *x ), numpoi+1, file );
fwrite( y, sizeof( *y ), numpoi+1, file );
}
reload( file )
FILE *file;
{
if(getw(file) != magicnumber)
return(-1);
numpoi = getw( file );
fread( &r, sizeof( r ), 1, file );
fread( &s, sizeof( s ), 1, file );
fread( x, sizeof( *x ), numpoi+1, file );
fread( y, sizeof( *y ), numpoi+1, file );
if(ferror(file))
return(-1);
return(0);
}