Smoothing over 'moveto' vs 'lineto'

16 views
Skip to first unread message

luser droog

unread,
Jan 24, 2022, 12:19:21 PM1/24/22
to
In simple drawing programs I keep running into the very minor
problem that you have to call 'moveto' on the first point but
then 'lineto' on all the other points to put a line segment into
the path. It is very minor. But it keeps on happening.

This last time around I had my points all nicely packed into
an array of array. Lovely. And that led to this function which
I haven't found the right name for:

/fx,mapgxs { % a f g . [a0 f] [a1 g .. aN g]
3 1 roll exch dup first % g f a a0
3 -1 roll [ 3 1 roll exec ] % g a [a0 f]
3 1 roll rest exch map % [a0 f] [a1 g .. aN g]
} def
/first{ 0 get } def
/rest{ 1 1 index length 1 sub getinterval } def
/map { 1 index xcheck 3 1 roll [ 3 1 roll forall ] exch {cvx} if } def

Which you call like this:

/draw { % [[x0 y0]..[xN yN]] . -
{aload pop moveto} {aload pop lineto} fx,mapgxs pop pop
closepath
} def


Looking over some old code just now I found a completely
different approach to the same problem, by redefining the
thing to call. The `currentpoint stroke moveto` is just to "animate"
the drawing.

/newline { /line {moveto /line {lineto currentpoint stroke moveto} store} store } def

Which you could use like this (remove the "currentpoint stroke moveto"
above for closepath to work):

/draw {
newline {aload pop line} forall
closepath
} def

Are there other solutions? Is this a problem for anyone else?

luser droog

unread,
Jan 24, 2022, 12:58:58 PM1/24/22
to
Oh. I forgot about this other way. Perhaps this should be called the "Oopsie!"
technique.

/line { {currentpoint pop pop}stopped{moveto}{lineto} ifelse } def

or just:

/line { {lineto}stopped{moveto}if } def

Reply all
Reply to author
Forward
0 new messages