4
1
Iterated Function Systems
An Iterated Function System (IFS) is a method of constructing self-similar fractals. Each fractal is defined recursively as the union of several copies of itself, with each copy obtained by applying a transformation function to the whole. The functions are usually affine transformations of the form x↦Mx+b: i.e. a linear transformation such as a rotation, scaling or reflection, followed by a translation. Given a set of transformations, the fractal can then be obtained iteratively as follows: begin with a point (for example the origin) and repeatedly apply a randomly-selected transformation from the set. The sequence of points generated, which converges to the fixed point of the IFS, is then plotted.
The most famous example of an IFS is the Barnsley Fern. This is produced from four affine transformations, shown in the diagram below (taken from Wikipedia).
The affine transformations used in this questions involve only uniform scaling, rotation by a multiple of 90°, and translation. They can be implemented as follows, where n is the scale factor, θ is the rotation angle in radians and b is the translation in 'plot units' (e.g. pixels):
Seven-segment displays
A seven-segment display (SSD) is a cheap and simple electronic display device often used in clocks, meters and calculators to display decimal numerals. Though it wasn't designed to display letters, it is sometimes used to do so. The resulting alphabet is often ambiguous and sometimes unintuitive, but is sufficient for certain status messages (e.g. "nO dISC" or "gOOdbYE"). Below is one way to represent the 26 letters and 10 numerals on a seven-segment display.
Task
The aim of this challenge is to produce word fractals using IFSs and the SSD alphabet above.
- The input is a string of multiple alphanumeric characters. The string may contain both upper and lower case letters, though the SSD alphabet is case insensitive. The program need not support punctuation or whitespace characters.
- The output should be an IFS plot representing the string as rendered in the SSD alphabet above. Each lit segment in each character should correspond to an additional affine transformation mapping the bounding box of the rendered word to that of the segment. Horizontal segments should remain facing upwards, while vertical segments should face 'outwards' (i.e. left-side up on the left, right-side up on the right). The precise alignment/overlap of segments is left up to the solver, as long as the output is legible. For an example output showing one possible alignment, see below.
- There should be a constant non-empty gap between the letters, to make the output legible.
- The plot should contain enough points to be legible.
You may write a program or function, taking input via STDIN (or closest alternative), command-line argument or function argument. The output should be drawn either to screen or to a file in any standard graphic format. As part of the answer you should include a screenshot of your output for the word "COdEgOLF". Standard code golf restrictions apply.
Example
Scoring
Shortest code (in bytes) wins. Standard rules apply.
Miscellania
For a good mathematical introduction to IFSs (including fractal compression) see these PDF lecture notes.
For a similar challenge concerning self-similar text see Words within words within words within words . . ..
Sigh, this could have been an [tag:ascii-art] instead... – Optimizer – 2015-04-22T10:34:08.760
@Optimizer: You mean like the linked challenge at the end? ASCII art works well with rewriting systems (like L-system) but I can't see how you would make it work for IFSs? – Uri Granta – 2015-04-22T12:34:31.363
It looks like the majority of the code is needed for encoding the alphabet, so i expect it to turn into a competition of who can write a shorter version of
exec(base64decode("VeryLongStringOfGibberish"))
. How about letting us declare a minimal representation with 7 bit per character (for exampleletters=[[1,1,1,1,1,1,0], [0,1,0,1,1,1,1],[1,1,0,1,1,0,1], ...[1,1,1,1,0,1,1]]
) for "free"? that would result in more logic and less compression. – DenDenDo – 2015-04-22T13:20:24.987@DenDenDo Do you think so? I assumed that most people would go for 1 byte per letter plus some decoding logic, and that it would end up being about half compression half logic. I even thought it might be too 'boring' if the alphabet is passed in as a parameter. Is that not what you're finding? – Uri Granta – 2015-04-22T13:29:05.667
If that was your intention from the beginning, then its fine of course. Its just my personal preference to have challenges focus on one aspect. – DenDenDo – 2015-04-22T13:45:45.377