glynnSim

Description

The glynnSim variations are a cross between linear and spherical. Using the unit circle as a dividing line, their output has three parts:

  • Outside the unit circle is whatever was there before (like linear),
  • Inside the unit circle is a reflection across the unit circle of what was outside the unit circle (like spherical), and
  • The points that were inside the unit circle are replaced with a blur:
    • for glynnSim1, the blur is a disk,
    • for glynnSim2, the blur is an arc, and
    • for glynnSim3, the blur is the border of a ring.

The following figure illustrates what the three glynnSim variations do to a 4×4 checkerboard, along with spherical for comparison.

The size and position of the blur can be controlled using various parameters. All of them are summarized in the table below; we’ll examine the most important ones in detail as we go along.

Name: glynnSim1
Name: glynnSim2
Name: glynnSim3
Type:2D
Author: Alexey Ermushev (eralex61)

We start our exploration with glynnSim1 used by itself. Since colors are determined by the order in which transforms are used, a flame with a single transform will only have a single color besides the background color (unless a direct color variation is used, which the current glynnSim variations do not support). So we’ll use a white background and an all black gradient. Here is a starting flame with glynnSim1 on a transform that has been moved 0.5 left and 1 down.

<flame smooth_gradient="0" version="JWildfire V3.31 (30.03.2018)" size="1000 1000" center="0.9 1.5" scale="226.928895612708" rotate="0.0" filter="0.75" filter_type="GLOBAL_SHARPENING" filter_kernel="MITCHELL_SMOOTH" filter_indicator="0" filter_sharpness="4.0" filter_low_density="0.025" oversample="1" post_noise_filter="0" post_noise_filter_threshold="0.35" quality="100.0" background_type="SINGLE_COLOR" background="1.0 1.0 1.0" bg_transparency="0" brightness="15.0" saturation="1.0" gamma="6.0" gamma_threshold="0.01" vibrancy="1.0" contrast="1.0" white_level="220.0" temporal_samples="1.0" cam_zoom="1.0" cam_pitch="0.0" cam_yaw="0.0" cam_persp="0.0" cam_xfocus="0.0" cam_yfocus="0.0" cam_zfocus="0.0" cam_pos_x="0.0" cam_pos_y="0.0" cam_pos_z="0.0" cam_zpos="0.0" cam_dof="0.0" cam_dof_area="0.5" cam_dof_exponent="2.0" low_density_brightness="0.24" balancing_red="1.0" balancing_green="1.0" balancing_blue="1.0" cam_dof_shape="BUBBLE" cam_dof_scale="1.0" cam_dof_rotate="0.0" cam_dof_fade="1.0" resolution_profile="1000x1000" antialias_amount="0.25" antialias_radius="0.2" post_symmetry_type="NONE" post_symmetry_order="3" post_symmetry_centre_x="0.0" post_symmetry_centre_y="0.0" post_symmetry_distance="1.25" post_symmetry_rotation="6.0" frame="1" frame_count="300" fps="30" post_blur_radius="0" post_blur_fade="0.95" post_blur_falloff="2.0" zbuffer_scale="1.0" mixer_mode="OFF">
<xform weight="0.5" color="0.0" symmetry="0.0" mirror_pre_post_translations="0" material="0.0" material_speed="0.0" mod_gamma="0.0" mod_gamma_speed="0.0" mod_contrast="0.0" mod_contrast_speed="0.0" mod_saturation="0.0" mod_saturation_speed="0.0" mod_hue="0.0" mod_hue_speed="0.0" glynnSim1="1.0" glynnSim1_fx_priority="0" glynnSim1_radius="1.0" glynnSim1_radius1="0.1" glynnSim1_phi1="45.0" glynnSim1_thickness="0.0" glynnSim1_pow="1.5" glynnSim1_contrast="0.5" coefs="0.94 0 0 0.94 -0.5 1.0" chaos="1.0"/>
<palette count="256" format="RGB">
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000 </palette>
</flame>

Copy and load it into JWildfire, then start rotating the transform 1 triangle slowly to the left. Here is a sequence of images obtained at various rotations:

The first one, at 23°, is not very exciting visually, but it does have an interesting fractal structure that’s worth taking a closer look at. It is formed from a sequence of segments which are lines with spirals at both ends. Here is a high magnification of the segment at the bottom of the flame.

