.PS # worm.m4 gen_init ifdpic(` NeedDpicTools Worm: [ linethick_(0) dimen = 1.25 # scale parameter; try dimen=2 for a larger picture w = 0.15 * dimen # worm radius nhues = 265 S: (dimen,0) for inx = 1 to nhues do { theta = inx/nhues*360 R: (dimen*cosd(3*theta), dimen*sind(2*theta)) D: R-S t = sqrt(max(0,w^2/(D.x^2+D.y^2)-1/4)) Ra: 0.5 + (t*D.y,-t*D.x) Rb: 0.5 - (t*D.y,-t*D.x) hsvtorgb(theta+120,1,1,r,g,b) rgbfill( r,g,b, arc cw from Ra to Rb rad w with .c at S arc ccw from Rb to Ra rad w with .c at R ) S: R } ] "\large R" at 0.9 ljust "\large G" at Worm.e ljust "\large B" at 0.1 ljust "\large Y" at 0.1 rjust "\large M" at Worm.w rjust "\large C" at 0.9 rjust box invis ht Worm.ht wid Worm.wid+0.4 at Worm [ thicklines_ C: circle rad 1.5 at 0,0 smallrad = C.rad/2 for t=0 to 330 by 30 do { line from Rect_(C.rad-0.05,90-t) to Rect_(C.rad+0.05,90-t) sprintf("$%g^{\circ}$",t) at Rect_(C.rad+0.2,90-t) } "\large R" at Rect_(C.rad+0.45,90-0) "\large Y" at Rect_(C.rad+0.45,90-60) "\large G" at Rect_(C.rad+0.45,90-120) "\large C" at Rect_(C.rad+0.45,90-180) "\large B" at Rect_(C.rad+0.45,90-240) "\large M" at Rect_(C.rad+0.45,90-300) linethick_(0) for t = 1 to 90 do { hsvtorgb(t/90*360,1,1,r,g,b) setrgb(r,g,b,tmpcolor) line shaded "tmpcolor" outlined "tmpcolor" \ from C to Rect_(C.rad-0.05,90-(t-0.5)/90*360) \ then to Rect_(C.rad-0.05,90-(t+0.5)/90*360) \ then to C resetrgb } R: circle diam C.rad at Rect_(C.rad*3/8,90) color "red" G: circle diam C.rad at Rect_(C.rad*3/8,-30) color "green" B: circle diam C.rad at Rect_(C.rad*3/8,-150) color "blue" RG: Cintersect(R,R.rad,G,G.rad) GR: Cintersect(R,R.rad,G,G.rad,R) GB: Cintersect(G,G.rad,B,B.rad) BG: Cintersect(G,G.rad,B,B.rad,R) BR: Cintersect(B,B.rad,R,R.rad) RB: Cintersect(B,B.rad,R,R.rad,R) # The following could be done other ways depending on the postprocessor `define lozenge { arc from $1$2 to $2$1 with .c at $2 arc from $2$1 to $1$2 with .c at $1 }' # yellow linethick = 0.1; rgbfill(1,1,0,lozenge(R,G)) linethick = 0.4; rgbdraw(1,1,0,lozenge(R,G)) # cyan linethick = 0.1; rgbfill(0,1,1,lozenge(G,B)) linethick = 0.4; rgbdraw(0,1,1,lozenge(G,B)) # magenta linethick = 0.1; rgbfill(1,0,1,lozenge(B,R)) linethick = 0.4; rgbdraw(1,0,1,lozenge(B,R)) `define innersegment { arc cw from RB to GR with .c at R arc cw from GR to BG with .c at G arc cw from BG to RB with .c at B }' linethick = 0.1; rgbfill(1,1,1,innersegment) linethick = 0.4; rgbdraw(1,1,1,innersegment) ] with .w at Worm.e+(0.5,0) ',`box "worm.m4" "requires" "dpic"') .PE