ciphers and programming style
- To: mathgroup at smc.vnet.net
- Subject: [mg13274] ciphers and programming style
- From: Tom <toad at planet.eon.net>
- Date: Fri, 17 Jul 1998 03:18:13 -0400
- Sender: owner-wri-mathgroup at wolfram.com
Hello Mathematica users. I recently worked on a simple set of definitions to produce a cipher. A cipher uses pictures to represent the letters of the alphabet. This cipher was used in one of the books about "The Shadow". Once the basic pictures were created, in order to disguise the code, they could be rotated by 90 degrees or 180 degrees, and so on. This would provide practice in the application of transformations to geometric figures, a topic in high school geometry. I would give the basic cipher, then give the students a code to decipher where all the letters in the basic cipher were rotated by 90 degrees or 180 degrees or something like that. I managed to get this all to work, but I learned some things that I didn't know before, and I wondered if someone could help me "clean up" my efforts somewhat? All the letters in the cipher are based on circles with various lines from the center of the circle to points on the circle. For example, here is what the letter "k" looks like. k=Graphics[{Circle[{0,0},1], Line[{{0,1},{0,0},{1,0}}]}, AspectRatio->Automatic]; Show[k]; I wanted to be able to put all the letters into a graphics array at the end, so that is why I used AspectRatio->Automatic Since I would be using the same points on the circle for all the letters (in various forms) and I also thought it would make it easier to rotate the letter forms, I created a list of points. Here is part of the list. pts={{0,0},{1,0},{0,1},{-1,0},{0,-1}}; So now, I can create letters based on these points. Below are my definitions of f,g,k and l f=Graphics[{Circle[{0,0},1], Line[{pts[[3]], pts[[5]]}], Line[{pts[[4]], pts[[2]]}]},AspectRatio->Automatic]; g=Graphics[{Circle[{0,0},1], Line[{pts[[3]], pts[[5]]}]},AspectRatio->Automatic]; k=Graphics[{Circle[{0,0},1], Line[{pts[[3]],pts[[1]], pts[[2]] }]},AspectRatio->Automatic]; l=Graphics[{Circle[{0,0},1], Line[{pts[[3]],pts[[1]], pts[[4]] }]},AspectRatio->Automatic]; Show[GraphicsArray[{f,g,k,l}]]; So far, so good..... I then found I could rotate all my "letters" 90 degrees by rotating my list of points by 90 degrees. I used the rotation matrix {{0,1},{-1,0}} Here is my original list of points again pts={{0,0},{1,0},{0,1},{-1,0},{0,-1}}; Using dot product..... pts=Transpose[{{0,1},{-1,0}}.Transpose[pts]] {{0,0},{0,-1},{1,0},{0,1},{-1,0}} So I did get a list of points, rotated through 90 degrees. (Clockwise) Here is where things got messy. First of all, I realized I now messed up my original list of points. And secondly, I found, to my astonishment, that Mathematica still used the OLD VALUE of pts when drawing the letters. I probably read this somewhere and "knew" it but I had not experienced it before. Show[GraphicsArray[{f,g,k,l}]]; The letters are not rotated. So, I needed to redefine the letters and then redraw them. SO I redefined the letters and then Show[GraphicsArray[{f,g,k,l}]]; There they are..... After I redefined the definitions of f,g,k and l. Things work fine. The question is, how might I have done this more elegantly? Not having any programming background I would appreciate any pointers on how I might have implemeted this more nicely. Thanks for any assistance you might provide. Sincerely, Tom