home *** CD-ROM | disk | FTP | other *** search
- From: pjs269@tijc02.uucp (Paul Schmidt )
- Newsgroups: comp.sources.misc
- Subject: v02i046: spiro - generate pretty patterns
- Message-ID: <7194@ncoast.UUCP>
- Date: 6 Feb 88 01:27:03 GMT
- Approved: allbery@ncoast.UUCP
-
- Comp.sources.misc: Volume 2, Issue 46
- Submitted-By: "Paul Schmidt" <pjs269@tijc02.UUCP>
- Archive-Name: spiro
-
- Here's a little program to draw pretty designs called "spiro".
-
- Spiro will draw a pattern to the screen using plot(3X) function
- calls. The pattern is defined by three numbers input as arguments.
- The pattern is produced by rotating a circle inside of another
- circle with a "pen" a set distance from the center of the rotating
- circle. The arguments are radius(1), radius(2), and and optional
- distance. The first radius is the stable circle and the second
- radius is the rotating circle.
-
- Author:
- Paul Schmidt - 2/2/1988
- mcnc!rti!tijc02!pjs269
-
- #---------------------CUT HERE-----------------------------
- #!/bin/sh
- # Cut above the preceeding line, or cut here if you must.
- # This is a shar archive. Extract with sh, not csh.
- # The rest of this file will extract:
- # README
- # spiro.h
- # spiro.c
- sed 's/^X//' > README << '/*EOF'
- X(C) Copyright 1988, Paul Schmidt, All Rights Reserved.
- X
- XThis code may be copied and distributed for personal use.
- XCommercial use of this code is forbidden.
- X
- Xspiro - Make a pretty design
- X
- Xspiro will draw a pattern to the screen using plot(3X) function
- Xcalls. The pattern is defined by three numbers input as arguments.
- XThe pattern is produced by rotating a circle inside of another
- Xcircle with a "pen" a set distance from the center of the rotating
- Xcircle. The arguments are radius(1), radius(2), and and optional
- Xdistance. The first radius is the stable circle and the second
- Xradius is the rotating circle.
- X
- XIt is easier to see how it works by running it.
- X
- XExample:
- X spiro 23 17 11
- X
- XTo compile:
- X
- X cc -O -o spiro spiro.c -lXXXX -lm
- X where XXXX is the plotting device whose library is found
- Xin /usr/lib/libXXXX.a.
- X
- XAuthor:
- X Paul Schmidt - 2/2/1988
- X mcnc!rti!tijc02!pjs269
- /*EOF
- ls -l README
- sed 's/^X//' > spiro.h << '/*EOF'
- X#define MAX(X,Y) ( (X) > (Y) ? (X) : (Y) )
- X#ifndef _ABS
- X#define _ABS(X,Y) ( (X) > (Y) ? (X) - (Y) : (Y) - (X) )
- X#endif
- X
- X/* Defaults for the TEKTRONIX 4014 terminal */
- X#define LO_X 0
- X#define LO_Y 0
- X#define HI_X 3120
- X#define HI_Y 3120
- /*EOF
- ls -l spiro.h
- sed 's/^X//' > spiro.c << '/*EOF'
- X/*
- X** (C) Copyright 1988, Paul Schmidt, All Rights Reserved.
- X**
- X** This code may be copied and distributed for personal use.
- X** Commercial use of this code is forbidden.
- X**
- X** spiro - Make a pretty design
- X**
- X** spiro will draw a pattern to the screen using plot(3X) function
- X** calls. The pattern is defined by three numbers input as arguments.
- X** The pattern is produced by rotating a circle inside of another
- X** circle with a "pen" a set distance from the center of the rotating
- X** circle. The arguments are radius(1), radius(2), and and optional
- X** distance. The first radius is the stable circle and the second
- X** radius is the rotating circle.
- X**
- X** It is easier to see how it works by running it.
- X**
- X** Example:
- X** spiro 23 17 11
- X**
- X** To compile:
- X**
- X** cc -O -o spiro spiro.c -lXXXX -lm
- X**
- X** where XXXX is the plotting device whose library is found
- X** in /usr/lib/libXXXX.a.
- X**
- X** Author:
- X** Paul Schmidt - 2/2/1988
- X** mcnc!rti!tijc02!pjs269
- X*/
- X
- X#include <math.h>
- X#include "spiro.h"
- X
- Xstruct pos
- X{
- X double x;
- X double y;
- X};
- X
- Xmain(argc, argv)
- Xint argc;
- Xchar *argv[];
- X{
- X double size1, size2, dist, d;
- X struct pos center;
- X double loops;
- X double inc1, inc2;
- X double angle1, angle2;
- X double scale;
- X
- X if ((argc < 3) || (argc > 4))
- X {
- X printf("Usage: %s number number [number]\n", argv[0]);
- X exit(1);
- X }
- X
- X size1 = (double)atoi(argv[1]);
- X size2 = (double)atoi(argv[2]);
- X if (argc == 4)
- X dist = (double)atoi(argv[3]);
- X else
- X dist = size2/2.0;
- X
- X inc1 = 0.2;
- X loops = 2.0*M_PI*MAX(size1, size2)/(double)gcd((int)size1, (int)size2);
- X
- X scale = (HI_X/2)/(_ABS(size1 - size2) + dist);
- X size1 *= scale;
- X size2 *= scale;
- X dist *= scale;
- X
- X space(LO_X, LO_Y, HI_X, HI_Y);
- X openpl();
- X erase();
- X
- X center.x = (HI_X - LO_X)/2 - 1;
- X center.y = (HI_Y - LO_Y)/2 - 1;
- X
- X move((int)(center.x + size1 - size2 + dist), (int)center.y);
- X
- X linemod("solid");
- X
- X d = size1 - size2;
- X angle1 = angle2 = 0;
- X inc2 = inc1-inc1*((double)size1/(double)size2);
- X for (;angle1 < loops; angle1+=inc1, angle2 += inc2)
- X {
- X struct pos p1, p2;
- X
- X p1.x = cos(angle1)*d + center.x;
- X p1.y = sin(angle1)*d + center.y;
- X
- X p2.x = cos(angle2)*dist + p1.x;
- X p2.y = sin(angle2)*dist + p1.y;
- X
- X cont((int)p2.x, (int)p2.y);
- X }
- X move(0, 0);
- X closepl();
- X exit();
- X}
- X
- X/*
- X** Calculate the greatest common denominator.
- X*/
- Xgcd(i, j)
- Xint i, j;
- X{
- X while (j != 0)
- X {
- X int temp;
- X
- X temp = j;
- X j = i % j;
- X i = temp;
- X }
- X return(i);
- X}
- /*EOF
- ls -l spiro.c
- exit
-