From albanycs!leah:rsb584 Wed Jan 27 00:56:12 1988
Received: by albanycs.albany.edu (5.54/4.8)
	id AA28394; Tue, 26 Jan 88 23:59:20 EST
Date: Tue, 26 Jan 88 23:59:14 EST
From: albanycs!leah:rsb584 (Raymond S Brand)
Received: by leah.Albany.EDU (5.58/1.1)
	id AA19837; Tue, 26 Jan 88 23:59:14 EST
Message-Id: <8801270459.AA19837@leah.Albany.EDU>
To: albanycs:beowulf!rsbx

>From ahg@k.cc.purdue.edu Sun Jan 24 14:54:21 1988
Path: leah!itsgw!nysernic!rutgers!princeton!udel!gatech!purdue!i.cc.purdue.edu!j.cc.purdue.edu!k.cc.purdue.edu!ahg
From: ahg@k.cc.purdue.edu (Allen Braunsdorf)
Newsgroups: comp.graphics
Subject: (Source and test data for) IFS Explorer 1.0
Keywords: by popular demand  fascinating pictures  new toys
Message-ID: <2353@k.cc.purdue.edu>
Date: 24 Jan 88 19:54:21 GMT
Organization: 3-D Computer Graphics From Hell
Lines: 822


Since my posting, I have received about fifty requests for the source to
my program.  I also received a few notes from people looking for compression
software.  Unfortunately, I do not yet have such a program done.

Below is the source to the latest version of my decompression program.  It
is a wonderful way to try out transforms just to see what they do.  It's a
little rough, and the documentation is a hack job, but I am sure many of you
will find it interesting or useful.

Also included are the data files from the Byte article (normalized to work in
my system) and a few of my own.  I can post information on how to make your
own data files if there is a demand.

If any of you make some neat ones, be sure to post them or send them to me!

#	This is a shell archive.
#	Remove everything above and including the cut line.
#	Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:	Shell Archiver
#	Run the following text with /bin/sh to create:
#	README
#	Makefile
#	dev.h
#	ifs.h
#	rnd.h
#	ifs.c
#	a.ifs
#	archimedes.ifs
#	box.ifs
#	boxes.ifs
#	circle.ifs
#	cross.ifs
#	dragon.ifs
#	fern.ifs
#	ring.ifs
#	sierpinski.ifs
#	square.ifs
#	star.ifs
#	tree.ifs
#	triangle.ifs
# This archive created: Sun Jan 24 14:45:24 1988
# By:	Allen Braunsdorf (3-D Computer Graphics From Hell)
echo shar: extracting README '(6933 characters)'
cat << \SHAR_EOF > README
IFS Explorer 1.0	(C)1988 by Allen Braunsdorf (ahg@k.cc.purdue.edu)

This program and its documentation may be freely copied and distributed for
nonprofit uses.


I. Introduction

	This program decodes iterated function systems (IFSs) into pictures
by using the UNIX(trademark of AT&T Bell Laboratories) device independent plot
libraries.  It is designed to be simple to install and use, yet be powerful
and interesting enough introduce the user to this fascinating new branch of
mathematics.

II. Installation

	If you do not have the plot library available, you will need to
rewrite the graphic parts of the program.  If this can be done gracefully
(ie: without disturbing a large portion of the code), I would be interested in
your patches, as they would likely be of use to many people.

	If you do have the plot library, look through the include file
dev.h for your output device, or one similar.  If you don't find it, either
make up a definition and add it to dev.h, or set "DEV = GENERIC" in the
Makefile.  If you do find it (or decide to roll your own), place the
appropriate name on the "DEV = " line of the Makefile.

	To make your own device definition, set as many of these as you know:

XMIN, YMIN		Left, bottom pixel
XMAX, YMAX		Right, top pixel

			These are usually unimportant to the program if you
		are using the plot library.  Specification of these is mainly
		a convenience.  XRES or YRES will be derived from these if
		they are given.
			The default values of these parameters are 0, 2047,
		0, and 2047.  This will make XRES = YRES = 2048.

XRES, YRES		Number of dots across, down on the device

			These are used by the program for scaling.  If a value
		too large is chosen, the image will appear more slowly.  If a
		value too small is chosen, the image will be grainy.
			If XMIN and XMAX are set, XRES will be set
		automatically to match their values.
			The default values of these parameters are 2048 and
		2048.  This should be large enough for most output devices.

