Re: operator overloading with UpValues (eg, for shifting graphics)
- To: mathgroup at smc.vnet.net
- Subject: [mg13642] Re: operator overloading with UpValues (eg, for shifting graphics)
- From: Paul Abbott <paul at physics.uwa.edu.au>
- Date: Fri, 07 Aug 1998 18:37:26 +0800
- Organization: University of Western Australia
- References: <6qbqkd$a67@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Daniel Reeves wrote:
> I thought it would be nice to shift some graphics by just adding an x-y
> pair. It seemed like this sort of thing should do that:
>
> Unprotect[Line];
> Line /: Line[pts_] + {x_,y_} := Line[pts+{x,y}] Protect[Line];
>
> But it doesn't. The UpValue for Graphics doesn't get used. This does
> work:
>
> Line /: Line[pts_] + shift[x_,y_] := Line[pts+{x,y}]
>
> but then I might as well just do this:
>
> shift[Line[pts_],{x_,y_}] := Line[pts+{x,y}]
>
> The idea is to be able to just say Line[...] + {x,y} and get a shifted
> Line.
>
> Does anyone know a way to do that?
> Also, if/why Mathematica is doing "the right thing" in defying my
> expectations in the first example. Ie, should the Listable-ness of
> Plus have precedence over my UpValue for Line?
I think you'll find that all these questions (and many more) are
answered in the excellent "Mathematica Graphics: Techniques and
Applications" by Tom Wickham-Jones. Incidentally, the packages for
this book are available from MathSource:
http://www.mathsource.com/cgi-bin/MathSource/Enhancements/Graphics/3D/0208-976
BTW, a nice simple example of Affine transformations on graphics was
given in The Mathematica Journal 4(3):38-39:
An arbitrary affine transformation (that is, a composition of
translation, rotation, and scaling) of a vector {x,y} in the plane can
be be written in matrix notation as m.{x,y} + c, where m is a 2x2
matrix (generating rotation and scaling) and c is a constant
(translation) vector.
Here is a simple procedure that applies affine transformations to
two-dimensional graphics:
Affine[plot_Graphics,m_?MatrixQ,c_?VectorQ]:=
Show[plot/.{x_?NumberQ,y_?NumberQ} -> m.{x,y}+c]
Commencing with a basic plot:
SinPlot=Plot[Sin[x],{x,0,6 Pi}];
one can rotate it about the z-axis by 90 degrees and then mirror it in
the y-axis:
Affine[SinPlot,{{0,1},{1,0}},{0,0}];
or display a more complicated combination of rotation, scaling, and
translation:
Affine[SinPlot,{{1,0},{1,3}},{-1,-2}];
> "This isn't right. This isn't even wrong."
> -- Wolfgang Pauli, on a paper submitted by a physicist colleague
Only a physicist would have such a sig ...
Cheers,
Paul
____________________________________________________________________
Paul Abbott Phone: +61-8-9380-2734
Department of Physics Fax: +61-8-9380-1014
The University of Western Australia Nedlands WA 6907
mailto:paul at physics.uwa.edu.au AUSTRALIA
http://www.physics.uwa.edu.au/~paul
God IS a weakly left-handed dice player
____________________________________________________________________