6
$\begingroup$

Background: I am working on a program that produces design patterns ( using wallpaper- and frieze-group theory ). This is for example a 'generating region' for a frieze or a wallpaper.

   Graphics[Polygon[{{.1, .1}, {.3, .8}, {1, .1}, {.5, .5}}]]

In reality this piece of Mathematica Graphics code is the result of many ( matrix- ) calculations.

Usually I want this in a larger size, for example 1 by 2:

   Graphics[{Polygon[{{.1, .1}, {.3, .8}, {1, .1}, {.5, .5}}], 
    Polygon[{{1.1, .1}, {1.3, .8}, {2, .1}, {1.5, .5}}]}]

Currently I work as follows: ===pseudocode=== follows:

  Map[ CalculateBaseMotif[#1,#2] &, 
       Flatten[Map[# &, Table[{ii, jj}, {ii, 1, lenX}, {jj, 1, lenY}]], 1]

So CalculateBaseMotif is calculated over and over. While all I want is to transtlate the result of

   G=Graphics[Polygon[{{.1, .1}, {.3, .8}, {1, .1}, {.5, .5}}]].

Summarizing: I make a ( complicated ) graphic G requiring many calculations of width W and height H. Then I want to produce a ( final ) graphic like so:

  GGGG
  GGGG

thus having width 4 x W and height 2 x H in the most efficient manner.

Question: How to define and work with temporary graphics data ?

$\endgroup$
10
$\begingroup$

You can use Translate for this, e.g.

With[{w = 5, h = 4, gr = Polygon[RandomReal[1, {20, 2}]]},
 Graphics[Translate[gr, Tuples[{Range[w], Range[h]}] - 1]]]

Mathematica graphics

$\endgroup$
  • $\begingroup$ This will speed up things nicely. $\endgroup$ – nilo de roock May 18 '12 at 12:11
  • $\begingroup$ I like the Tuples iterator. Would have gone for a Table out of old ingrained procedural habit. $\endgroup$ – Yves Klett May 18 '12 at 12:16
  • $\begingroup$ There's a problem with geometric transformations in graphics: ToBoxes processes them using some recusrive function, so if we try to make more than ~$IterationLimit/2 copies (4096 by default) of an object using e.g. GeometricTransformation, then it will fail. I hit this problem a few days ago, in 3D: Graphics3D@ GeometricTransformation[Sphere[], TranslationTransform /@ N@Tuples[Range[14], {3}]]. Strangely Translate doesn't have the problem... $\endgroup$ – Szabolcs May 18 '12 at 12:18
  • $\begingroup$ Since Range is Listable you could write: Tuples @ Range @ {w, h} (+1) $\endgroup$ – Mr.Wizard May 18 '12 at 12:26
  • $\begingroup$ @Szabolcs Do you think this $iterationLimit/2 limit should be reported as a bug? $\endgroup$ – Jens May 18 '12 at 14:14
2
$\begingroup$

Just for completeness, I checked whether there is a failure due to $IterationLimit if one re-casts the tiling using GeometricTransformation. Although there is indeed a problem in 3D graphics if you tile more than 4096 (by default) 3d objects, as mentioned by @Szabolcs in the comment to Heike's answer, that fortunately doesn't seem to happen for the 2D graphics in this question.

Here is a test where I decided to use the at function from this answer, defined as follows

at[position_, angle_: 0][obj_] := 
 GeometricTransformation[obj, 
  Composition[
   TranslationTransform[position], 
   RotationTransform[angle]
 ]
]

With[
 {
  w = 8, h = 8,
  gr = {Orange, Disk[{0, 0}, {.1, .2}]}
 },
 Graphics[
  Map[(gr // at[#, ArcTan[Sin[#[[1]]]/Cos[#[[2]]]]]) &,
   Tuples[{Range[w], Range[h]}] - 1]]]

tiling

If you increase w and h to 70 both, it takes much longer but still works.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.