We see that each of the segments is similarly formed from a sequence of similar segments, each of which is formed in the same manner. Only a few levels can be seen here, but this goes on to infinity. At this angle, the segments don’t quite touch each other. At smaller angles, the segments are further apart. At larger angles the segments start overlapping each other.

But when we look closely, they don’t actually overlap; that would look messy. They touch and blend together nicely. This is due to the way glynnSim works. Let’s have a closer look at the 34° flame, and overlay it with a unit circle, in blue (only partially visible here at the top left). Notice how bottom of the segment inside the circle and the top of the next segment are cropped by the circle. This cropping is passed on to the rest of the segments by the fractal iteration.

Here’s a mind-blowing observation: The part of the fractal inside the circle is a spherical reflection of the fractal outside the circle! This is how glynnSim works. The pre-affine transform “winds” the spiral one notch, so each segment moves down one. The first segment (inside the circle) moves where the second segment was, and so on. Then glynnSim is applied. The very end of the first segment is still inside the circle and cropped off; those points become the black disk that straddles the unit circle. The rest of the fractal is reflected across the unit circle to become the first segment of the next iteration. This also explains why the 23° flame doesn’t contain any black disks: winding the spiral a notch moves it entirely outside the circle, so no points are left inside to generate them.

This background is interesting, but we’re getting pretty technical, and we don’t really need to understand it to actually use glynnSim. Let’s use the flame above to see how the parameters work. The disk is always centered on the circle; the specific location is controlled by the parameter phi1, which is the angle, in degrees, to position the disk. The position used above is 45°; increasing it will move the disk clockwise. The size of the disk is specified with the parameter radius1; the value 0.1 is used above. If we increase phi1 to 63.5 and increase radius1 to 0.15, we get this (the unit circle in blue is left for reference; it is not part of the glynnSim flame itself).

There may be some way to compute exact values for these parameters, but it is easiest to just try different values to see what happens. For example, setting phi1 to 63 makes the disk touch one part of the figure and 64 makes it touch another, so the value halfway between the two (63.5) works well.

We can put a hole in the disk using the thickness parameter, which specifies the relative size of the hole. The value 0 is used above, meaning there is no hole. The maximum of 1 means to just outline the disk. Let’s see how that works increasing the angle to 40°, shown with a value of 0 in the right middle figure above. Changing thickness to 1 gives us a flame with lots of holes, a type of gasket. Again, the blue unit circle is included for reference, and as with the previous flame, the inside of the circle is a spherical reflection of the outside.

The natural thing to do when presented with a flame with holes is to try to fill them! There are a lot of ways to fill circular holes: bubble, eyefish, any of the disc variations, and plenty more. We’ll use disc. But it isn’t quite as easy as adding a transform and changing the variation to disc. There are a number of considerations:

  • The fill transform can easily overpower the glynnSim, so the weights need to be adjusted. Either increase the glynnSim weight or decrease the fill weight. For the fractal below, the glynnSim weight was increased to 50.
  • The fill transform circle must be moved to coincide with the first hole. This is done by adjusting the post transform of the new transform. This can be calculated using a bit of math, but it’s usually just as easy to move it by eye.
  • The fill tranform size must be adjusted to fit the circle. In most cases, this can be done using the variation amount or by adjusting the post transform. For the fractal below, the disc amount was set to 0.25. It is often easiest to set the amount to a low value, like 0.1, before moving it, then increasing it to fill the hole.
  • The pre-affine settings for the fill transform may need adjusting to get good coverage to the variation. For the fractal below, the pre-affine size was increased by 200%.
  • Since we now have two variations, we can use color! Choose a gradient besides all-black, and set a color for the new transform. The color speeds probably need to be adjusted as well. Below, the built-in gradient fighting-forms.ppm was used, the color for the disc transform was set to 1, and the speed for the glynnSim1 transform was set to 0.7.

Putting all of this together might result in something like this:

Let’s move on to glynnSim2, which creates arcs instead of disks. Going back to the previous flame (with the holes), we change the variation to glynnSim1. The arcs are controlled with three parameters. Thickness controls how thick the arcs are. It is often set very small, like 0.01, which we’ll do here. The arc is always along the unit circle, and the two endpoints are specified with the angles phi1 and phi2. If set to 0 and 360, the arc is a full circle. Most often they are set to smaller values by eye. Change the phi1 or phi2 value and see what changes in the flame, then increase or decrease the value to find the best position for the endpoint. Here, we set phi1 to 33.5 and phi2 to 97 to get a web-like design.