XASP, YASP		How square the device is
NTSC			Is the device shaped like a TV?

			These parameters are real numbers.  They are a measure
		of how wide and tall the output area is.  If the graphics
		screen on your terminal were 10.5" by 8", you could define
		XASP as 10.5 and YASP as 8.0.
			If XFAC and YFAC are set, these values will be set to
		match.
			The default values for these parameters are 1.0 and
		1.0 unless NTSC is defined.  Then they are set to 4.0 and
		3.0 (or something equivalent).  This mimics a television's
		dimensions and is useful for personal computers.

XFAC, YFAC		How square a pixel is

			These tell how wide and tall a pixel is.  If your
		pixels are taller than they are wide, and you don't set these
		right, everything will appear stretched on your screen.  If
		you don't know what these are, just measure XASP and YASP
		properly.
			If XASP, YASP, XRES, and YRES are set, these values
		are derived.
			The default values for these parameters are 1.0 and
		1.0.

ONO			Don't offset my screen!

			IFS Explorer works on a square screen.  If your
		device isn't square, it will only use a part of it.  If ONO
		is not defined, this region should be centered.  If this
		isn't what you want [or it doesn't work!] define ONO.

	All of these parameters are set in the order that they are listed
above.  In other words, XRES is set by the time XFAC is decided on whether
you did it or not.
	All of this magic happens in ifs.h.  Look there for more details.

	Next, put the name or link option for your plot library on the
"LIB = " line.  This might look something like "LIB = -l4014" for a Tektronix
4014 terminal, or "LIB = -lex1000" for an Epson EX-1000 dot matrix printer.

	Next make sure RND is defined properly.  See rnd.h for details.  Add
the proper definitions in rnd.h and Makefile.

	Finally, just type "make" and the program should compile.

III. Format of input files

	The files used by this program are similar to the data sets shown in
Barnsley, M. F. and Sloan, A. D. "A Better Way to Compress Images."
Byte, January 1988, pp. 215-223.

	Each file consists of one or more transforms.  Each transform has
seven parameters, referred to as a, b, c, d, e, f, and p.  These should
be separated by white space, but are otherwise free format.  The file
should have one transform per line, and no blank lines.  After the
transforms, there is an additional line containing four numbers describing
the scale and origin of the image.  Every point in the image has its x
coordinate multiplied by the first of these and added to the third before
being scaled to the device and plotted.  Every point in the image has its y
coordinate multiplied by the second of these and added to the fourth before
being scaled to the device and plotted.  These can be used to zoom in on
a particular part of an image for closer examination.  These can also be
used if the image turns out upside down (YMIN and YMAX should be adjusted
first however).
	NOTE: The normalizing origin and scale parameters in the data file
(those given on the last line) are NOT in device coordinates.  The virtual
screen used by this program has (0, 0) at the lower left and (1, 1) at the
upper right.  The origin is described in these terms.
	Also, the sum of all the p parameters (the last column) must be 1.0,
or you will get an error.

IV.  Running

	IFS Explorer has one argument, the name of a data file to be plotted.
If this is left out, you'll get a "Usage" message.  Several example files are
included with the program.  Although all my data files have names that end
with ".ifs", that suffix is not necessary (ie: your file could just be called
"widget").

	The Explorer also has two options.  "-n" followed by a number tells
it how many points to plot (defaults to XRES*YRES).  "-o" followed by a number
tells it how many points to skip before it starts plotting points (defaults to
ten).

V. Future enhancements

	This program is still in its infancy, and it doesn't yet do everything
I want it to.  Here are a few things I hope to add soon (and to the Amiga
version):

	Autoprobability	If you don't know what to put for the last column,
			the program will generate something for you.

	Autoscaling	If you don't know what to put for the last line,
			the program will find out for you.

	Autostop	Will stop when the picture is done.  (Boy, this would
			be nice!)

	Color		Either with several bit planes, or some other trick.

	Multiple files	Would plot several systems on the screen at once.

	Different input file formats are also being considered.

	If anyone has any suggestions, comments, questions, or bug reports
about this program, please send them to me.
	Additionally, I am beginning work on an IFS compression program.
