Path: csiph.com!feeder.erje.net!2.us.feeder.erje.net!bloom-beacon.mit.edu!bloom-beacon.mit.edu!panix!panix.com!forkosh From: John Forkosh Newsgroups: comp.lang.postscript Subject: Re: a smooth curve through given points ? Date: Mon, 15 Aug 2016 03:08:09 +0000 (UTC) Organization: PANIX Public Access Internet and UNIX, NYC Lines: 96 Message-ID: References: <3243f726-6885-4ae2-aac9-f8834261dc73@googlegroups.com> NNTP-Posting-Host: panix3.panix.com X-Trace: reader2.panix.com 1471230489 7901 166.84.1.3 (15 Aug 2016 03:08:09 GMT) X-Complaints-To: abuse@panix.com NNTP-Posting-Date: Mon, 15 Aug 2016 03:08:09 +0000 (UTC) User-Agent: tin/1.6.2-20030910 ("Pabbay") (UNIX) (NetBSD/6.1.5 (i386)) Xref: csiph.com comp.lang.postscript:2774 Peter Billam wrote: > On 2016-08-13, Peter Billam wrote: >> OK, I'll give it a go (don't hold your breaths, though). I'm not >> really motivated by plotting smooth graphs, but by drawing curves >> for arty stuff, like http://www.pjb.com.au/art/posters/index.html >> It should also make it easy to copy a smooth curve from a .jpg or >> .png, because you just note the pixel-positions at a few places >> along the curve and let the algorithm do the rest. If it's not >> right yet, you insert an extra pixel-position into your list... > > I have a prototype: it can either be called by > [x1 y1 x2 y2 ... xN yN] points2curve stroke > in which case is makes up its own starting and ending angles, > or by > [x1 y1 ... xN yN] initialangle finalangle points2curve stroke > if you need to fix the launch- and landing- angles, which you do > eg: for drawing smooth closed curves that join up smoothly. > The plan is to roll it into > http://www.pjb.com.au/comp/line_drawing.html > which needs a bit of revision anyway... Peter's code reproduced without leading "> "s reproduced below %% ---- cut here ---- /xmax currentpagedevice (PageSize) get 0 get def /ymax currentpagedevice (PageSize) get 1 get def /points2curve { % [x1 y1 ... xN yN] initial_angle final_angle points2curve % http://stackoverflow.com/questions/7715788/ % find-bezier-control-points-for-curve-passing-through-n-points % http://www.math.ucla.edu/~baker/149.1.02w/handouts/dd_splines.pdf % https://corner.squareup.com/2012/07/smoother-signatures.html 25 dict begin /a_top exch def a_top type (arraytype) eq { /points a_top def } { /final_angle a_top def /initial_angle exch def /points exch def } ifelse /p_0_x points 0 get def /p_0_y points 1 get def p_0_x p_0_y moveto /initial_angle where { pop /subangle_m1 initial_angle def } if /p_im1_x p_0_x def /p_im1_y p_0_y def 2 2 points length 4 sub { /i exch def points i get /p_i_x exch def points i 1 add get /p_i_y exch def points i 2 add get /p_ip1_x exch def points i 3 add get /p_ip1_y exch def /angle_before p_i_y p_im1_y sub p_i_x p_im1_x sub atan def /angle_after p_ip1_y p_i_y sub p_ip1_x p_i_x sub atan def angle_before 180 gt { /angle_before angle_before 360 sub def } if angle_after 180 gt { /angle_after angle_after 360 sub def } if /angle_tangent angle_before angle_after add .5 mul def /dist_before p_i_y p_im1_y sub dup mul p_i_x p_im1_x sub dup mul add sqrt def /dist_after p_i_y p_ip1_y sub dup mul p_i_x p_ip1_x sub dup mul add sqrt def /subangle_m1 where { pop } { /subangle_m1 angle_before def } ifelse p_im1_x subangle_m1 cos dist_before mul 0.40 mul add p_im1_y subangle_m1 sin dist_before mul 0.40 mul add p_i_x angle_tangent cos dist_before mul 0.40 mul sub p_i_y angle_tangent sin dist_before mul 0.40 mul sub p_i_x p_i_y curveto /p_im1_x p_i_x def /p_im1_y p_i_y def /subangle_m1 angle_tangent def } for /final_angle where { pop } { /final_angle subangle_m1 def } ifelse p_i_x subangle_m1 cos dist_before mul 0.40 mul add p_i_y subangle_m1 sin dist_before mul 0.40 mul add p_ip1_x final_angle cos dist_before mul 0.40 mul sub p_ip1_y final_angle sin dist_before mul 0.40 mul sub p_ip1_x p_ip1_y curveto % last point end } def xmax .002 mul setlinewidth [ 220 50 100 100 100 200 200 250 300 210 320 100 220 50 ] 170 170 points2curve stroke [ 400 50 380 100 430 200 360 300 450 400 380 500 410 600 400 700 ] 120 90 points2curve stroke showpage %% ---- cut here ---- > > Regards, Peter Very nice. I tested it with various other x,y1...x,yn's, and it seems to behave pretty nicely for the stuff I tested. Like you, I put together some ps for "arty stuff" (your words above), and you might find some of that useful. See http://www.forkosh.com/images/decorative/decorative13.jpg for an example. Same_directory/decorative13.ps has all the ps. And note %comments crediting Gernot Hoffmann -- I don't know ps well enough to have done it myself (but I did write the C program that generates the data). -- John Forkosh ( mailto: j@f.com where j=john and f=forkosh )