So far, we only changed the rotation of the glynnSim variation’s affine triangle since it helps to understand how iterating the variation works. But moving and scaling the triangle will also produce different results. Notice that the rotations shown above are for that particular position and size, and only a relative narrow thirty degree range produces interesting results. Actually, a second thirty degree range rotating right instead of left produces similar results but with the spiral going the other way. With other combinations of position and size, different rotation ranges are useful, but always narrow ranges. Here’s another example of glynnSim2 using a different position, size, and rotation.

A very important parameter for all of the glynnSim variations is contrast, which controls the relative contrast between the linear (outside) and spherical (inside) parts. Like other things glynnSim, it is best set by experimenting with different values to get the best result. In general, lower values tend to emphasize the inner spirals. It has actually been adjusted slightly without comment in some of the previous examples to bring out their structure, but it should be optimized individually for every glynnSim flame. This can usually be done fairly late in the process, after more important tweaks are made, but occasionally it need to be lowered drastically to even see the structure. For example, the following glynnSim2 flame shows almost no structure with the default value of 0.5. I set it to 0.1 while refining the affine triangle position and phi values, then adjusted it by trial and error to 0.125 for the final render.

The pow parameter works with the contrast parameter to help compensate for the fact that areas closer to the origin have a higher density than areas further away. The default value of 1.5 works well in the vast majority of cases. Changing it is normally a fine-tuning step done to polish the appearance of a flame after its basic appearance is set and the gradient is selected. Changing it may also require adjusting the contrast parameter slightly.

Another parameter common to all three glynnSim variations is radius. All of the references above to the “unit circle” assume radius is 1. Changing it will set the radius of the circle glynnSim uses to separate “inside” and “outside”. When glynnSim is used by itself (as we have mostly done so far), anything that changing radius can do can also be done by moving the transform triangle diagonally up and left or down and right. (Specifically, multiplying the radius and the affine O1 and O2 values by the same number will produce the same result, just at a different size.) This doesn’t mean the parameter is useless; just redundant with moving triangles, so we won’t cover it in detail here.

GlynnSim3 is similar to the other two, but because its blur isn’t filled in it requires a different approach. Just for comparison, here is the 40° flame shown above with both glynnSim1 and glynnSim2 using glynnSim3. The overlapping rings are a bit overwhelming. (It is possible to make the rings very narrow, but then it’s like glynnSim2 without the ability to cut off the excess lines.)

The typical approach to glynnSim3 is to fill the rings with something. There are lots of ways to do this; see the links in the Resources section below. For sake of variety, we’ll use yet another method here; a simple one that will allow us to focus on how glynnSim3 works.

We’ll start with a glynnSim3-only starting flame (the same one used in the subflame description). Since we will have multiple variations, so can use color, it has a black background and a colored gradient (the built-in one named rw-browns-orange-yellow-with-blues). Here is the flame:

