So here is the best I could come up with…
https://github.com/bigjosh/Move38-Arduino-Platform/blob/main/libraries/Examples05/BrokenRainbow/BrokenRainbow.ino
It uses only ‘setValueSentOnFace()’ (and only 56 of the possible 63 values) to be able to detect the as-the-blink-flies distance away from the center for contiguous groups of tiles with a radius of 5 or less.
I do not have enough blinks to exactly make your example pattern, but hopefully this shows that it works correctly (white=0, blue=1,green=2,red=3)…
Here is more complicated arrangement (4=yellow, cyan=5)…
To get it to work, I had to take advantage of two insights:
-
There is perfect 6-fold symmetry around the center, so yyou only need to know where you are inside a single 1/6th sector of the full area.
-
In the rings that are a distance of 1 and 2 away from the center, there must be a direct path to the center so no need to cover indirect back-tracking paths.
Here is a map of the symbols (i.e. values) sent on each face…
…where the first number is the distance out (“ring”), the second number is the distance away from the radial (“step”), and the decimal is the relative orientation (“face”). Note how when the step gets to the next radial, it effectively just jumps back to the 1st step.
I am pretty happy with this solution, but my gut tells me that there is an even better one just beyond my grasp. I feel like there must be some way to take advantage of the additional symmetries as you get farther away from the center. Or maybe there is some completely different way of viewing the problem that is much, much better than keeping track of positions and orientations. If you find a better solution (one that uses fewer symbols for a given radius) please, please let me know because this problem has been gnawing at me for a long time!