Logo by tomot - Contribute your own Logo!

END OF AN ERA, FRACTALFORUMS.COM IS CONTINUED ON FRACTALFORUMS.ORG

it was a great time but no longer maintainable by c.Kleinhuis contact him for any data retrieval,
thanks and see you perhaps in 10 years again

this forum will stay online for reference
News: Visit the official fractalforums.com Youtube Channel
 
*
Welcome, Guest. Please login or register. April 19, 2024, 09:57:36 PM


Login with username, password and session length


The All New FractalForums is now in Public Beta Testing! Visit FractalForums.org and check it out!


Pages: 1 ... 6 7 [8] 9 10   Go Down
  Print  
Share this topic on DiggShare this topic on FacebookShare this topic on GoogleShare this topic on RedditShare this topic on StumbleUponShare this topic on Twitter
Author Topic: Kaleidoscopic (escape time) IFS  (Read 117768 times)
Description: An interresing class of fractals
0 Members and 2 Guests are viewing this topic.
kram1032
Fractal Senior
******
Posts: 1863


« Reply #105 on: May 20, 2010, 12:00:44 PM »

Softology: I love how this one turns inside out and is nearly 2D in between cheesy
Logged
Syntopia
Fractal Molossus
**
Posts: 681



syntopiadk
WWW
« Reply #106 on: May 20, 2010, 02:50:39 PM »

Knighty, the number of reflections depend on the chosen symmetry planes and the order they are applied in. Using the set given by Jos Leys I had to repeat five times, for a total of 15 reflections, before scaling.

I've optimized it a bit by including the x,y,z planes for the following 6 reflections:

Code:
 		
int n = 0;
while (n < maxIterations) {
   p.y = abs(p.y);
   p.z = abs(p.z);
   if (dot(p, n2)>0.0) { p *= n2Mat; }
   p.x = abs(p.x);
   p.z = abs(p.z);
   if (dot(p, n1)>0.0) { p *= n1Mat; }       
   p = p*scale - offset*(scale-1.0);
   if (dot(p,p)> bailoutSquared) break;
   n++;
}
return (length(p) ) * pow(scale, -float(n));
      

And I think better solutions exist. Jos, when you said the icosa needed five folds, did you mean 5*3 reflections or just 5 reflections in total?

And Softology, you asked for code. I think you can use the DE above together with these definitions:

Code:
phi = 1.61803399; // golden ratio.
scale = 2.0;
offset = normalize(float3(1.0,phi-1.0,0.0));
n1 = normalize(float3(-phi,phi-1.0,1.0));
n2 = normalize(float3(1.0,-phi,phi+1.0));
n1Mat = reflectionMatrix(n1);
n2Mat = reflectionMatrix(n2);
     
// Return reflection matrix for plane with normal 'n'
float3x3 reflectionMatrix(float3 n)
{
return float3x3( 1.0 - 2.0*n.x*n.x,     - 2.0*n.y*n.x ,     - 2.0*n.z*n.x,
      - 2.0*n.x*n.y, 1.0 - 2.0*n.y*n.y ,     - 2.0*n.z*n.y,
      - 2.0*n.x*n.z,     - 2.0*n.y*n.z , 1.0 - 2.0*n.z*n.z );
}
Logged
knighty
Fractal Iambus
***
Posts: 819


« Reply #107 on: May 20, 2010, 09:55:30 PM »

Knighty, the number of reflections depend on the chosen symmetry planes and the order they are applied in. Using the set given by Jos Leys I had to repeat five times, for a total of 15 reflections, before scaling.
Yes it depends on the symmetry set choosen. If I'm not mistaken, 15 is the total number of symmetry planes of the dodeca and icosa. If you want only the icosa, 5 folds are sufficient. Same thing with the dodeca. The set that gives dodeca that way, is not the same for icosa. I've already found a "full" folding planes set for dodeca, icosa and the semi regular polyhedra that are in between. The number of folds was 9 but I think that it is possible with 8 folds.

I've optimized it a bit by including the x,y,z planes for the following 6 reflections:

Code:
 		
int n = 0;
while (n < maxIterations) {
   p.y = abs(p.y);
   p.z = abs(p.z);
   if (dot(p, n2)>0.0) { p *= n2Mat; }
   p.x = abs(p.x);
   p.z = abs(p.z);
   if (dot(p, n1)>0.0) { p *= n1Mat; }       
   p = p*scale - offset*(scale-1.0);
   if (dot(p,p)> bailoutSquared) break;
   n++;
}
return (length(p) ) * pow(scale, -float(n));
      
