Thread View: mod.computers.masscomp
1 messages
1 total messages
Started by Stan Barber
Wed, 03 Sep 1986 03:27
Fractals on the Masscomp
Author: Stan Barber
Date: Wed, 03 Sep 1986 03:27
Date: Wed, 03 Sep 1986 03:27
775 lines
20107 bytes
20107 bytes
This is a 2-d fractal program that has passed around on the net.
I have attempted to make it work on the Masscomp.
Modify it if you wish, but pass the changes along.
Stan
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
# Makefile
# README
# general.c
# gosper.c
# init.c
# koch.c
# main.c
# monkey.c
# plot.c
# defs.h
# g.h
# gen.h
# pix.h
# This archive created: Tue Sep 2 15:52:49 1986
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'Makefile'" '(563 characters)'
if test -f 'Makefile'
then
echo shar: "will not over-write existing file 'Makefile'"
else
sed 's/^ X//' << \SHAR_EOF > 'Makefile'
XGENOBJ = init.o plot.o
XFRACTOBJ = general.o koch.o monkey.o gosper.o
X# LIB = -lm -lpixrect
XLIB = -lm -lgp
XCFLAGS = -O
X
Xfractals: main.o $(FRACTOBJ) $(GENOBJ)
X cc -o fractals $(CFLAGS) main.o $(FRACTOBJ) $(GENOBJ) $(LIB)
X
Xkoch.o: koch.c gen.h g.h
X cc $(CFLAGS) -c koch.c
X
Xmonkey.o: monkey.o gen.h g.h
X cc $(CFLAGS) -c monkey.c
X
Xgosper.o: gosper.c gen.h g.h
X cc $(CFLAGS) -c gosper.c
X
Xgeneral.o: general.c gen.h g.h
X cc $(CFLAGS) -c general.c
X
Xplot.o: plot.c g.h pix.h
X cc $(CFLAGS) -c plot.c
X
Xinit.o: init.c defs.h
X cc $(CFLAGS) -c init.c
X
Xclean:
X rm *.o fractals
SHAR_EOF
if test 563 -ne "`wc -c < 'Makefile'`"
then
echo shar: "error transmitting 'Makefile'" '(should have been 563 characters)'
fi
fi
echo shar: "extracting 'README'" '(1270 characters)'
if test -f 'README'
then
echo shar: "will not over-write existing file 'README'"
else
sed 's/^ X//' << \SHAR_EOF > 'README'
X
X
X These files:
X
X defs.h random definitions
X pix.h pixrect definitions
X g.h few constants
X gen.h generator structure
X
X general.c a general curve generator
X gosper.c gosper curve generator
X koch.c koch curve generator
X monkey.c monkey curve generator (My favorite)
X
X plot.c plot a line relatively
X main.c trivial driver for all the routines
X init.c routines to setup screen under pixrect
X
X Comprise a collection of simple fractal curve generators.
X They do not generate nifty 3D dragons or towers or archs,
X but they are entertaining and probably good for tiling.
X
X All I ask is that you not (how incredibly unlikely) try
X to sell these for profit. I can ofcourse assume no respon-
X sibility for how these work out for you. They work fine for
X me on a SUN (TM) workstation under 4.2 Unix (TM) using SUN-
X core. [Now under pixrect ... -David Kovar]
X
X Jim Hutchison
X
X hutch@sdcsvax
X
X {ihnp4,ucbvax}!sdcsvax!hutch
XADDITIONAL NOTE:
XI have added modification to work on Masscomp displays. To use under Sun's again,
Xadjust the Makefile as marked.
XStan Barber (sob@rice.edu or siesmo!soma!sob)
X
SHAR_EOF
if test 1270 -ne "`wc -c < 'README'`"
then
echo shar: "error transmitting 'README'" '(should have been 1270 characters)'
fi
fi
echo shar: "extracting 'general.c'" '(676 characters)'
if test -f 'general.c'
then
echo shar: "will not over-write existing file 'general.c'"
else
sed 's/^ X//' << \SHAR_EOF > 'general.c'
X/*
X * general()
X *
X * Draw a Generic Fractal curve.
X *
X * Author: Jim Hutchison (hutch@sdcsvax)
X * (this is free, but credit me)
X */
X
X#ifdef sun
X#include <usercore.h>
X#endif
X#include <math.h>
X#include "g.h"
X#include "gen.h"
X
Xgeneral(len,angle,min_len,scale,flip,shape,size)
Xdouble len,angle,min_len,scale;
Xint flip;
XGEN *shape;
Xint size;
X{
Xregister int i;
XGEN *gp;
X
X if (len > min_len) { /* draw generator */
X gp = shape + ((flip == 1)? 0 : size );
X for(i = 0 ; i < GEN_SIDES ; i++, gp += flip)
X general(len/gp->div,
X angle + gp->angle,
X min_len,
X scale * gp->scale,
X gp->flip * flip);
X
X } else /* draw side */
X plot_line(len * scale, angle);
X}
SHAR_EOF
if test 676 -ne "`wc -c < 'general.c'`"
then
echo shar: "error transmitting 'general.c'" '(should have been 676 characters)'
fi
fi
echo shar: "extracting 'gosper.c'" '(1000 characters)'
if test -f 'gosper.c'
then
echo shar: "will not over-write existing file 'gosper.c'"
else
sed 's/^ X//' << \SHAR_EOF > 'gosper.c'
X/*
X * Gosper()
X *
X * Draw a Gosper curve according to Dr. Mandelbrot.
X * start with flip at 1 usually, but -1 is fine also.
X *
X * Author: Jim Hutchison (hutch@sdcsvax)
X * (this is free, but credit me)
X */
X
X#ifdef sun
X#include <usercore.h>
X#endif
X#include <math.h>
X#include "g.h"
X#include "gen.h"
X
X#ifdef GEN_SIDES
X#undef GEN_SIDES
X#endif
X#define GEN_SIDES 7
X#define GEN_MAX GEN_SIDES - 1L
Xstatic GEN generator[GEN_SIDES] = {
X /* angle flip */
X
X { 0.0, 1 },
X { PIO3, -1 },
X { PI, -1 },
X { (2.0 * PIO3), 1 },
X { 0.0, 1 },
X { 0.0, 1 },
X { (TWOPI - PIO3), -1 }
X};
X
Xgosper(len,angle,min_len,flip)
Xdouble len,angle,min_len;
Xint flip;
X{
Xregister int i;
Xregister GEN *gp;
X
X if (len > min_len) { /* draw generator */
X angle += (TWOPI - PIO6);/* tilt */
X gp = &generator[ (flip == 1)? 0 : GEN_MAX ];
X for(i = 0 ; i < GEN_SIDES ; i++, gp += flip)
X gosper(len/2.0, angle + gp->angle, min_len, gp->flip * flip);
X }
X else /* draw side */
X plot_line(len, angle);
X}
SHAR_EOF
if test 1000 -ne "`wc -c < 'gosper.c'`"
then
echo shar: "error transmitting 'gosper.c'" '(should have been 1000 characters)'
fi
fi
echo shar: "extracting 'init.c'" '(2600 characters)'
if test -f 'init.c'
then
echo shar: "will not over-write existing file 'init.c'"
else
sed 's/^ X//' << \SHAR_EOF > 'init.c'
X#ifdef mc300
X#define MASSCOMP
X#endif
X#ifdef mc500
X#define MASSCOMP
X#endif
X#ifdef mc700
X#define MASSCOMP
X#endif
X#include <stdio.h>
X#ifndef MASSCOMP
X#include <pixrect/pixrect_hs.h>
X#endif
X#include <sys/ioctl.h>
X#ifdef sun
X#include <sun/fbio.h>
X#endif
X#include <sys/file.h>
X
X#include "defs.h"
X
X#ifndef MASSCOMP
Xchar *PR_DEVICE = "/dev/fb"; /* for console frame buffer */
X
Xstruct pixrect *px_screen; /* console screen pixrect */
X#else
Xint gp_assigned;
X#endif
Xint SCREEN_WIDTH, SCREEN_HEIGHT;
X
X/*
X * Set up the screen for the subsequent screen graphics mmanipulations.
X * All operations are done with the pixrect facilities of the SUN
X * workstation 1.1 release.
X */
X
Xinitpix()
X{
X char *getenv();
X
X if (init_screen())
X return(-1);
X
X#ifdef notdef
X pr_rop(px_screen, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, PIX_SET,
X (struct pixrect *)NULL, 0, 0);
X#endif
X return(0);
X}
X
X
X/*
X * Initialize the pixrect from the whole screen.
X */
X
Xinit_screen()
X{
X
X#ifdef MASSCOMP
X int hwconfig[18];
X if (gp_assigned == 0){
X mgiasngp(0,0); /* assign default graphics processor */
X mgigethc(18, hwconfig);
X SCREEN_WIDTH = hwconfig[0];
X SCREEN_HEIGHT = hwconfig[1];
X gp_assigned++;
X if ( SCREEN_WIDTH <= 0 || SCREEN_HEIGHT <= 0 ) {
X fprintf(stderr, "Can't get the window size.\n");
X return(-1);
X }
X }
X mgiclearpln(0, -1, 0);
X mgihue(2);
X#else
X int fd;
X if ( (fd = open(PR_DEVICE, O_RDWR)) < 0 ) {
X fprintf(stderr, "Cannot open \"%s\": %s\n", PR_DEVICE, ERRSTR);
X return(-1);
X }
X if ( getsize(fd) )
X return(-1);
X close(fd);
X
X if ((px_screen = pr_open(PR_DEVICE)) == NULL) {
X fputs("Cannot open ", stderr);
X perror(PR_DEVICE);
X return(-1);
X }
X
X return(0);
X#endif
X}
X
X
X#ifndef MASSCOMP
X/*
X * Get the number of pixels of the screen size. If the size
X * is zero, we assume an error.
X */
X
Xgetsize(fd)
X{
X struct fbtype fbt;
X
X if (ioctl(fd, FBIOGTYPE, (char *)&fbt) < 0) {
X perror("FBIOGTYPE ioctl");
X return(-1);
X }
X
X SCREEN_WIDTH = fbt.fb_width;
X SCREEN_HEIGHT = fbt.fb_height;
X
X if ( SCREEN_WIDTH <= 0 || SCREEN_HEIGHT <= 0 ) {
X fprintf(stderr, "Can't get the window size.\n");
X return(-1);
X }
X
X return(0);
X}
X#endif
X
Xclosepix()
X{
X#ifdef MASSCOMP
X if (gp_assigned) mgideagp();
X#endif
X return(0);
X}
echo shar: "a missing newline was added to 'init.c'"
SHAR_EOF
if test 2600 -ne "`wc -c < 'init.c'`"
then
echo shar: "error transmitting 'init.c'" '(should have been 2600 characters)'
fi
fi
echo shar: "extracting 'koch.c'" '(940 characters)'
if test -f 'koch.c'
then
echo shar: "will not over-write existing file 'koch.c'"
else
sed 's/^ X//' << \SHAR_EOF > 'koch.c'
X/*
X * koch()
X *
X * Draw a Koch lake according to Dr. Mandelbrot.
X *
X * Author: Jim Hutchison (hutch@sdcsvax)
X * (this is free, but credit me)
X */
X
X#ifdef sun
X#include <usercore.h>
X#endif
X#include <math.h>
X#include "g.h"
X#include "gen.h"
X
Xkoch(len,angle,min_len)
Xdouble len,angle,min_len;
X{
Xint i;
X
X for (i = 0 ; i < 4 ; i++, angle += PIO2) /* square seed */
X koch_side(len, angle, min_len);
X}
X
X#ifdef GEN_SIDES
X#undef GEN_SIDES
X#endif
X#define GEN_SIDES 8
X
XGEN genkoch[GEN_SIDES] = {
X /* Angle */
X { 0.0 },
X { PIO2 },
X { 0.0 },
X { - PIO2 },
X { - PIO2 },
X { 0.0 },
X { PIO2 },
X { 0.0 }
X};
X
X/*
X * Draw a side recursively.
X */
X
Xkoch_side(len,angle,min_len)
Xdouble len,angle,min_len;
X{
Xregister int i;
XGEN *gp;
X
X if (len > min_len) /* draw generator */
X for(i = 0, gp = genkoch ; i < GEN_SIDES ; i++, gp++)
X koch_side(len/2.0, angle + gp->angle, min_len);
X else /* draw side */
X plot_line(len, angle);
X}
SHAR_EOF
if test 940 -ne "`wc -c < 'koch.c'`"
then
echo shar: "error transmitting 'koch.c'" '(should have been 940 characters)'
fi
fi
echo shar: "extracting 'main.c'" '(1292 characters)'
if test -f 'main.c'
then
echo shar: "will not over-write existing file 'main.c'"
else
sed 's/^ X//' << \SHAR_EOF > 'main.c'
X#include <stdio.h>
Xmain()
X{
X int choice = 0;
X double len, angle, min_len, scale;
X int flip;
X
X while(choice < 1 || choice > 4) {
X printf("Choose a fractal: \n");
X printf("\t1) Monkey \n");
X printf("\t2) Koch lakes \n");
X printf("\t3) General (not handled yet)\n");
X printf("\t4) Gosper\n");
X
X printf("\nChoice? ");
X scanf("%d", &choice);
X }
X
X printf("All values should be doubles (xxx.x) save for 'flip', an int.\n");
X printf("Reasonable values for monkey are: 10.0 0.0 1.0 1.0 1 \n");
X
Xswitch (choice) {
X case 1: /* Monkey */
X printf ("Length, angle, min. length, scale, flip: ");
X scanf ("%lf %lf %lf %lf %d",
X &len, &angle, &min_len, &scale, &flip);
X initpix(); /* initialize the graphics device */
X monkey (len, angle, min_len, scale, flip);
X break;
X case 2: /* Koch lakes */
X printf ("Length, angle, minimum length: ");
X scanf ("%lf %lf %lf", &len, &angle, &min_len);
X initpix();
X koch (len, angle, min_len);
X break;
X case 3: /* General. Not handled yet */
X printf ("Not handled.\n");
X break;
X case 4:
X printf ("Length, angle, minimum length, flip: ");
X scanf ("%lf %lf %lf %", &len, &angle, &min_len, &flip);
X initpix();
X gosper (len, angle, min_len, flip);
X break;
X}
X closepix(); /* close the graphics device */
X}
SHAR_EOF
if test 1292 -ne "`wc -c < 'main.c'`"
then
echo shar: "error transmitting 'main.c'" '(should have been 1292 characters)'
fi
fi
echo shar: "extracting 'monkey.c'" '(1281 characters)'
if test -f 'monkey.c'
then
echo shar: "will not over-write existing file 'monkey.c'"
else
sed 's/^ X//' << \SHAR_EOF > 'monkey.c'
X/*
X * Monkey()
X *
X * Draw a Monkey curve according to Dr. Mandelbrot.
X *
X * Author: Jim Hutchison (hutch@sdcsvax)
X * (this is free, but credit me)
X */
X
X#ifdef sun
X#include <usercore.h>
X#endif
X#include <math.h>
X#include "g.h"
X#include "gen.h"
X
X#ifdef GEN_SIDES
X#undef GEN_SIDES
X#endif
X#define GEN_SIDES 11
X#define GEN_MAX GEN_SIDES - 1
X
XGEN genmonkey[GEN_SIDES] = {
X /* Angle Flip Scale */
X
X { PIO3, -1, 1.0 }, /* R */
X { PIO3, 1, 1.0 }, /* L */
X { 0.0, 1, 1.0 }, /* L */
X { (TWOPI - PIO3), 1, 1.0 }, /* L */
X
X { (2.0 * PIO3 + PIO6), 1, 0.5 }, /* L */
X { (2.0 * PIO3 + PIO6), -1, 0.5 }, /* R */
X { (PI + PIO6), -1, 0.5 }, /* R */
X { (TWOPI - PIO2), -1, 0.5 }, /* R */
X { (TWOPI - PIO2), 1, 0.5 }, /* L */
X
X { 0.0, -1, 1.0 }, /* R */
X { 0.0, 1, 1.0 } /* L */
X};
X
X/*
X * Draw a monkey curve
X */
X
Xmonkey(len,angle,min_len,scale,flip)
Xdouble len,angle,min_len,scale;
Xint flip;
X{
Xregister int i;
XGEN *gp;
X
X if (len > min_len) { /* draw generator */
X gp = &genmonkey[ (flip == 1)? 0 : GEN_MAX ];
X for(i = 0 ; i < GEN_SIDES ; i++, gp += flip)
X monkey(len/2.0,
X angle + gp->angle,
X min_len,
X scale * gp->scale,
X gp->flip * flip);
X
X } else /* draw side */
X plot_line(len * scale, angle);
X}
SHAR_EOF
if test 1281 -ne "`wc -c < 'monkey.c'`"
then
echo shar: "error transmitting 'monkey.c'" '(should have been 1281 characters)'
fi
fi
echo shar: "extracting 'plot.c'" '(987 characters)'
if test -f 'plot.c'
then
echo shar: "will not over-write existing file 'plot.c'"
else
sed 's/^ X//' << \SHAR_EOF > 'plot.c'
X/*
X * Plot_line()
X *
X * Draw a line by length and angle relative to current x,y
X *
X * Author: Jim Hutchison (hutch@sdcsvax)
X * (this is free, but dis/credit me)
X */
X#ifdef mc300
X#define MASSCOMP
X#endif
X#ifdef mc500
X#define MASSCOMP
X#endif
X#ifdef mc700
X#define MASSCOMP
X#endif
X#include <math.h>
X#include "g.h"
X#ifdef sun
X#include "pix.h"
X#endif
X
Xstatic double crntx = D_X, crnty = D_Y; /* or global for presetting */
X
Xset_coord(x,y)
Xdouble x,y;
X{
X crntx = x;
X crnty = y;
X}
X
X/*
X * Plot a line by length and angle from current position
X */
X
Xplot_line(length,angle)
Xdouble length,angle;
X{
Xdouble dx,dy;
X
X MOD(angle,TWOPI);
X
X dx = length * cos(angle);
X dy = length * sin(angle);
X
X#ifdef MASSCOMP
X mgil((int)(crntx * 10.0), (int)(crnty * 10.0),
X (int)((crntx + dx) * 10.0), (int)((crnty + dy) * 10.0));
X#else
X line((int)(crntx * 10.0), (int)(crnty * 10.0),
X (int)((crntx + dx) * 10.0), (int)((crnty + dy) * 10.0), OP_WRITE);
X#endif
X crntx += dx;
X crnty += dy;
X}
X
X
SHAR_EOF
if test 987 -ne "`wc -c < 'plot.c'`"
then
echo shar: "error transmitting 'plot.c'" '(should have been 987 characters)'
fi
fi
echo shar: "extracting 'defs.h'" '(530 characters)'
if test -f 'defs.h'
then
echo shar: "will not over-write existing file 'defs.h'"
else
sed 's/^ X//' << \SHAR_EOF > 'defs.h'
X#define LEFT 01
X#define RIGHT 02
X
X#define MINXPOS 50
X#define MAXXPOS (SCREEN_WIDTH-50)
X#define MINYPOS 100
X#define MAXYPOS (SCREEN_HEIGHT-100)
X
X#ifndef CTRL
X# define CTRL(c) ('c' & 037)
X#endif
X
X#define MAX(a,b) ((a) > (b) ? (a) : (b))
X#define ABS(d) ((d) < 0 ? -(d) : (d))
X
Xextern int errno, sys_nerr;
Xextern char *sys_errlist[];
X
X#define ERRSTR (errno < sys_nerr ? sys_errlist[errno] : "Unknown Error")
X
X#define MEM_WIDTH 32
X#define MEM_HEIGHT 32
X
SHAR_EOF
if test 530 -ne "`wc -c < 'defs.h'`"
then
echo shar: "error transmitting 'defs.h'" '(should have been 530 characters)'
fi
fi
echo shar: "extracting 'g.h'" '(471 characters)'
if test -f 'g.h'
then
echo shar: "will not over-write existing file 'g.h'"
else
sed 's/^ X//' << \SHAR_EOF > 'g.h'
X/*
X * G.h
X *
X * Constants for convenience when doing radial fractal work under SUNCORE
X *
X * Author: Jim Hutchison (hutch@sdcsvax)
X */
X
X#define SQRT2 1.41421
X#define PI 3.1415926536
X#define PIO2 (PI / 2.0)
X#define PIO3 (PI / 3.0)
X#define PIO4 (PI / 4.0)
X#define PIO6 (PI / 6.0)
X#define TWOPIO3 (2.0 * PI / 3.0)
X#define TWOPI (2.0 * PI)
X#define D_X 0.0
X#define D_Y 0.0
X#define GEN_SIDES 10
X
X#define MOD(a,b) while(a > b) a -= b /* sad but true */
SHAR_EOF
if test 471 -ne "`wc -c < 'g.h'`"
then
echo shar: "error transmitting 'g.h'" '(should have been 471 characters)'
fi
fi
echo shar: "extracting 'gen.h'" '(425 characters)'
if test -f 'gen.h'
then
echo shar: "will not over-write existing file 'gen.h'"
else
sed 's/^ X//' << \SHAR_EOF > 'gen.h'
X/*
X * Author: Jim Hutchison (hutch@sdcsvax)
X * Curve generators and initiators ( can be same structure )
X * Various and sundry generators and a very general one.
X */
X
Xtypedef struct gen { /* an initiator or generator */
X double angle; /* next turtle turn */
X int flip; /* Flip flop multiplier */
X double scale; /* scale factor for sides */
X double div; /* division factor for length */
X} GEN;
SHAR_EOF
if test 425 -ne "`wc -c < 'gen.h'`"
then
echo shar: "error transmitting 'gen.h'" '(should have been 425 characters)'
fi
fi
echo shar: "extracting 'pix.h'" '(857 characters)'
if test -f 'pix.h'
then
echo shar: "will not over-write existing file 'pix.h'"
else
sed 's/^ X//' << \SHAR_EOF > 'pix.h'
X/*
X * Basic operations on the screen as a whole pixrect.
X */
X
X#include <pixrect/pixrect_hs.h>
X
Xextern struct pixrect *px_screen;
X
X#define OP_CLEAR PIX_CLR
X#define OP_SET PIX_SET
X#define OP_PAINT (PIX_SRC|PIX_DST)
X#define OP_WRITE PIX_SRC
X#define OP_MASK (PIX_SRC&PIX_DST)
X#define OP_ERASE (PIX_NOT(PIX_SRC)&PIX_DST)
X#define OP_INVERT (PIX_NOT(PIX_SRC^PIX_DST))
X#define OP_NOT(op) PIX_NOT(op)
X
X#define WHITE CLEAR
X#define BLACK SET
X
Xextern int SCREEN_WIDTH, SCREEN_HEIGHT;
X
X#define point(x,y,op) pr_put(px_screen, x, y, (op == PIX_CLR) ? 0 : 1)
X#define line(x1,y1,x2,y2,op) pr_vector(px_screen, x1, y1, x2, y2, op, 0)
X#define block(x,y,w,h,op) pr_rop(px_screen, x, y, w, h, op, \
X (struct pixrect *)0, 0, 0)
SHAR_EOF
if test 857 -ne "`wc -c < 'pix.h'`"
then
echo shar: "error transmitting 'pix.h'" '(should have been 857 characters)'
fi
fi
exit 0
# End of shell archive
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads