Vulcan #10
Saw function with `min` and rotation.
The generating code:
var z = pixel.point;
z *= new Complex(0.7,0.7);
var a = saw(z.Real);
var b = saw(z.Imaginary);
pixel.value = Math.Min(a,b);
Here the pixel is set to the minimum value; the previous post, Vulcan #9, used the maximum. Also, the complex numbers are back — notice the multiplication on the second line.`*=` is shorthand for “multiply the left side by the right side, then assign the result back to the left side.”
Recall that these are all repeating patterns. The multiplication serves to rotate the pattern, in this case by 45°.
Vulcan #11
See my brief description of paint‑by‑math in the previous post, in Vulcan #7.
As I was starting out with a blank canvas and a new program, I began mentally imagining different basic patterns that I could mix and combine in various ways. The patterns I had in mind were simple repeating forms that would uniformly fill a plane.
My brain can’t hold these mental pictures for long, so I started hand‑sketching them. Soon I decided the program could do a better job — plus it has features to store, categorize, recall, and modify the images I make.
After I made a few this way, similarities in the generating code became immediately obvious, along with a stream of “try me next” variations.
Today’s image uses the saw function with distance coloring
pixel.value = Math.Sqrt(a*a + b*b);
Vulcan #12
I only partially answered the “Why” question a few posts back. I spent a good part of last year writing the Art program, and the first couple of months of this year developing a new website. Fortunately, I had a collection of work — Cylinder Art — from a separate Christmas project that I could reuse here.
When that dried up, I had a brand‑new program, a brand‑new website, but no new artwork in the queue. I certainly didn’t want to roll out the new site and then immediately let it go stale.
So I decided to just post whatever I’m working on. This isn’t the first time I’ve put together a behind‑the‑scenes or workshop‑style series. But the main reason is simply that I’ve started to find these very simple basic patterns interesting in their own right — especially when collected together.
If you’re following the code, today’s image uses both the saw() and frac() functions.
var z = pixel.point;
var a = frac(z.Real);
var b = saw(z.Imaginary);
pixel.value = Math.Max(a, b);
Vulcan #13
Why is this series called Vulcan? See Wikipedia and Altar Gods. He is often depicted with a hammer and a forge. Unlike his lazier counterparts who simply conjured things into existence, Vulcan actually built things the hard way. I’ve already set a precedent for mixing mythologies, and I chose Vulcan because it’s easier to read and say than Hephaestus.
This series is about building images from basic patterns — and also about building and using my new art program and the new website. I’m not sure where this series is headed, only that wherever it ends up, it will get there through construction and craft, not by conjuring a finished product.
Today’s piece is a picture of the frac/saw mix with distance coloring.
var z = pixel.point;
var a = saw(z.Real);
var b = frac(z.Imaginary);
pixel.value = Math.Sqrt(aa + bb);
Vulcan #14
I am running out of things to say. That is normal, 50% of my posts are only pictures. I am falling back into that mode now.
For those who are interested, and for images where the math is visible, I will include some brief code/formula math snippets.
$pixel.value = \sqrt{a}+\sqrt{b}$
The rest of the setup is similar to the previous posts.
Vulcan #18
The next set of images introduces some symmetry around the diagonal axes in addition to the orthogonal axes.
The pattern in the earlier images could be repeated forever. A vast plane in which wherever you are standing, it looks exactly the same as anywhere else. These new ones, add a unique point at the center. There is an eight pointed star at the center. Other than some small distortion, everywhere else looks like everywhere else.
I am going to dial back on the math. But if you are curious, the additional symmetry is the result of $$z = z^2 /\lvert z \rvert$$ The squaring maps the diagonal axes to the vertical axis. Dividing by the absolute value keeps things the same size.