It is unlikely to be done any time soon.  Any additional information on
this subject would be greatly appreciated.

	I hope you enjoy this program.  It has been a real eye-opener for me.


SHAR_EOF
if test 6933 -ne "`wc -c README`"
then
echo shar: error transmitting README '(should have been 6933 characters)'
fi
echo shar: extracting Makefile '(453 characters)'
cat << \SHAR_EOF > Makefile
#
# IFS Explorer 1.0	(C)1988 by Allen Braunsdorf (ahg@k.cc.purdue.edu)
#

#
# Makefile	Change this rather than the other files, if possible.
#
# Choose a DEV (and its associated LIB) from dev.h.  Fill those in below.
# Define a random number generator in rnd.h and note it below.
#

DEV = GENERIC
LIB = -l4014
RND = RANDOM

CFLAGS = -s -O -D$(DEV) -D$(RND)

all: ifs

ifs: ifs.o
	cc -o ifs ifs.o $(LIB)

ifs.o: ifs.c ifs.h dev.h rnd.h

new:
	rm *.o ifs
SHAR_EOF
if test 453 -ne "`wc -c Makefile`"
then
echo shar: error transmitting Makefile '(should have been 453 characters)'
fi
echo shar: extracting dev.h '(915 characters)'
cat << \SHAR_EOF > dev.h
/*
 * IFS Explorer 1.0	(C)1988 by Allen Braunsdorf (ahg@k.cc.purdue.edu)
 *
 */

/*
 * dev.h	Device list for IFS Explorer 1.0
 *
 * Please add your favorite output device to the list below, or correct any
 * mistakes you believe exist herein.  Mail me the product.
 *
 * For details on these parameters, read the documentation.
 *
 */

/* Generic settings */

/* Use this if you don't want to recompile when you change output devices */
#ifdef GENERIC
#define ONO
#endif

/* Amiga terminal program (has bugs apparently!) */

#ifdef DBWTEK	/* -l4014 */
#define XRES	1028
#define YRES	780
#define XFAC	1.0
#define YFAC	1.0
#define ONO
#endif

/* Visual 550 terminal */

#ifdef V550	/* -l4014 */
#define XRES	1028
#define YRES	780
#define XFAC	1.0
#define YFAC	1.0
#define ONO
#endif

/* Epson EX-1000 printer */

#ifdef EX1000	/* -lex1000 */
#define XRES	864
#define YRES	648
#define	XFAC	1.0
#define	YFAC	1.0
#endif
SHAR_EOF
if test 915 -ne "`wc -c dev.h`"
then
echo shar: error transmitting dev.h '(should have been 915 characters)'
fi
echo shar: extracting ifs.h '(2540 characters)'
cat << \SHAR_EOF > ifs.h
/*
 * IFS Explorer 1.0	(C)1988 by Allen Braunsdorf (ahg@k.cc.purdue.edu)
 *
 */

/*
 * ifs.h	Intelligent include file for IFS Explorer 1.0
 *
 * Constants herein:
 *
 *	XMIN	Minimum X coordinate on output device
 *	XMAX	Maximum X coordinate on output device
 *	YMIN	Minimum Y coordinate on output device
 *	YMAX	Maximum Y coordinate on output device
 *	XRES >= Number of pixels in X direction
 *	YRES >= Number of pixels in Y direction
 *	XASP	Aspect ratio in X direction of whole screen
 *	YASP	Aspect ratio in Y direction of whole screen
 *	XFAC	Aspect ratio in X direction of pixel
 *	YFAC	Aspect ratio in Y direction of pixel
 *	NTSC	Device is NTSC (like a TV or most microcomputers)
 *
 * 	This file attempts to find reasonable values for omitted constants.
 * The safest thing to do is to define XRES, YRES, XFAC, and YFAC correctly.
 * The least safe (but hopefully OK) thing to do is to define NTSC if that
 * condition applies (width = height * 4/3), else nothing.
 *	Define things in the Makefile rather than here if possible.  Report
 * any problems to the author.
 *
 */

#if (defined(XRES) && !defined(XMIN) && !defined(XMAX))
# define XMAX	(XRES-1)
# define XMIN	0
#endif

#ifndef XMIN
# if (defined(XRES) && defined(XMAX))
#  define XMIN	((XMAX)-(XRES-1))
# else
#  define XMIN	0
# endif
#endif