<flame smooth_gradient="0" version="JWildfire V3.31 (30.03.2018)" size="1000 1000" center="1.0 -1.0" scale="189.10741301059" rotate="0.0" filter="0.75" filter_type="GLOBAL_SHARPENING" filter_kernel="MITCHELL_SMOOTH" filter_indicator="0" filter_sharpness="4.0" filter_low_density="0.025" oversample="1" post_noise_filter="0" post_noise_filter_threshold="0.35" quality="10.0" background_type="GRADIENT_2X2_C" background_ul="0.0 0.0 0.0" background_ur="0.0 0.0 0.0" background_ll="0.0 0.0 0.0" background_lr="0.0 0.0 0.0" background_cc="0.0 0.0 0.0" bg_transparency="0" brightness="50.0" saturation="1.0" gamma="3.5" gamma_threshold="0.01" vibrancy="1.0" contrast="1.0" white_level="220.0" temporal_samples="1.0" cam_zoom="1.0" cam_pitch="0.0" cam_yaw="0.0" cam_persp="0.0" cam_xfocus="0.0" cam_yfocus="0.0" cam_zfocus="0.0" cam_pos_x="0.0" cam_pos_y="0.0" cam_pos_z="0.0" cam_zpos="0.0" cam_dof="0.0" cam_dof_area="0.5" cam_dof_exponent="2.0" low_density_brightness="0.24" balancing_red="1.0" balancing_green="1.0" balancing_blue="1.0" cam_dof_shape="BUBBLE" cam_dof_scale="1.0" cam_dof_rotate="0.0" cam_dof_fade="1.0" resolution_profile="1000x1000" antialias_amount="0.25" antialias_radius="0.5" post_symmetry_type="NONE" post_symmetry_order="3" post_symmetry_centre_x="0.0" post_symmetry_centre_y="0.0" post_symmetry_distance="1.25" post_symmetry_rotation="6.0" frame="1" frame_count="300" fps="30" post_blur_radius="0" post_blur_fade="0.95" post_blur_falloff="2.0" zbuffer_scale="1.0" mixer_mode="OFF">
<xform weight="1.0" color="0.5" symmetry="0.75" mirror_pre_post_translations="0" material="0.0" material_speed="0.0" mod_gamma="0.0" mod_gamma_speed="0.0" mod_contrast="0.0" mod_contrast_speed="0.0" mod_saturation="0.0" mod_saturation_speed="0.0" mod_hue="0.0" mod_hue_speed="0.0" glynnSim3="1.0" glynnSim3_fx_priority="0" glynnSim3_radius="1.0" glynnSim3_thickness="0.4" glynnSim3_contrast="0.5" glynnSim3_pow="1.5" coefs="6.123233995736766E-17 -1.0 1.0 6.123233995736766E-17 2.1 0.0" chaos="1.0"/>
<palette count="256" format="RGB">
8040408C4C4C9251519957579F5D5DA56363A86666AC6969BB7777C27871C9796BD07A65
D87B60DF7C5AE67D54E97D51ED7E4EFF8040FF8345FF874BFF8A50FF8E56FF9059FF925C
FF9967FF9C6CFFA072FE9C6DFE9969FD9462FC905CFB8850FA7F44F76D2BF5641EF45C12
EF5409EA4C00E64B00E24A00D24400CA4100C23F00BA3C00B23A00AE3800AA3700A63600
A33D039D4A099A500C97570F945D129164158F67168E6A1890791D957D1E9B821FA08620
A68B21A98D21AC9022B19423B79924BFA026C3A632C8AC3ECAAF44CDB24AD2B856D6BF62
DFCB7AE5D289EBDA98ECDB90EEDC89EFDC85F0DD81F1DE7AF3DF72F6E163F7E25BF9E354
F9E352FAE450F5DE48EFD940E4CD30DFC728DAC221D7BF1DD4BC19CFB611C7AE05CD9C05
D38904DF6503E45202EA4002ED3702F02E02F61B01FC0901F00000E10000D30000CC0000
C50000B60000A800009900008B00008414148B1E1E922929A13D3DAF5151BE6666CC7A7A
E9A3A3F4B2B2FFC1C1FBC1BCF8C1B7F0C2ADE9C2A4E2C39ADBC490CCC57CC8C577C5C573
BAC664BDC86BC0CB71C3CD78C9D285CCD48BCFD792D0D895D2D998D5DC9FD6DDA2DAD1AC
DFC5B6E7ACC9E9A6CEECA0D3F094DDF488E7F97CF0FF6AFFED79F2E87CEEE380EBDA87E5
D18EDEC896D8BF9DD1B6A4CBACABC4A99DBAAA94B6AB8BB3AC79ACAD67A6AF559FB04398
B31F8AB41185B50480B6147AB82373B9336DBA4366BC5360BD6259BF7253C0824DC19146
C29943C69F4ECAA65ACDAC65D5B97CD7BC82D9BF88DDC593E0CC9FE6D5B0E0D0A7DBCB9D
D5C694D0C18ACABC81C4B777BFB26EB9AD64B4A85BB1A656B89D4DBE9344C58A3BCC8132
D27829D96E20E06517E65C0DF04E00F2550AF35C13F5631DF66A26F87130F9783AFB7F43
FD874DFE8E56FF915BFF9764FF9D6EFFA477FEAA81FEB08AFEB694FEBD9DFEC3A7FDCCB5
F0BDA9E3AE9CD5A090C89184BB8277AE736BA1655F9456528647468040408747478D4E4E
9454549B5B5BA16262A86868AF6F6FB57676BF8080C38787C68F8FCA9696CE9E9ED1A5A5
D5ADADD9B4B4DDBCBCE2C7C7 </palette>
</flame>