Whi do you use a symmetry matrix? Why not:
Code:
      float t=dot(p,n);
      if (t>0.0) p-=2.0*t*n;
Which gives the same result and is, in principle, faster. smiley

B.T.W, You are getting very nice results.

Can anyone assist with the icos and dodec folding code?  I cannot follow the snippets so far.
Jason.
Here is another variant that gives the "full" symmetry:
Code:
#define PHI (0.5*(1+sqrt(5))) // Phi is the golden ratio

The three points that are the vertices of a fundamental triangle.
static ftris[3]={PHI,1,0};// vertex
static ftria[3]={PHI,0,0};// middle of edge
static ftric[3]={1/3*(1+2*PHI),0,PHI/3};//center of an icosa triangle.

#define IN3 (1/sqrt(14+6*sqrt(5))) //This is the normalisation factor of the following vector
static n3[3]={IN3*PHI,-IN3*(PHI^2),-IN3*(2*PHI+1)};//this is the normal of one of the folding planes.
// The 2 others planes' normals are: {0,1,0} and {0,0,1}

//
fractal(x,y,z,scale,rot[3][3]){
   r=x*x+y*y+z*z;
   for(i=0;i<MI && r<bailout;i++){
// PRE_ROTATE
      x1=rot[0][0]*x+rot[1][0]*y+rot[2][0]*z;
      y1=rot[0][1]*x+rot[1][1]*y+rot[2][1]*z;
      z1=rot[0][2]*x+rot[1][2]*y+rot[2][2]*z;
      x=x1;y=y1;z=z1;

// Foldings. 10 in total but 7 of them are abs() ;o)
      x=abs(x);
      y=abs(y);
      z=abs(z);
      t=x*n3[0]+y*n3[1]+z*n3[2];
      if(t<0){x-=2*t*n3[0];y-=2*t*n3[1];z-=2*t*n3[2];}
      y=abs(y);
      z=abs(z);
      t=x*n3[0]+y*n3[1]+z*n3[2];
      if(t<0){x-=2*t*n3[0];y-=2*t*n3[1];z-=2*t*n3[2];}
      y=abs(y);
      z=abs(z);
      t=x*n3[0]+y*n3[1]+z*n3[2];
      if(t<0){x-=2*t*n3[0];y-=2*t*n3[1];z-=2*t*n3[2];}
     
// Stretching:
// for an icosahedron: stc[]=ftris[];
// for a dodecahedron: stc[]=ftric[];
// In general you can choose: stc[]=a*ftris[]+b*ftria[]+c*ftric[]; where: a+b+c=1;
      x=scale*x-stc[0]*(scale-1);
      y=scale*y-stc[1]*(scale-1);
      z=scale*z-stc[2]*(scale-1);
     
      r=x*x+y*y+z*z;
   }
   return (sqrt(x*x+y*y+z*z)-2)*(scale)^(-i);
}

Note the:
    if (t<0)...
Syntopia and Jos Leys are doing:
    if (t>0)...
This is because of the direction of the planes we are using! Perhaps that's why you were confused. (I was at some point smiley)
Logged
Syntopia
Fractal Molossus
**
Posts: 681



syntopiadk
WWW
« Reply #108 on: May 20, 2010, 11:08:10 PM »

Yes it depends on the symmetry set choosen. If I'm not mistaken, 15 is the total number of symmetry planes of the dodeca and icosa. If you want only the icosa, 5 folds are sufficient. Same thing with the dodeca. The set that gives dodeca that way, is not the same for icosa. I've already found a "full" folding planes set for dodeca, icosa and the semi regular polyhedra that are in between. The number of folds was 9 but I think that it is possible with 8 folds.

I guess I'm a bit confused about what exactly count as a 'fold'. Do you mean you need only apply 5 conditional reflections before the scaling? Because I've only found (different) solutions with 6 conditional reflections for the icosa and dodeca.

Whi do you use a symmetry matrix? Why not:
Code:
      float t=dot(p,n);
      if (t>0.0) p-=2.0*t*n;
Which gives the same result and is, in principle, faster. smiley

Well, both for readability, and because I assumed that matrix multiplications would be faster on the GPU. I just tested it, and I was wrong though: I get 22.8 fps (matrix) versus 23.4 fps (vector).  smiley