#ifndef XMAX
# ifdef XRES
#  define XMAX	((XMIN)+(XRES-1))
# else
#  define XMAX	2047
# endif
#endif

#ifndef XRES
# define XRES	((XMAX)-(XMIN)+1)
#endif

#if (defined(YRES) && !defined(YMIN) && !defined(YMAX))
# define YMAX	(YRES-1)
# define YMIN	0
#endif

#ifndef YMIN
# if (defined(YRES) && defined(YMAX))
#  define YMIN	((YMAX)-(YRES-1))
# else
#  define YMIN	0
# endif
#endif

#ifndef YMAX
# ifdef YRES
#  define YMAX	((YMIN)+(YRES-1))
# else
#  define YMAX	2047
# endif
#endif

#ifndef YRES
# define YRES	((YMAX)-(YMIN)+1)
#endif

#ifndef XASP
# ifdef XFAC
#  define XASP	((XFAC)*(XRES))
# else
#  ifdef YASP
#   define XASP	YASP
#   ifdef NTSC
#    undef XASP
#    define XASP	(4.0*YASP/3.0)
#   endif
#  else
#   define XASP	1.0
#   ifdef NTSC
#    undef XASP
#    define XASP	4.0
#   endif
#  endif
# endif
#endif

#ifndef YASP
# ifdef YFAC
#  define YASP	((YFAC)*(YRES))
# else
#  define YASP	XASP
#  ifdef NTSC
#   undef YASP
#   define YASP	(3.0*XASP/4.0)
#  endif
# endif
#endif

/* This is only right if ((XASP) > (YASP)), but it's fixed in main() */

#ifndef XFAC
# ifndef YFAC
#  define YFAC	1.0
# endif
# define XFAC	(((XASP)*(YRES)*(YFAC))/((YASP)*(XRES)))
#else
# ifndef YFAC
#  define YFAC	1.0
# endif
#endif
SHAR_EOF
if test 2540 -ne "`wc -c ifs.h`"
then
echo shar: error transmitting ifs.h '(should have been 2540 characters)'
fi
echo shar: extracting rnd.h '(610 characters)'
cat << \SHAR_EOF > rnd.h
/*
 * IFS Explorer 1.0	(C)1988 by Allen Braunsdorf (ahg@k.cc.purdue.edu)
 *
 */

/*
 * rnd.h	How do I get a random number between 0 and 1 inclusive?
 *
 * Pick one of these and put it on the "RND = " line in the Makefile.
 * This list is terribly incomplete, but works on every machine 'round these
 * parts.  If you have an important addition, send it to me.
 *
 */

/* For BSD 4.3 */

#ifdef RANDOM
extern long random();
#define RND	(random()/2147483647.0)
#endif

/* For SYS V?  At least at our house! */

#ifdef ERAND48
extern double erand48();
unsigned short estuff[3];
#define RND	erand48(estuff)
#endif
SHAR_EOF
if test 610 -ne "`wc -c rnd.h`"
then
echo shar: error transmitting rnd.h '(should have been 610 characters)'
fi
echo shar: extracting ifs.c '(3844 characters)'
cat << \SHAR_EOF > ifs.c
/*
 * IFS Explorer 1.0	(C)1988 by Allen Braunsdorf (ahg@k.cc.purdue.edu)
 *
 * All rights reserved worldwide.  This program may be freely copied and
 * distributed for nonprofit uses.  Any commercial use without express
 * permission of the author is forbidden, as is removing this notice.
 *
 */

/*
 * ifs.c	IFS Decoder by Allen Braunsdorf
 * 		based on information found in Byte 1988/01 pp. 215-223
 *
 * Throughout:
 *	m	Number of transforms
 *	n	Number of iterations
 *	o	Number of initial points omitted from plot
 *	a-f	IFS matrix coefficients
 *	p[n]	Probability of point being in transform n
 */

#include <stdio.h>

#include "dev.h"
#include "ifs.h"
#include "rnd.h"

#define MAXLINE 80

