All Fract-O-Rama formula files have a section that looks like this:
formula { zero or more statements while(some_condition) { zero or more statements } zero or more statements }
The 'while(some_condition)' part specifies the conditions under which the program will continue to execute the statements inside the while loop.
Here is a complete formula file with a typical while loop condition:
fractal { mapping { (-2, -2, 2, 2) => (200, 200) } formula { z = [0, 0]; while($count < 20 && ssq(z) < 4) { z = z ^ 2 + current; } $value = deg(z) * (255 / 360.0); set_color($value, $value, $value); } }
Many interesting fractals can be generated by varying the condition that governs the while loop. Regions are one such mechanism, they provide a way to test to see if a point is within a certain area. Typically this is used in a manner like this:
fractal { mapping { (-2, -2, 2, 2) => (200, 200) } formula { z = [0, 0]; while($count < 20 && ssq(z) < 4) { if(inside(z, /* some region */)) { // our 'z' point is inside the region, leave the // while loop prematurely break; } z = z ^ 2 + current; } $value = deg(z) * (255 / 360.0); set_color($value, $value, $value); } }Above /* some region */ is a placeholder for an actual region but we can see how we go about testing to see if a point is within a region and now we'll look at the different types of regions that are available.
There are 6 types of regions and 4 ways to combine regions. First, we'll look at the region types.
Region | Explanation |
---|---|
r_circle(center, $radius) |
This region describes a circle centered at 'center' with radius '$radius' |
r_cross(p1, p2, $barWidth, $barHeight) |
This region describes a rectangular area (p1 and p2 are the corners). The cross is incribed within the rectangular region and the thickness of the horizontal bar is '$barHeight' the thickness of the vertical bar is '$barWidth' |
r_ellipse(center, $xradius, $yradius) |
This region describes an ellipse whose center is 'center'. The width of the ellipse is governed by '$xradius' its height by '$yradius' |
r_poly(p1, p2, ..., pN) |
This region is a polygon defined by the points p1, p2, ..., pN. There must be at least 3 points but there is limit on the maximum number of points |
r_spoly(center, $nSides, $radius, $angle) |
This region describes an '$nSides'-sided polygon whose center is 'center'. The value '$radius' indicates the distance from the center to any of the polygon's '$nSides' points. The '$angle' value rotates the polygon around its center, if this value is zero one point of the polygon will be at 0 degrees (3 o'clock). |
r_rect(p1, p2) |
This region describes a rectangle whose opposite corners are the points 'p1' and 'p2' |
Now let's look at some images of what these regions actually look like. For this discussion we'll assume the following:
r_circle([.5, 5.], .4) |
r_circle([.4, 4.], .2) |
||
r_cross([.2, .2], [.8, .8], .2, .4) |
r_cross([.1, .1], [.9, .9], .3, .1) |
||
r_ellipse([.5, .5], .4, .2) |
r_ellipse([.5, .5], .2, .4) |
||
r_poly([.2, 0], [.3, .3], [.2, .3], [.3, .6], [.2, .6], [.4, 1], [.3, .7],[.4, .7], [.3, .4],[.4, .4], [.2, 0]) |
r_poly([.1, .1], [.2, .8], [.9, .3]) |
||
r_spoly([.5, .5], 5, .4, 0) |
r_spoly([.5, .5], 6, .4, 20) |
||
r_rect([.1, .1], [.7, .8]) |
r_rect([.3, .4], [.9, .1]) |
Now lets look at the mechanisms for combining regions
r_and(region1, region2) | Specifies the area that is in both region1 and region2 |
r_or(region1, region2) | Specifies the area that is in either region1 or region2 |
r_xor(region1, region2) | Specifies the area that is in either region1 or region2 but not both |
r_not(region) | Specifies the area that is not in region |
For these examples, we'll be using the following regions/images:
region1: r_circle([.3, 5.], .25) |
region2: r_circle([.6, 5.], .25) |
Here are images showing the different mechanisms for combining regions
r_and(region1, region2) |
r_or(region1, region2) |
||
r_xor(region1, region2) |
r_not(region1) |
Finally, it is worth noting that the combining mechanisms (r_and, r_or, r_xor, r_not) are regions themselves so they can also be combined. Here are some examples:
r_not(r_xor(region1, region2)) |
r_not(r_or(region1, region2)) |
And here is a complete formula file that uses regions and the image it produces
fractal { mapping { (-2.00000000000000000000, -2.00000000000000000000, 2.00000000000000000000, 2.00000000000000000000) => (200, 200) } formula { z = [0, 0]; p = [1, 0]; $n = 3; $r = 2.0; $a = 0.0; while($count < 20 && ssq(z) < 4) { z = z ^ 2 + current; z1 = asech(z); z2 = conj(z1); if( inside(z1, r_spoly(p, $n, $r, $a)) || inside(z2, r_spoly(p, $n, $r, $a)) ) { break; } } $r = $g = $b = 0; $value = deg(z) / 360.0 * 2.0 * $m_pi; $r = 127.5 + 127.5 * sin(1.0 * $value); $g = 127.5 + 127.5 * sin(1.2 * $value); $b = 127.5 + 127.5 * sin(1.4 * $value); set_color($r, $g, $b); } }