The algorithm as presented turns the image into a quadtree as it works, for then re-flattens it. But if we store the image as a quadtree to begin with, we obtain other advantages:
1. We can memoize operations like rotation so that the algorithm goes much faster for images that have large blocks of a single colour or pattern;
2. We can write other operations that recursively apply to the image, like changing one color to another.
http://raganwald.com/2016/12/27/recursive-data-structures.ht...
Original discussion:
A B C D M I E A
E F G H N J F B
I J K L O K G C
M N O P P L H D
D H L P P O N M
C G K O L K J I
B F J N H G F E
A E I M D C B A
With the right tile sizes and memory alignment you could parallelize these steps without false sharing.Compare to the normal way you rotate things by right angles where e.g. new_image(x,y) = old_image(y, old_height - x), which is extremely embarrassingly parallel.
The actual reason is that it is fun.
If you implement this as a view (rather than imperatively), you can get the compiler to optimize out four successive rotations to nothing :)
https://blog.cy.md/2014/03/21/functional-image-processing-in...
But yes, it's mostly fun :)
- moving data in stages like the OP video which might be better for the cache (I don’t believe this) but would require writing to/from me more multiple times per pixel which I think would make it slower
- Accessing memory in a certain order when doing this on a cpu. Certainly that is a reasonable thing to expect to improve performance (roughly breaking the image into blocks that fit exactly into N cache lines, rotating in registers/memory, then writing into exactly N cache lines means you aren’t reading data from RAM/cache that you can’t use), but I don’t think that is related to the recursive process described in the article, unless you mean that you can use this process to get some operations like block(x,y,16) moves to block(s,t,16) and those could be executed cache-efficiently? But then this recursive method is more confusing and more restrictive on the image size than the thing I tried to describe at the start of this bullet point