int
main(argc, argv)
int argc;
char **argv;
{
	extern char *calloc();
	extern double atof();
	extern void exit();
	void plot();

	char sbW[MAXLINE];
	FILE *in;
	float *a, *b, *c, *d, *e, *f, *p;
	float xs, ys, xt, yt;
	float pt = 0.0, pk, x = 0.0, y = 0.0, newx, newy, XFac, YFac, xo, yo;
	int o = 10, i, k, m = -1, n = XRES*YRES, arg = 1;

	/* Print version number */

	fprintf(stderr, "IFS Explorer 1.0 by Allen Braunsdorf\n");

	/* Correction for tall screens */

	XFac = XFAC;
	YFac = YFAC;
	if ((XASP) > (YASP)) {
		XFac /= YFac;
		YFac /= YFac;
		xo = (XRES*XFac-YRES*YFac)/(2.0*XFac);
		yo = 0.0;
	} else {
		XFac /= XFac;
		YFac /= XFac;
		xo = 0.0;
		yo = (YRES*YFac-XRES*XFac)/(2.0*YFac);
	}
#ifdef ONO	/* No offset */
	xo = 0.0;
	yo = 0.0;
#endif

	if (2 > argc) {
		fprintf(stderr, "Usage: %s -n points -o omitted IFSfile\n",
			argv[0]);
		exit(-1);
	}
	while (arg < (argc-1)) {
		if ('-' == argv[arg][0]) {
			switch (argv[arg][1]) {
			case 'n':
				n = atoi(argv[++arg]);
				break;
			case 'o':
				o = atoi(argv[++arg]);
				break;
			default:
				fprintf(stderr, "Error: bad option \'%s\'\n",
					argv[arg]);
				exit(-1);
			}
			++arg;
		} else {
			fprintf(stderr, "Error: one file only (for now)\n");
			exit(-1);
		}
	}
	n += o;
	fprintf(stderr, "Iterations: %d\n", n);
	fprintf(stderr, "Omitting: %d\n", o);

	if (NULL == (in = fopen(argv[arg], "r"))) {
		fprintf(stderr, "Error: can't open input file\n");
		exit(-1);
	}
	while (fgets(sbW, MAXLINE, in)) {
		++m;
	}
	fclose(in);

	if (-1 == m) {
		fprintf(stderr, "Error: input file empty?!\n");
		exit(-1);
	}
	if (0 == m) {
		fprintf(stderr, "Error: input file invalid\n");
		exit(-1);
	}
	a = (float *)calloc((unsigned)m, sizeof(float));
	b = (float *)calloc((unsigned)m, sizeof(float));
	c = (float *)calloc((unsigned)m, sizeof(float));
	d = (float *)calloc((unsigned)m, sizeof(float));
	e = (float *)calloc((unsigned)m, sizeof(float));
	f = (float *)calloc((unsigned)m, sizeof(float));
	p = (float *)calloc((unsigned)m, sizeof(float));

	if (NULL == (in = fopen(argv[arg], "r"))) {
		fprintf(stderr, "Error: can't open input file\n");
		exit(-1);
	}
	fprintf(stderr, "Transforms: %d\n", m);
	for (i = 0; i < m; ++i) {
		fscanf(in, "%f %f %f %f %f %f %f", a+i, b+i, c+i, d+i,
			e+i, f+i, p+i);
		fprintf(stderr, "\t%f %f %f %f %f %f %f\n", a[i], b[i], c[i],
			d[i], e[i], f[i], p[i]);
		pt += p[i];
		p[i] = pt;
	}
	fscanf(in, "%f %f %f %f", &xs, &ys, &xt, &yt);
	fprintf(stderr, "Transforming by: %f %f %f %f\n", xs, ys, xt, yt);
	if ((0.01 < pt-1.0) || (0.01 < 1.0-pt)) {
		fprintf(stderr, "Error: nonunity probability: %f\n", pt);
		exit(-1);
	}
	fclose(in);

	space(XMIN, YMIN, XMAX, YMAX);
	openpl();
	erase();
	while (n--) {
		pk = RND;
		for (i = 0; i < m; ++i) {
			if (pk <= p[i]) {
				k = i;
				break;
			}
		}
		newx = a[k]*x+b[k]*y+e[k];
		newy = c[k]*x+d[k]*y+f[k];
		x = newx;
		y = newy;
		if (o) {
			--o;
		} else {
			plot((int)((x*xs*XFAC+xt)*(XRES-1)+xo)+XMIN,
				(int)((y*ys*YFAC+yt)*(YRES-1)+yo)+YMIN);
		}
	}
	closepl();
}

