%!PS-Adobe-2.0
%%Pages: 0 1
%%BoundingBox: 0 0 612 792
%%EndComments
/n 12 def % number of points on star
% use n = 14, 16, with changes in "points" function below
% n = 10, 18 require additional changes, not shown
/h 0.1 def % distance between 6 loops and centerline
/whitestroke 0.10 def % width of wide while lines
/colorstroke 0.08 def % width of narrower colored lines
% use whitestroke = 0.09, colorstroke = 0.07 when n = 14
% use whitestroke = 0.08, colorstroke = 0.06 when n = 16
% any larger values (fatter red lines) end up with path interference
% use of white, then color creates white "gaps" along the way, width (0.1 - 0.08)/2
/th 360 n div def % angles in one segment of disk
% a few colors to use
/White {0 0 0 0 0 setcmykcolor}def
/Red {0 1 1 0 setcmykcolor}def
/Green {1 0 1 0 setcmykcolor}def
/Blue {1 1 0 0 setcmykcolor}def
/Yellow {0 0 1 0 setcmykcolor}def
/Cyan {1 0 0 0 setcmykcolor}def
% intersection point of two lines
/inter { % stack x1f y1f x2f y2f u1f v1f u2f v2f, two intersecting lines
/v2f exch def
/u2f exch def
/v1f exch def
/u1f exch def
/y2f exch def
/x2f exch def
/y1f exch def
/x1f exch def
x1f x2f sub abs 0.000001 lt {
/nf v2f v1f sub u2f u1f sub div def
x1f % return xInter
nf x1f mul v1f add nf u1f mul sub % return yInter
} {
u1f u2f sub abs 0.000001 lt {
/mf y2f y1f sub x2f x1f sub div def
u1f % return xInter
mf u1f mul y1f add mf x1f mul sub % return yInter
} {
/mf y2f y1f sub x2f x1f sub div def
/nf v2f v1f sub u2f u1f sub div def
v1f nf u1f mul sub y1f sub mf x1f mul add mf nf sub div %return xInter
mf v1f mul mf nf mul u1f mul sub nf y1f mul sub mf nf mul x1f mul add
mf nf sub div % return yInter
} ifelse
} ifelse
} def inter
% point a ratio r of the way from one point to another
/short { % stack: xf yf uf vf rf
% (x,y) is 1st point, (u,v) is 2nd
% returned on stack is (w,z), pt on line
% r of the way from 1st to 2nd
/rf exch def
/vf exch def
/uf exch def
/yf exch def
/xf exch def
/wf xf rf uf xf sub mul add def
wf % return x coord of pt on stack
/zf yf rf vf yf sub mul add def
zf % return y coord of pt on stack
} def % short
% points needed for drawing a 6th pie shape (if n = 12)
/points {
/c0x 1 def % ci counterclockwise aroung circle, i >= 0
/c0y 0 def
/c1x th cos def
/c1y th sin def
/c2x th 2 mul cos def
/c2y th 2 mul sin def
/c3x th 3 mul cos def
/c3y th 3 mul sin def
/c4x th 4 mul cos def
/c4y th 4 mul sin def
/c5x th 5 mul cos def
/c5y th 5 mul sin def
/cm1x th neg cos def % cmi counterclockwise around circle, i < 0
/cm1y th neg sin def
/cm2x th 2 mul neg cos def
/cm2y th 2 mul neg sin def
/cm3x th 3 mul neg cos def
/cm3y th 3 mul neg sin def
% from here on, must draw picture carefully
% d1 is inter (c1 - c5, 0 - c2)
c1x c1y c5x c5y 0 0 c2x c2y inter
/d1y exch def
/d1x exch def
% d2 is inter (c1 - cm3, 0 - c0)
c1x c1y cm3x cm3y 0 0 c0x c0y inter
/d2y exch def
/d2x exch def
/f0x c2x def
/f0y 0 def
% d3 is inter (c2 - f0, (0,h) - (1,h))
c2x c2y f0x f0y 0 h 1 h inter
/d3y exch def
/d3x exch def
% d4 is inter (0 - c2, (0,h) - (1,h))
0 0 c2x c2y 0 h 1 h inter
/d4y exch def
/d4x exch def
/d5x h th 2 mul sin div def % point closest to origin
/d5y 0 def
/f1x c2x def
/f1y c2y h 90 th 2 mul sub sin div sub def
% d6 is inter (d5 - f1, c0 - c4), vertex of small quadrilateral
d5x d5y f1x f1y c0x c0y c4x c4y inter
/d6y exch def
/d6x exch def
/d7x d6x def % 4th vertex of quadrilateral
/d7y d6y neg def
% new points related to fancier approach
d3x d3y c2x c2y 0.88 short % 0.88 for n=12, 0.9 for n=14,16
/e1y exch def
/e1x exch def
c1x c1y d1x d1y 0.9 short
/e3y exch def
/e3x exch def
d3x d3y d4x d4y 0.925 short
/e2y exch def
/e2x exch def
cm1x cm1y d2x d2y 0.9 short
/g3y exch def
/g3x exch def
d7x d7y c0x c0y 0.88 short % 0.88 for n=12, 0.9 for n=14,16
/g1y exch def
/g1x exch def
d7x d7y d5x d5y 0.925 short
/g2y exch def
/g2x exch def
c2x c2y d3x d3y 0.6 short % 0.6 for n=12, 0.55 for n=14, 0.5 for n=16
/h1y exch def
/h1x exch def
d5x d5y d6x d6y 0.5 short
/h2y exch def
/h2x exch def
} def % points
% carry out entire drawing
/everything{
points
/paths {
% now paths in one segment of disc
% for n = 12, can't get much fatter than this
% use other strokesi functions for more colors
/strokes1 {
gsave
White
whitestroke setlinewidth
stroke % stroke wide white line
grestore
Red
colorstroke setlinewidth
stroke % narrower colored line, to leave white "gaps"
} def strokes1
/strokes2 {
gsave
White
whitestroke setlinewidth
stroke
grestore
Green
colorstroke setlinewidth
stroke
} def strokes2
% need 5 paths because of order of crossings
% separate paths are attached exactly, but the picture
% ends up with tiny wide lines at the connection points
% of width "zero". They are visible, but get no bigger under magnification
% path 1
newpath
e1x e1y moveto
h1x h1y lineto
strokes2
% path 2, creates the entire 6-pointed star
newpath
e3x e3y moveto
c1x c1y lineto
d2x d2y lineto
g3x g3y lineto
strokes1
% path 3
newpath
g1x g1y moveto
c0x c0y lineto
d6x d6y lineto
h2x h2y lineto
strokes2
% path 4
newpath
h1x h1y moveto
d3x d3y lineto
e2x e2y lineto
strokes2
% path 5
newpath
h2x h2y moveto
d5x d5y lineto
g2x g2y lineto
strokes2
} def % paths
% loop through each sector of disk
% iterate n/2 times
1 1 n 2 div {
paths
360 2 mul n div rotate
} for
} def % everything
200 200 scale % original circle radius = 1
1.5 1.5 translate
everything
showpage