MathGroup Archive 1997

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Graphics manipulation question [revision]

  • To: mathgroup at smc.vnet.net
  • Subject: [mg8444] Re: [mg8318] Graphics manipulation question [revision]
  • From: Allan Hayes <hay at haystack.demon.co.uk>
  • Date: Sat, 30 Aug 1997 00:42:55 -0400
  • Sender: owner-wri-mathgroup at wolfram.com

Here is some simpler and faster code.
Please not that the function to be applied now comes first , as in  
MapAt and the rest of the input is as for Cases.

MapAtCases::usage =
  "MapAtCases[fn, expr, pattern]applies the function fn at each  
part of expr that matches pattern.
\nMapAtCases[fn,expr, pattern,lev, k, opts], applies fn at up to k  
positions in level lev.Default values are : for k, Infinity; for  
lev,1. There is only one option, Heads ->Infinity.
(the arrangement and behaviour of the inputs apart from the first  
one is like that of Cases).
\nThe data for fn for action at position pos are expr[[pos]],pos,  
index (first, second ... selection made), k, total number of  
selections made.";

Options[MapAtCases] = {Heads -> False};

MapAtCases[fn_,expr_,pat_,lev_:1,k_:Infinity, opts___?OptionQ] :=
  	Module[{n = 0, ln, pos},
   		pos = Position[expr, pat, lev, k, opts,
      		Sequence @@ Options[MapAtCases]];
      		ln = Length[pos];
    		MapAt[fn[#1, pos[[++n]], n, k, ln] & , expr, pos]
    	]

Examples
(1)
MapAtCases[f,{a,{a,b},a[b],a},a]

	{f[a, {1}, 1, Infinity, 2], {a, b}, a[b],
  	f[a, {4}, 2, Infinity, 2]}

MapAtCases[f,{3,{3,2},3[2],3},3,{2}]

	{3, {f[3, {2, 1}, 1, Infinity, 1], 2}, 3[2], 3}

MapAtCases[f,{a,{a,b},a[b],a},a,{2},2,Heads->True]
	{a, {f[a, {2, 1}, 1, 2, 2], b}, f[a, {3, 0}, 2, 2, 2][b], a}

(2)

g = Graphics[Table[Circle[{Random[],Random[]}, Random[]],{10}]];
cl = Table[Hue[Random[]],{10}];

MapAtCases2[{cl[[#3]],#}&,g,Circle[_,_?(#<.7&)],
	Infinity
];
Show[%, AspectRatio -> Automatic];

Note:
This form has been designed to ease the user's task by providing a  
great deal of data for immediate use. In fact so long as we  the  
function f can access the index (first, third,
choice ..) and the list of positions then the user can do just as  
much but with a little more programming:

In MapAtCases2, below, I have stored the positions in the variable  
MACPostions - which would be in the package context if the function  
were properly packaged and would need a usage message.

MapAtCases2[fn_,expr_,pat_,lev_:1,k_:Infinity,
   opts___?OptionQ] :=
  	Module[{n = 0, ln},
   		MACPositions = Position[expr, pat, lev, k, opts,
      	Sequence @@ Options[MapAtCases]];
    	MapAt[fn[++n]& , expr, MACPositions]
    ]

gg ={a,{a,b},a[b],a};

MapAtCases2[f[gg[[MACPositions[[#]]]],#]&,gg,a]

	{f[{a},1],{a,b},a[b],f[{a},2]}

MapAtCases2[{cl[[#]],
	g[[Sequence@@MACPositions[[#]]]]}&,g,Circle[_,_?(#<.7&)], 	
	Infinity
];

Show[%, AspectRatio -> Automatic];


Allan Hayes
hay at haystack.demon.co.uk
http://www.haystack.demon.co.uk/training.html
voice:+44 (0)116 2714198
fax: +44 (0)116 2718642
Leicester,  UK


  • Prev by Date: Re: calculate not in the decimalsystem
  • Next by Date: Re: aborting; fattened 3D parametric plots
  • Previous by thread: Comparison of Mathematica on Various Computers
  • Next by thread: Integrate[x^x,x]??