Best, Mikael.
Logged
knighty
Fractal Iambus
***
Posts: 819


« Reply #109 on: May 20, 2010, 11:27:33 PM »

Yes it depends on the symmetry set choosen. If I'm not mistaken, 15 is the total number of symmetry planes of the dodeca and icosa. If you want only the icosa, 5 folds are sufficient. Same thing with the dodeca. The set that gives dodeca that way, is not the same for icosa. I've already found a "full" folding planes set for dodeca, icosa and the semi regular polyhedra that are in between. The number of folds was 9 but I think that it is possible with 8 folds.

I guess I'm a bit confused about what exactly count as a 'fold'. Do you mean you need only apply 5 conditional reflections before the scaling? Because I've only found (different) solutions with 6 conditional reflections for the icosa and dodeca.

Yes, by "fold", I mean "conditional reflexion".
Sorry! that was 6 for me too. According to Jos Leys 5 are sufficient if I undestood well.
Logged
Softology
Conqueror
*******
Posts: 120


« Reply #110 on: May 21, 2010, 02:15:10 AM »

Thanks for the code snippets guys.  That cleared everything up and I now have icosahedral and dodecahedral folding working.

Jason

Logged
kram1032
Fractal Senior
******
Posts: 1863


« Reply #111 on: May 21, 2010, 11:58:24 AM »

also a really nice one cheesy

I wonder what happens with aribitary symmetry planes... Maybe something along the lines of a starfish or even a more complex biological lifeform could be recreated?
We already have a lot of (gorgeous) sponges. smiley
Logged
knighty
Fractal Iambus
***
Posts: 819


« Reply #112 on: May 21, 2010, 07:37:47 PM »

Yes it depends on the symmetry set choosen. If I'm not mistaken, 15 is the total number of symmetry planes of the dodeca and icosa. If you want only the icosa, 5 folds are sufficient. Same thing with the dodeca. The set that gives dodeca that way, is not the same for icosa. I've already found a "full" folding planes set for dodeca, icosa and the semi regular polyhedra that are in between. The number of folds was 9 but I think that it is possible with 8 folds.

I guess I'm a bit confused about what exactly count as a 'fold'. Do you mean you need only apply 5 conditional reflections before the scaling? Because I've only found (different) solutions with 6 conditional reflections for the icosa and dodeca.
Yes, by "fold", I mean "conditional reflexion".
Sorry! that was 6 for me too. According to Jos Leys 5 are sufficient if I undestood well.

So far, Ive found a minimum of 5 folds for icosa and 6 folds for dodeca and 8 for full dodeca-icosa symmetry set. More infos after. smiley

also a really nice one cheesy

I wonder what happens with aribitary symmetry planes... Maybe something along the lines of a starfish or even a more complex biological lifeform could be recreated?
We already have a lot of (gorgeous) sponges. smiley

There are already some rederings by Buddhi in this thread and this woderful gallery by Syntopia. dancing banana

Thanks for the code snippets guys.  That cleared everything up and I now have icosahedral and dodecahedral folding working.

Jason

<Quoted Image Removed>

You'r welcome!  smiley
Logged
kram1032
Fractal Senior
******
Posts: 1863


« Reply #113 on: May 22, 2010, 12:01:41 AM »

Wow!
Thanks for sharing smiley
I especially like #4 and #6 cheesy
#6 isn't actually that far away from a starfish, I guess smiley
Logged
Syntopia
Fractal Molossus
**
Posts: 681



syntopiadk
WWW
« Reply #114 on: May 22, 2010, 12:20:42 AM »

Thanks, Kram and Knighty - actually I made the images after reading your suggestion to tweak the planes.

And #6 was an attempt to model a starfish. Guess I did not fail completely :-)

So far, Ive found a minimum of 5 folds for icosa and 6 folds for dodeca and 8 for full dodeca-icosa symmetry set. More infos after. smiley

Oh no, that means I've been sloppy.

There is really a lot of possibilities and parameters to explore here. And so many possible extensions: alternating sets of symmetries, stochastic conditionals, non-linear scaling and folds, softening the folds, ...
Logged
Tglad
Fractal Molossus
**
Posts: 703


WWW
« Reply #115 on: May 22, 2010, 01:44:09 AM »

#4 is almost exactly the shape of hyperbolic space.