void
plot(x, y)
int x, y;
{
	if ((XMIN <= x) && (YMIN <= y) && (XMAX >= x) && (YMAX >= y)) {
		point(x, y);
	}
}
SHAR_EOF
if test 3844 -ne "`wc -c ifs.c`"
then
echo shar: error transmitting ifs.c '(should have been 3844 characters)'
fi
echo shar: extracting a.ifs '(126 characters)'
cat << \SHAR_EOF > a.ifs
0.50	0.00	1.00	0.00	0.00	0.00	0.33
0.50	0.00	-1.00	0.00	0.50	1.00	0.33
0.50	0.00	0.00	0.00	0.25	0.50	0.34
1.00	1.00	0.00	0.00
SHAR_EOF
if test 126 -ne "`wc -c a.ifs`"
then
echo shar: error transmitting a.ifs '(should have been 126 characters)'
fi
echo shar: extracting archimedes.ifs '(102 characters)'
cat << \SHAR_EOF > archimedes.ifs
0.9972772 0.0061192 -0.0061192 0.9972772 0.0 0.0 0.999
0.0	0.0	0.0	0.0	-1.0	0.0	0.001
0.5	0.5	0.5	0.5
SHAR_EOF
if test 102 -ne "`wc -c archimedes.ifs`"
then
echo shar: error transmitting archimedes.ifs '(should have been 102 characters)'
fi
echo shar: extracting box.ifs '(160 characters)'
cat << \SHAR_EOF > box.ifs
0.50	0.50	0.00	0.00	0.00	0.00	0.25
0.50	0.50	0.00	0.00	0.00	1.00	0.25
0.00	0.00	0.50	0.50	0.00	0.00	0.25
0.00	0.00	0.50	0.50	1.00	0.00	0.25
1.00	1.00	0.00	0.00
SHAR_EOF
if test 160 -ne "`wc -c box.ifs`"
then
echo shar: error transmitting box.ifs '(should have been 160 characters)'
fi
echo shar: extracting boxes.ifs '(200 characters)'
cat << \SHAR_EOF > boxes.ifs
0.50	0.50	0.00	0.00	0.00	0.00	0.166
0.50	0.50	0.00	0.00	0.00	1.00	0.166
0.00	0.00	0.50	0.50	0.00	0.00	0.166
0.00	0.00	0.50	0.50	1.00	0.00	0.166
0.50	0.00	0.00	0.50	0.25	0.25	0.336
1.00	1.00	0.00	0.00
SHAR_EOF
if test 200 -ne "`wc -c boxes.ifs`"
then
echo shar: error transmitting boxes.ifs '(should have been 200 characters)'
fi
echo shar: extracting circle.ifs '(103 characters)'
cat << \SHAR_EOF > circle.ifs
0.9999811 -0.00613588 0.00613588 0.9999811	0.0	0.0	0.999
0.0	0.0	0.0	0.0	1.0	0.0	0.001
0.5	0.5	0.5	0.5
SHAR_EOF
if test 103 -ne "`wc -c circle.ifs`"
then
echo shar: error transmitting circle.ifs '(should have been 103 characters)'
fi
echo shar: extracting cross.ifs '(170 characters)'
cat << \SHAR_EOF > cross.ifs
-0.50	-0.50	0.00	0.00	0.50	0.00	0.25
-0.50	-0.50	0.00	0.00	-0.50	0.00	0.25
0.00	0.00	-0.50	-0.50	0.00	0.50	0.25
0.00	0.00	-0.50	-0.50	0.00	-0.50	0.25
0.50	0.50	0.50	0.50
SHAR_EOF
if test 170 -ne "`wc -c cross.ifs`"
then
echo shar: error transmitting cross.ifs '(should have been 170 characters)'
fi
echo shar: extracting dragon.ifs '(81 characters)'
cat << \SHAR_EOF > dragon.ifs
0.5	-0.5	0.5	0.5	1.0	0.0	0.5
0.5	-0.5	0.5	0.5	-1.0	0.0	0.5
0.1875	0.1875	0.5	0.5
SHAR_EOF
if test 81 -ne "`wc -c dragon.ifs`"
then
echo shar: error transmitting dragon.ifs '(should have been 81 characters)'
fi
echo shar: extracting fern.ifs '(163 characters)'
cat << \SHAR_EOF > fern.ifs
0.00	0.00	0.00	0.16	0.00	0.00	0.01
0.20	-0.26	0.23	0.22	0.00	1.60	0.07
-0.15	0.28	0.26	0.24	0.00	0.44	0.07
0.85	0.04	-0.04	0.85	0.00	1.60	0.85
0.10	0.10	0.50	0.00
SHAR_EOF
if test 163 -ne "`wc -c fern.ifs`"
then
echo shar: error transmitting fern.ifs '(should have been 163 characters)'
fi
echo shar: extracting ring.ifs '(75 characters)'
cat << \SHAR_EOF > ring.ifs
0.8	0.6	-0.6	0.8	0.0	0.0	0.99
0.0	0.0	0.0	0.0	1.0	0.0	0.01
0.5	0.5	0.5	0.5
SHAR_EOF
if test 75 -ne "`wc -c ring.ifs`"
then
echo shar: error transmitting ring.ifs '(should have been 75 characters)'
fi
echo shar: extracting sierpinski.ifs '(125 characters)'
cat << \SHAR_EOF > sierpinski.ifs
0.50	0.00	0.00	0.50	0.00	0.00	0.33
0.50	0.00	0.00	0.50	1.00	0.00	0.33
0.50	0.00	0.00	0.50	0.50	0.50	0.34
0.50	1.00	0.00	0.00
SHAR_EOF
if test 125 -ne "`wc -c sierpinski.ifs`"
then
echo shar: error transmitting sierpinski.ifs '(should have been 125 characters)'
fi
echo shar: extracting square.ifs '(160 characters)'
cat << \SHAR_EOF > square.ifs
0.50	0.00	0.00	0.50	0.00	0.00	0.25
0.50	0.00	0.00	0.50	0.50	0.00	0.25
0.50	0.00	0.00	0.50	0.00	0.50	0.25
0.50	0.00	0.00	0.50	0.50	0.50	0.25
1.00	1.00	0.00	0.00
SHAR_EOF
if test 160 -ne "`wc -c square.ifs`"
then
echo shar: error transmitting square.ifs '(should have been 160 characters)'
fi
echo shar: extracting star.ifs '(143 characters)'
cat << \SHAR_EOF > star.ifs
0.3090169 -0.9510565 0.9510565 0.3090169 0.0	0.0	0.85
-0.999	0.0	0.0	0.0	0.0	0.3249196	0.10
0.0	0.0	0.0	0.0	1.0	0.3249196	0.05
0.5	0.5	0.5	0.5
SHAR_EOF
if test 143 -ne "`wc -c star.ifs`"
then
echo shar: error transmitting star.ifs '(should have been 143 characters)'
fi
echo shar: extracting tree.ifs '(162 characters)'
cat << \SHAR_EOF > tree.ifs
0.00	0.00	0.00	0.50	0.00	0.00	0.05
0.10	0.00	0.00	0.10	0.00	0.20	0.15
0.42	-0.42	0.42	0.42	0.00	0.20	0.40
0.42	0.42	-0.42	0.42	0.00	0.20	0.40
2.00	2.00	0.50	0.00
SHAR_EOF
if test 162 -ne "`wc -c tree.ifs`"
then
echo shar: error transmitting tree.ifs '(should have been 162 characters)'
fi
echo shar: extracting triangle.ifs '(103 characters)'
cat << \SHAR_EOF > triangle.ifs
-1.0	0.0	0.0	0.0	1.0	0.0	0.34
0.5	0.0	0.866	0.0	0.0	0.0	0.33
0.5	0.0	-0.866	0.0	0.5	0.866	0.33
1	1	0	0
SHAR_EOF
if test 103 -ne "`wc -c triangle.ifs`"
then
echo shar: error transmitting triangle.ifs '(should have been 103 characters)'
fi
#	End of shell archive
exit 0

Allen Braunsdorf			WORK	k.cc.purdue.edu!ahg
General Consultant			SCHOOL	ei.ecn.purdue.edu!braunsdo
Purdue University Computing Center	HOME	ee.ecn.purdue.edu!gawk!akb


