Hi David,
On Thu, 8 Nov 2012 20:10:06 -0500
"David Dailey" <[email protected]> wrote:
> In order to perform transform operations in script rather than doing
> it declaratively (whence the stack of transforms can become gnarly),
> I was thinking about ways to simplify the code (from the human rather
> than the computational perspective). By such perspective, the minimum
> number of statements is to be optimized rather than minimizing
> run-time - I know it is a funny metric, but people have been looking
> at things like this since the 1970's believe it or not.
>
>
>
> Anyhow, I wanted to develop a function which would take the d
> attribute of paths or glyphs (of any sort):
>
>
>
> d="M 1550 710.5 Q 1650 840 1610.5 920.5 Q 1580 1010 1130.5 970 Q 690
> 930 840 810 Q 990 690 1010.5 450.5 Q 1040 220 1190 190.5 Q 1340 170
> 1480.5 210 Q 1630 250 1540 420 Q 1450 590 1550 710.5 M 940.5 860.5 Q
> 610 1100 630.5 1170 Q 660 1240 770 1250.5 Q 880 1270 1110.5 1270 Q
> 1350 1270 1610 1300 Q 1870 1330 1920 1250.5 Q 1970 1180 1810 1060 Q
> 1650 940 1460.5 780.5 Q 1280 630 940.5 860.5 z"
>
>
>
> Or
>
>
>
> d="M50,100
>
> A100,50 0 0 1 250,100
>
> A80,40 0 0 1 90,100
>
> A60,30 0 0 1 210,100
>
> A40,20 0 0 1 130,100
>
> A20,10 0 0 1 170,100"
This description reminds me of a kind of functional programming
approach I've used in the past.
In pseudo-code, it would do something like
new_d = join_command( transform_A(
function(a) { /* do something to each A */ },
split_commands( d )
)
);
The split_commands function would return a list of commands.
The transform_A function would identify A commands and apply the
supplied function to each, returning a modified A. The transform_A
function would then return the modified A commands along with the
original of any non-A commands.
Obviously, there would be a transform_M, etc. for each command type.
As an alternative, you could use a generic transform() that expects the
supplied function to recognize the command, parse it, modify the result
and put it back together.
I like the individual transform_* style because the identifying and
parsing/recombining logic would be hidden inside that one function.
The result would still require loop work, but it would be inside the
split_command, transform_*, and join_command functions.
This style takes a little getting used to, but it can be quite powerful
for problems with this structure.
HTH,
G. Wade
> and then separate the subcommands (A,M, Q, L, l, s, z, etc) from the
> coordinates thusly
>
>
>
> A=d.match(/regexp/g)
>
> B=d.split(/regexp/g)
>
>
>
> And then perform arithmetic on all i in A and then join everything
> back together in one swell foop:
>
>
>
> C=d.gaps(/regexp/g,/regexp2/g) (where the mythical "gaps" method of
> the array object would return an array of the number of
> regexp2-delimited items between A's boundaries)
>
>
>
> The properly defined "gaps" method would then allow something like
>
>
>
> D=superJoin(A,B,C) ==d
>
> And D=superjoin (A,arithmetic(B),C) == transform(d)
>
>
>
> As it is, I'm going to have to write loops to walk through the
> structure, pushing operators, numbers and coordinates onto separate
> stacks and then to loop through again to reconstitute the whole mess.
> Not a terrible thing, but .. Such tedium!
>
>
>
> Any ideas if such a construct has been posited before? It would be
> very handy for SVG path processing.
>
>
>
> Cheers
>
> David
>
>
>
> [Non-text portions of this message have been removed]
>
------------------------------------
-----
To unsubscribe send a message to: [email protected]
-or-
visit http://groups.yahoo.com/group/svg-developers and click "edit my
membership"
----Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/svg-developers/
<*> Your email settings:
Individual Email | Traditional
<*> To change settings online go to:
http://groups.yahoo.com/group/svg-developers/join
(Yahoo! ID required)
<*> To change settings via email:
[email protected]
[email protected]
<*> To unsubscribe from this group, send an email to:
[email protected]
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/