I wonder how many of these can be made with a single fold per iteration, after-all up to 3 folds can probably be made a repeated single fold and rotation.
That would give a very simple definition for such fractals-
They are the many valued vector
 v = o + q*abs(v)      for some quaternion q, offset o, and where abs just operates on the real axis if we imagine the vector as (r,i,j)
Logged
knighty
Fractal Iambus
***
Posts: 819


« Reply #116 on: May 22, 2010, 05:36:36 PM »

So far, Ive found a minimum of 5 folds for icosa and 6 folds for dodeca and 8 for full dodeca-icosa symmetry set. More infos after. smiley

Oh no, that means I've been sloppy.
You weren't but I was. wink

Here are the 8 folding planes that fold the icosa to the fundamental triangle ( phi , 1 , 0 ) ; ( phi , 0 , 0 ) ; ( ( 2 * phi + 1 ) / 3 , 0 , phi / 3 ):
( 1 , 0 , 0 )
( 0 , 1 , 0 )
( 0 , 0 , 1 )
0.5 * ( phi , 1 - phi , -1 )
( phi , phi^2 , -( 1 + 2 * phi )) * 1 / sqrt( 14 + 6 * sqrt( 5 ))
0.5 * ( 1 , -phi , phi - 1 )
( phi , -phi^2 , -1 ) * 1 / sqrt( 6 + 2 * sqrt(5))
( phi , -phi^2, -( 1 + 2 * phi)) * 1 / sqrt( 14 + 6 * sqrt(5))

The five first planes give an icosahedron when the center of stretching is (phi,1,0).

There is really a lot of possibilities and parameters to explore here. And so many possible extensions: alternating sets of symmetries, stochastic conditionals, non-linear scaling and folds, softening the folds, ...
May I add L-system and finite state machine...
Logged
knighty
Fractal Iambus
***
Posts: 819


« Reply #117 on: May 24, 2010, 03:50:40 PM »

#4 is almost exactly the shape of hyperbolic space.

I wonder how many of these can be made with a single fold per iteration, after-all up to 3 folds can probably be made a repeated single fold and rotation.
That would give a very simple definition for such fractals-
They are the many valued vector
 v = o + q*abs(v)      for some quaternion q, offset o, and where abs just operates on the real axis if we imagine the vector as (r,i,j)
Wow! it took me a while to understand! crazy
I think it may be simplified further to:
v:= A * absx/y/z/xy/xz/yz/xyz(v);
Where A is an affine transformation and abs() acts on x,y,z,xy,xz,yz or xyz components.
'A' may be constructed this way:
A=R1*S*T*R2;
R: rotation matrix;
S: Homotety matrix;
T: Translation matrix;
Logged
subblue
Conqueror
*******
Posts: 116



WWW
« Reply #118 on: May 24, 2010, 10:23:02 PM »

Wow! it took me a while to understand! crazy
I think it may be simplified further to:
v:= A * absx/y/z/xy/xz/yz/xyz(v);
Where A is an affine transformation and abs() acts on x,y,z,xy,xz,yz or xyz components.
'A' may be constructed this way:
A=R1*S*T*R2;
R: rotation matrix;
S: Homotety matrix;
T: Translation matrix;
I can't say I understand this yet. Have you managed to code an implementation of this?
Logged

www.subblue.com - a blog exploring mathematical and generative graphics
Softology
Conqueror
*******
Posts: 120


« Reply #119 on: May 24, 2010, 11:28:13 PM »

Wow! it took me a while to understand! crazy
I think it may be simplified further to:
v:= A * absx/y/z/xy/xz/yz/xyz(v);
Where A is an affine transformation and abs() acts on x,y,z,xy,xz,yz or xyz components.
'A' may be constructed this way:
A=R1*S*T*R2;
R: rotation matrix;
S: Homotety matrix;
T: Translation matrix;
I can't say I understand this yet. Have you managed to code an implementation of this?

I would be interested in a snippet of code that covers this too if you work it out.  Looks like a great way to open up even more space for finding new fractals within.

Jason.
Logged
Pages: 1 ... 6 7 [8] 9 10   Go Down
  Print  
 
Jump to:  


Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines

Valid XHTML 1.0! Valid CSS! Dilber MC Theme by HarzeM
Page created in 0.2 seconds with 28 queries. (Pretty URLs adds 0.012s, 2q)