Fashionable Hopefuls: A Bit of Escher under the Skin

May 12th, 2020

As the previous parade of hopefuls is essentially still ongoing, I focused for a bit on painting with numbers, functions and scripts to automate it all. This is the write-up, with pics further down, as usual, playing catch-up (but not yet winning) with what came out of it so far.

Initially I wanted simply to tidy up all those loose scripts for texture generation and tie them together into a more easily controllable tool for exploring the R,G,B space where all possible textures await discovery. The whole of it didn't take all that long - in one day and a half (with assorted C/CPP related misery) over the weekend, all the relevant scripts were neatly separated into relevant categories, ready for mix-and-match or add-new-ones: image domain mapping, pattern generation, colour mapping. Then the full list of what was available got some additions as I started implemented all sorts of ideas gotten from my previous reading and then I started to give it a spin or two and then of course the whole carefully set up overall scripting went overboard because new things require new knobs to explore and there's no way to set it all upfront for *all* of it. And when I finally sat down today to "write it up", I looked in mild surprise at the accumulated *sets* of textures that have each a different style really because of the different underlying approach and various knobs and all that. While I could perhaps cram them all in a single article and be done with it, I think it makes more sense to take at least the write-up (and images per page) at a more reasonable pace and make a series out of it so that's it a bit easier to load and to digest too. This way I might even remember to pace the rest too, next time!1

In a rather amusing inversion of terms, from a fractal point of view it turns out that the M.C. Escher style is really just about the most boringly classical you could make - all it takes is a perlin-based typical multifractal2 + the most basic of colouring mappings (such as interpreting the result as % of each colour) and you're all set. Fiddle with the multifractal's classical knobs controlling noise and amplitude and you'll fit, as expected, increasingly more of it in each tiny patch until it all quickly turns to noise essentially - indistinguishable from noise, at least. Fiddle further with the additional offset knob and you can get some variation in pattern - as long as you keep the amplitude (hence number of octaves knob) quite low, up to a maximum of about 4 really. Worth noting here that the offset in this case simply acts as a fixed amount of *additional* amplitude at each iteration so basically making the fractal pack increasingly more/less in each shape already determined by the rest of knobs. So in this sense, the offset's effect is limited really, at least compared to what one can truly do with offsets that are not tied up so tightly with the multifractal's own parameters.

Without spending the time to fit any specific colour mappings to work just-so (or any other similar overfittings essentially), the pictures obtained are rather... boring, I should say, with all my heartfelt apologies going to Maurits Cornelis who did it all before there were computers to unleash the fractals just like that at the push of a button (after a lot of calculations and some code writing). Variations of pattern can be obtained to some degree with that limited knob controlling the offset but the essential trouble with this typical multifractal is that there's only one offset and no way to further play around with it during the iterations themselves. Nevertheless, hopefuls were found to want to give a go at getting under those escher-like skins, so here's the list of shots, starting with the textures themselves and then some hopefuls showing off the improved rotations by different angles on x,y and z axes as well as their newly found, skin-deep love of M.C. Escher:

tex_w512_h512_h0.700000_octaves2_offset100.000000_512.jpg
tex_w512_h512_h0.700000_octaves2_offset150.000000_512.jpg
tex_w512_h512_h0.700000_octaves2_offset50.000000_512.jpg
tex_w512_h512_h0.700000_octaves3_offset100.000000_512.jpg
tex_w512_h512_h0.700000_octaves3_offset150.000000_512.jpg
tex_w512_h512_h0.700000_octaves3_offset50.000000_512.jpg
tex_w512_h512_h0.700000_octaves4_offset100.000000_512.jpg
tex_w512_h512_h0.700000_octaves4_offset150.000000_512.jpg
tex_w512_h512_h0.700000_octaves4_offset50.000000_512.jpg
tex_w512_h512_h0.700000_octaves5_offset50.000000_512.jpg

skel_51_vol51_51_srf53_53_sym_1_tex23_rotxyz360_128_12_640.jpg
skel_51_vol51_51_srf53_53_sym_1_tex24_rotxyz194_30_142_640.jpg
skel_51_vol51_51_srf53_53_sym_1_tex25_rotxyz260_27_31_640.jpg

skel_100_vol7_7_srf17_17_sym_2_tex21_rot53_640.jpg
skel_100_vol7_7_srf17_17_sym_2_tex21_rotxyz73_359_143_640.jpg
skel_100_vol7_7_srf17_17_sym_2_tex22_rot288_640.jpg
skel_100_vol7_7_srf17_17_sym_2_tex22_rotxyz291_36_243_640.jpg
skel_100_vol7_7_srf17_17_sym_2_tex23_rot103_640.jpg
skel_100_vol7_7_srf17_17_sym_2_tex23_rotxyz360_128_12_640.jpg
skel_100_vol7_7_srf17_17_sym_2_tex24_rot189_640.jpg
skel_100_vol7_7_srf17_17_sym_2_tex24_rotxyz194_30_142_640.jpg
skel_100_vol7_7_srf17_17_sym_2_tex25_rot23_640.jpg
skel_100_vol7_7_srf17_17_sym_2_tex25_rotxyz260_27_31_640.jpg
skel_100_vol7_7_srf17_17_sym_2_tex26_rot119_640.jpg
skel_100_vol7_7_srf17_17_sym_2_tex26_rotxyz97_238_104_640.jpg
skel_100_vol7_7_srf17_17_sym_2_tex27_rot315_640.jpg
skel_100_vol7_7_srf17_17_sym_2_tex27_rotxyz249_303_210_640.jpg
skel_100_vol7_7_srf17_17_sym_2_tex28_rot358_640.jpg
skel_100_vol7_7_srf17_17_sym_2_tex28_rotxyz176_72_353_640.jpg
skel_100_vol7_7_srf17_17_sym_2_tex29_rot53_640.jpg
skel_100_vol7_7_srf17_17_sym_2_tex29_rotxyz253_320_314_640.jpg

In the next articles of this series, I shall leave classical Escher behind and illustrate for instance an exploration of the eyes-river, a travel through texture-galaxy and a stare into the trigonometry vortex that surely ate many other hopefuls before. Stay tuned or get out of tune, for the pictures are generated already and so I'll have to write them up anyway!


  1. I can imagine it. Just about... imagine it. 

  2. The very term multifractal is rather slippery since basically any combination of "fractal transformations" fits the notion of multifractal. Nevertheless, the simplest of those that I could find is this one used here: an fbm based on perlin noise, having in addition to the usual H and octaves, a fixed offset that gets applied (multiplication) at each iteration.