A simple and unsophisticated method of filling in the rings is to add a new transform, change the variation to julian, and set power to 25 and dist to 5. It looks like this:

Now we have a basic filled glynnSim3 flame, ready for tweaking. Start by changing the pre-affine triangle of the glynnSim3 transform. Make it bigger to help fill in the holes, then move and rotate it to find an interesting pattern. Increase the weight if needed to show more levels. Then tweak the julian parameters; reduce the amount and the dist parameter to make it fit once again into the rings. Reduce the power if the texture seems too dense, or increase it to increase the density. Negative powers will turn the fill texture inside-out. Here’s one of the many possible results.

You can also use other julia variations to get different effects. This one uses phoenix_julia.

The glynnSim variations also work well with many other variations, although I am not aware of any specific styles. These don’t need to be monochrome since multiple transforms are used. To start, we just create a new flame, add the first transform and change the variation to a glynnSim, add the second transform, change its color to 1, and pick some new variation for it. Then select the glynnSim transform and manipulate the triangle as with a single transform glynnSim to find a nice pattern. Alternatively, start with a single transform glynnSim (or a two transform filled glynnSim), change the gradient, add another transform, change its color to 1, and pick some new variation for it. Then adjust the other variation’s triangle and parameters, the glynnSim parameters, and other standard tweaking techniques.

A lot of different variations will work well, although there are also a lot that don’t work well. The only way to know for sure is to try and see. We’ll see a few examples here, but they just scratch the surface of possibilities. First is something flower-like made with glynnSim1 and elliptic.

Many variations will cause a lot of overlap that doesn’t occur with glynnSim alone. This can be a mess, but it can also make nice nebula, especially with glynnSim1 where the blur circles act as stars, like this glynnSim1 and coth combination. (The gamma was increased to give it a more painterly feeling.)

GlynnSim2 uses arcs to make designs. Here it is used with escher.

The only real difference between using a second variation to fill a glynnSym hole or ring, and using one to work in conjunction with the glynnSim is that a fill variation is specifically focused to fit in the blank space. The final example uses glynnSim3 filled with julian along with an additional shredrad variation, which repeats the motif and helps fill in other spaces.

Parameters

variation amountScale factor for the result
radiusThe radius of the glynnsim effect. Points further from the origin than radius are both passed directly (like linear) and reflected to the inside (like spherical). The inside points are mapped to a blur according to the variation.
radius1For GlynnSim1, the radius of the circle where inside points are collected.
phi1For GlynnSim1, the angle in degrees of the center of the circle where inside points are collected.

 

For GlynnSim2, the angle in degrees of one end of the arc where inside points are collected.

phi2For GlynnSim2, the angle in degrees of the other end of the arc where inside points are collected.
thicknessFor GlynnSim1, the relative size of a hole in the inside point circle, ranging from 0 (no hole) to 1 (just the circle outline).

 

For GlynnSim2, half the thickness of the inside point arc from 0 (arc is a line) to 1 (arc is two units thick).

For GlynnSim3, half the thickness of the ring.

(The GlynnSim2 arc or GlynnSim3 ring is centered on the circle defined by radius and extends thickness units both towards and away from the origin, so its width is twice the thickness value.)

contrastThe relative contrast between the duplicated outside points, from 0 (favor the linear copy) to 1 (favor the spherical copy duplicated to the original inside points).
powAdjusts the contrast based on the distance of the point from the origin to compensate for the higher density of points closer to the origin. The default value of 1.5 generally works well, but may need to be adjusted for some values and gradients.

Resources

Flame pack (flames used above)
GlynnSim Variations at Fractal Formulas by Rick Sidwell
GlynnSim plugin by eralex61 contains a sample flame pack (the Apophysis plugins are not needed or supported by JWildfire)
Circular Flame Tutorial by pillemaster describes a nice way to fill the glynnSim3 rings
A JWildfire adaptation of the Circular Flame Tutorial by Naomi Richmond
A JWildfire adaptation of the Circular Flame Tutorial by Brad Stefanov
Filling GlynnSim3 by Tatasz
Subflame here on JWildfire Sanctuary by Rick Sidwell describes how to use subflame to fill glynnSim3

Related Posts

You may be interested in ...

1 thought on “glynnSim”

Leave a Comment