rich@sdcc13.UUCP (rich) (07/06/85)
in response to the discussion on fractals
in net.graphics:
(no flames for posting this to two groups please, it is short)
/*
* This is a simple fractal curve based on the making of a fractal
* snoflake. I cant post the snoflake since i did not author
* the code to it. By manipulating the side() {
* side (.....);
* side (.....);
* side (.....);
* }
*
* theme you can build up most of the 2-d objects in
* Mandelbrotts` book plus much much more. (this is one of those
* mores).
* This will run on a sun workstation, or by modifying the
* line_rel_2 (dx, dy);
* line, to draw relative vectors on your graphics device, it
* will draw there. This particular `fractal` will look real
* nice if you have a polygon fill routine which can handle
* this mesh of relative vectors.
*
* I chose this particular picture because i liked it an i
* was suprised by it. If you wish to understand why it
* works read 'the fractal geometry of nature' , of course.
* A lot of credit for helping get started on this goes to
* Jim Hutchinson ( hutch@sdcsvax).
*
* I`ll take those right arms now.
*
* -rich
* ihnp4--\
* decvax--\
* akgua----\
* dcdwest---\
* somewhere--\
* ucbvax-------- sdcsvax -- sdcc3 --rich
*
*/
#define SQRT2 1.41421
#define PI 3.1415927
#define PIO4 (PI / 4.0)
#define TWOPIO3 (2.0 * PI / 3.0)
#define PIO3 (PI / 3.0)
#define PIO2 (PI / 2.0)
#define TWOPI (2.0 * PI)
#define MOD(a,b) while(a > b) a -= b
#include <math.h>
#include <usercore.h>
main () {
double length = 45.0;
double angle = PIO2;
double depth = 0.75;
nice_shape (length, angle, depth)
}
side (size, min, angle)
double size,
min,
angle;
{
if (size <= min)
plot_line (size, angle);
else {
size /= 3.0;
side (size, min, angle + PI);
side (size, min, angle + PI / 2.0);
}
}
nice_shape (len, angle, depth)
double len,
angle,
depth;
{
side (len, depth, angle);
side (len * 100, depth * 2.0, angle + PIO2);
side (len, depth, -angle);
side (len * 100, depth * 2.0, angle - PIO2);
}
/*
* Plot a line by length and angle from current position
*/
plot_line (length, angle)
double length,
angle;
{
double dx,
dy;
MOD (angle, TWOPI);
dx = length * cos (angle);
dy = length * sin (angle);
line_rel_2 (dx, dy);
}