[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bezier-sandwich proposals
From: |
Mark Polesky |
Subject: |
bezier-sandwich proposals |
Date: |
Sun, 12 Apr 2009 15:17:50 -0700 (PDT) |
Here's the ps draw_bezier_sandwich routine from line 127 of
music-drawing-routines.ps. I've annotated it to show how it
pulls "thickness controls" off the stack. I put periods
between some values to simplify reading (they're not part of
the stack). Currently there are 17 "thickness controls":
/draw_bezier_sandwich % thickness controls
{ % x4 y4 x5 y5 x0 y0 . x3 y3 . x1 y1 x2 y2 x3 y3 . x0 y0 . linewidth
gsave
currentpoint translate
% round ending and round beginning
1 setlinejoin 1 setlinecap
setlinewidth % x4 y4 x5 y5 x0 y0 . x3 y3 . x1 y1 x2 y2 x3 y3 . x0 y0
moveto % x4 y4 x5 y5 x0 y0 . x3 y3 . x1 y1 x2 y2 x3 y3
curveto % x4 y4 x5 y5 x0 y0 . x3 y3
lineto % x4 y4 x5 y5 x0 y0
curveto % (clear)
closepath
stroke_and_fill
grestore
} bind def
I've noticed a couple of things:
1. the lineto command is redundant.
the currentpoint just before is x3 y3, and lineto
draws a "line" to the same point. Sometimes in ps
this is a way of making sure you get the right
linejoin (round here), but in this case the next
curveto takes care of that.
2. P(x0,y0) is included twice.
ps-commands copy and roll can take care of that.
____________________________________
So the number of thickness controls could be cut down
from 17 to 13 if draw_bezier_sandwich was defined as:
/draw_bezier_sandwich % thickness controls
{ % x4 y4 x5 y5 . x1 y1 x2 y2 x3 y3 . x0 y0 . linewidth
gsave
currentpoint translate
% round ending and round beginning
1 setlinejoin 1 setlinecap
setlinewidth % x4 y4 x5 y5 . x1 y1 x2 y2 x3 y3 . x0 y0
2 copy % x4 y4 x5 y5 . x1 y1 x2 y2 x3 y3 . x0 y0 . x0 y0
10 2 roll % x4 y4 x5 y5 x0 y0 . x1 y1 x2 y2 x3 y3 . x0 y0
moveto % x4 y4 x5 y5 x0 y0 . x1 y1 x2 y2 x3 y3
curveto % x4 y4 x5 y5 x0 y0
curveto % (empty)
closepath
stroke_and_fill
grestore
} bind def
If anyone wanted the order of thickness controls to be
more intuitive, such as:
% linewidth . x0 y0 . x1 y1 x2 y2 x3 y3 . x4 y4 x5 y5
the routine could be defined like this:
/draw_bezier_sandwich % thickness controls
{ % linewidth . x0 y0 . x1 y1 x2 y2 x3 y3 . x4 y4 x5 y5
12 4 roll % linewidth . x4 y4 x5 y5 x0 y0 . x1 y1 x2 y2 x3 y3
7 index 7 index % linewidth . x4 y4 x5 y5 x0 y0 . x1 y1 x2 y2 x3 y3 . x0 y0
15 -1 roll % x4 y4 x5 y5 x0 y0 . x1 y1 x2 y2 x3 y3 . x0 y0 . linewidth
gsave
currentpoint translate
% round ending and round beginning
1 setlinejoin 1 setlinecap
setlinewidth % x4 y4 x5 y5 x0 y0 . x1 y1 x2 y2 x3 y3 . x0 y0
moveto % x4 y4 x5 y5 x0 y0 . x1 y1 x2 y2 x3 y3
curveto % x4 y4 x5 y5 x0 y0
curveto % (empty)
closepath
stroke_and_fill
grestore
} bind def
- Mark
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- bezier-sandwich proposals,
Mark Polesky <=