X-Received: by 10.224.207.2 with SMTP id fw2mr5768026qab.6.1364825365437; Mon, 01 Apr 2013 07:09:25 -0700 (PDT) Path: csiph.com!newsfeed.hal-mli.net!feeder3.hal-mli.net!newsfeed.hal-mli.net!feeder1.hal-mli.net!npeer02.iad.highwinds-media.com!news.highwinds-media.com!feed-me.highwinds-media.com!ca1no19694739qab.0!news-out.google.com!v17ni15796qad.0!nntp.google.com!Xl.tags.giganews.com!border1.nntp.dca.giganews.com!nntp.giganews.com!local2.nntp.dca.giganews.com!news.giganews.com.POSTED!not-for-mail NNTP-Posting-Date: Mon, 01 Apr 2013 09:09:24 -0500 From: John Deubert Organization: Acumen Training Newsgroups: comp.lang.postscript Date: Mon, 1 Apr 2013 07:09:25 -0700 Message-ID: <2013040107092515878-john@acumentrainingcom> References: MIME-Version: 1.0 Subject: Re: merging colors.. User-Agent: Unison/2.1.10 Lines: 173 X-Usenet-Provider: http://www.giganews.com X-Trace: sv3-dLSsK3PZJhUU1ysesfYhJfD7dKO7Mt1LxwFTzXtIXCs1HsOKMIoeUYoMW3MqCuysmm7nZMAfRKUXxrQ!LZ0VD2wnbQuZSt/+rsm6UU4Y+GZlfndDbZ20Thj5VeYVa2iWS+LWctoLo0Qb9aZLXwm65AgS X-Complaints-To: abuse@giganews.com X-DMCA-Notifications: http://www.giganews.com/info/dmca.html X-Abuse-and-DMCA-Info: Please be sure to forward a copy of ALL headers X-Abuse-and-DMCA-Info: Otherwise we will be unable to process your complaint properly X-Postfilter: 1.3.40 X-Original-Bytes: 5682 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Received-Bytes: 5986 Xref: csiph.com comp.lang.postscript:1363 On 2013-04-01 03:19:10 +0000, Robert Baer said: > This is my first "fancy" program, three color-shaded circles. > It would be nice to have the colors appropriately combine/add in the > overlap regions. > Is there a nice way to do that? > > %! % three.ps > /inch {72 mul} def % 72 pixels to the inch > /N 500 def % steps > /red 1 def > /green {1 3 div} def > /blue {2 3 div} def > /size {dup inch exch inch scale} def > /circle > { > newpath > exch % order: hue sat on top > 0 0 moveto % (circlestack) stack pop % ? where does it go? > 1 sethsbcolor % hue sat 1 > 0 0 1 -270 90 arc % includes a straight line to the initial > point of the arc > % x y r ang1 ang2 % from, to angles > closepath % and a curved section to the end of the arc. > pop > } def > > gsave > 267 400 translate % middle, landscape > 1 1 N % Set up the for operator to iterate > { > gsave % Enclose the ‘‘circle’’ operation in a > gsave - grestore > % radius must shrink as sat grows for proper shading.. > dup N exch sub N div dup 3 mul size > 1 exch sub > red circle > gsave fill grestore % Save the circle path for use after the fill. > grestore % Get out of the coordinate system left > by circle. > } for % Close the procedure body and execute > the for operator. > grestore > > gsave > 400 200 translate % middle, landscape > 1 1 N % Set up the for operator to iterate > { > gsave % Enclose the ‘‘circle’’ operation in a > gsave - grestore > % radius must shrink as sat grows for proper shading.. > dup N exch sub N div dup 3 mul size > 1 exch sub > green circle > gsave fill grestore % Save the circle path for use after the fill. > grestore % Get out of the coordinate system left > by circle. > } for % Close the procedure body and execute > the for operator. > grestore > > gsave > 533 400 translate % middle, landscape > 1 1 N % Set up the for operator to iterate > { > gsave % Enclose the ‘‘circle’’ operation in a > gsave - grestore > % radius must shrink as sat grows for proper shading.. > dup N exch sub N div dup 3 mul size > 1 exch sub > blue circle > gsave fill grestore % Save the circle path for use after the fill. > grestore % Get out of the coordinate system left > by circle. > } for % Close the procedure body and execute > the for operator. > grestore > gsave > /Helvetica findfont > 24 scalefont setfont > 320 580 moveto > ( Linear gradient) show > grestore > showpage The simplest algorithm for the "three-circle-overlap" I know goes something like this: Given three overlapping circles A, B, and C: Do A; fill red Do B; gsave; clip; fill green Do A; Fill yellow grestore Do C; clip; Fill blue Do A; fill magenta Do B; clip; fill cyan Do A; fill white This is for the classic red-green-blue circles (yielding overlaps of c, m, y, and white); I sometimes present this as an extra-credit problem in the PostScript Foundations class. Here's a PostScript implementation: % ========= cut here ======== /CircleA { 300 500 100 0 360 arc } bind def /CircleB { 375 425 100 0 360 arc } bind def /CircleC { 225 425 100 0 360 arc } bind def CircleA 1 0 0 setrgbcolor fill gsave CircleB clip 0 1 0 setrgbcolor fill CircleA 1 1 0 setrgbcolor fill grestore CircleC clip 0 0 1 setrgbcolor fill CircleA 1 0 1 setrgbcolor fill CircleB clip 0 1 1 setrgbcolor fill CircleA 1 setgray fill showpage % ============ cut here ============ You can pretty easily adapt this for your quite nice-looking radial gradients. - John P.S. If you like gradients, you might want to look into PostScript's smooth shading. The Acumen Journal has a brief introduction to the topic way back in issue #1, November 2000. The Journal is free for the downloading at www.acumentraining.com/acumenjournal.html. - John -- ======== John Deubert Acumen Training PostScript & PDF Engineering Classes & Consulting www.acumentraining.com Learn PostScript programming techniques Read the free Acumen Journal acumentraining.com/acumenjournal.html