Welcome to Fractal Forums

Fractal Math, Chaos Theory & Research => (new) Theories & Research => Topic started by: knighty on September 07, 2011, 09:30:45 PM




Title: The power of fold
Post by: knighty on September 07, 2011, 09:30:45 PM
Well... this is not a new theory but rather a trick to render spherical, euclidean and hyperbolic tesselations using folding operation. While I was playing with "kleinian drops" boxplorer shader I was surprised to see some hyperbolic tesselations like patterns. After some investigations I wrote this little scripts for evaldraw (link) (http://implicit.googlecode.com/files/triangle-groups.kc) and fragmentarium (link) (http://implicit.googlecode.com/files/poincare-disc30-circle_limit_6.zip).
For now, I'm wondering if it is possible to get the so called "wallpaper groups" using this technique.


Title: Re: The power of fold
Post by: subblue on September 07, 2011, 11:21:13 PM
Nicely done. Funny that - I've also recently been playing around with hyperbolic mappings after seeing Jos Leys Ringworld article :)


Title: Re: The power of fold
Post by: s31415 on September 08, 2011, 01:36:20 AM
Hi,

I did implement the wallpaper groups in UltraFractal in a related way. The algorithm takes a shape, for instance a continuous circular gradient centered at the origin, and creates rotated and shifted copies so that the whole pattern admits any given wallpaper group as a symmetry group. Check the following UF parameter file.

Best wishes,

Sam

Fractal1 {
::vsegkin2dqVyutRSS07Gw/DC8eJn7L9AepPM9pZgBsxMHbUNZJZCzNQS12+vfeJJzXE0WuHp
  GwHkjsyIjM2evIle4w4iTjr/l3+m7u70qTrnmP7feRkd2dfZ1yTfaexYu7TTre8TnO/jrH/2
  0hjzttds4w0yVnOOf2HG380067+X72ud10h/R5dO/7cGrd2bfz5v/s+XMu/0qdbnP7XHX85H
  Ps7ptLnd3u9jLWd6bztQ1bmO840mdLnmv7PnOgN+23sZc/+Vbf8y+n2ea6wcz7wXO+42mJ8w
  uDbea945l3M+1Vt1ba6hVrn2OuB3mPcac7yxDLv/pH2M7OohDfb+s3v6rTrhtta7xVLnuc5P
  Mu94DY7b3td6tvZ3Tn+xlWva704BlyPOu5+nWsm69jHG3/fWN9lZttt/3b/3P8px99vc9f8L
  f8D/+/dc969Q4hfDug9Hnp/w7/zf/xptTHWtodN+OtgFhps/4ZNaN2vbt3/bfvqfOd0877nv
  P84NShTf/Yz1afGx2527/B9glG3+IyXqm7N3syypF739l5ufcPf8A+h5zWsbzmdbv4O6r9rr
  3t4zze2NcrP5ZX/G3yPTJ8j+j2Z9z/yHO/lXC6I96Hs3P2XZ2La//1h0f2Wkj/VspnOOd4v1
  Gv9C/i34+z//eZ59en3kzvzcvN1+hXvO2gy+joA81szlHW9wpWPhXzmOuYEZu2XzWOs7045u
  Xm/O764pp9vude8zTf51vjX/5Mec/0iT/1+iLlWPbd773ta7pZ/f38LvI44z1p7Vth9NT6ll
  Ej0W9t6f/061f86CzeJ7+1WbfeH8of5bZLMsb32jHGXuCFNnBoOuZ3OAUvd3dMLdIlvb12lT
  fdu5uF7Wv7w8UtksxyVpurSzWbGltNtcZB/1FKxkLZrXlGvKtaqGXweVauLNHSWbRUS56CWj
  3XcR3VxWDlXSev13lfhMxllshYIY7Wv1T55izLqKQ5lQB7ROcbStFv11tWbmnetG8FTXeVf6
  mYJ56Xbs3+WM5QMl6y7uvaJnzXyPvuSQtDf0zdQPYN4q8sdZ5srJQvK3tWX3HWjhiz1v3+uL
  s6KBH1j3J6pUgRxbtnBU85Vqef3eywDFDdz0nE9kseE+i9V62Ts6tVPP4aXc2HKme6VQFRTe
  kxY7bI4peqxUs7pDd/WMkNmCFrsnIylypujI0jmRnJX5FI0tngzZih+XHNie8BgOl63rYPU6
  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
  o/3Xgr90t/PAA30zuC==
}


Title: Re: The power of fold
Post by: knighty on September 08, 2011, 09:30:52 PM
Subblue: Scary! in fact no but sometime I feel like people here read each other minds :alien:. Have you seen this picture by trafassel (http://www.fractalforums.com/index.php?action=gallery;sa=view;id=8417).

s31415: Wow! great work. Thank you very much. I'll try to study it.


Title: Re: The power of fold
Post by: subblue on September 08, 2011, 11:36:51 PM
Subblue: Scary! in fact no but sometime I feel like people here read each other minds :alien:. Have you seen this picture by trafassel (http://www.fractalforums.com/index.php?action=gallery;sa=view;id=8417).
Indeed! Cool picture


Title: Re: The power of fold
Post by: subblue on September 10, 2011, 10:49:46 PM
This is a very interesting presentation with lots of nice hyperbolic kaleidoscopes:
http://bulatov.org/math/1107/


Title: Re: The power of fold
Post by: s31415 on September 10, 2011, 11:20:42 PM
Thanks for the link! These non-periodic Euclidean tilings near the end are amazing. I have to implement this...

Sam


Title: Re: The power of fold
Post by: knighty on September 10, 2011, 11:34:40 PM
Tremendous work! It deserves a place in the "site of the month" thread :)
Humm... it should be doable with circular (spherical) foldings.

I have cited bulatov's site in the evaldraw script attached to the OP but forgotten to do so in the fragmentarium one :/.

I'm curious about his rendering technique. Maybe he is using foldings or a the technique described in this (awesome) paper (http://www.combinatorics.org/Volume_16/PDF/v16i2r12.pdf).(also forgotten to cite this one...)



Title: Re: The power of fold
Post by: knighty on September 12, 2011, 10:37:50 PM
Humm... it should be doable with circular (spherical) foldings.
Here is an evaldraw script:
Code:
static mi=10;//max iteration
static l=4;//
static ratio=0.5;
static angle=0.0;
static xc,rx,yc,ry;
(x,y){
   static frm=-1;
   if(frm<numframes){
      frm=numframes;
      k=0;
      if(keystatus[0xc8]){//up
         ratio+=0.001;k=1;
         ratio=min(ratio,1);
      }
      if(keystatus[0xd0]){//dn
         ratio-=0.001;k=1;
         ratio=max(0,ratio);
      }
      if(keystatus[0xcd]){//right
         keystatus[0xcd]=0;
         l+=1;k=1;
      }
      if(keystatus[0xcb]){//left
         keystatus[0xcb]=0;
         if(l>3) l-=1;k=1;
      }
      if(keystatus[0xc9]){//pgup
         angle+=0.001;k=1;
         angle=min(angle,1);
      }
      if(keystatus[0xd1]){//pgdn
         angle-=0.001;k=1;
         angle=max(angle,0);
      }
      if(keystatus[0x4e]){//numpad +
         keystatus[0x4e]=0;
         mi+=1;
      }
      if(keystatus[0x4a]){//numpad -
         keystatus[0x4a]=0;
         if(mi>0) mi-=1;
      }
      if(frm==0 || k) init(l,tan(0.5*pi*ratio),0.5*pi*angle);
   }
  
      //if(x*x+y*y>1) return 0;
      k=bulatov(x,y);
}
checker(rf0,rf1,rf2,rf3){
   //return (1*rf0+1*rf1+1*rf2+1*rf3)/1/mi;//for example
   //if((rf0+rf1+rf2+rf3)==0) return 10;//in order to show the fundamental domain
   0.1+0.4*((1*rf0+1*rf1+1*rf2+1*rf3)%2)
   //(((1*rf0+1*rf1+1*rf2+1*rf3)%2)*0.5-0.5)*(1*rf0+1*rf1+1*rf2+1*rf3)/mi+0.5
}
inside(x,y){
   x=abs(x);y=abs(y);
   v=(1-x/xc-y/yc>0);
   x-=xc;
   r2=x*x+y*y;
   if(rx>0) k=max(rx*rx/r2,1); else k=min(rx*rx/r2,1);
   v=v&&(k==1);
   x+=xc;
   y-=yc;
   r2=x*x+y*y;
   k=max(ry*ry/r2,1);
   v=v&&(k==1);
   y+=yc;
   v
}
bulatov(&x,&y){
   ax=x+1;ay=y+1;
   rf0=0;rf1=0;rf2=0;rf3=0;arf=1;i=0;
   for(i=0;i<mi && arf!=(rf0+rf1+rf2+rf3);i++){//if current iterate is inside the fundamental triagle we are done
      arf=(rf0+rf1+rf2+rf3);
      ax=x;ay=y;
      //1st fold
      x=abs(x);rf0+=x!=ax;
      //2nd fold
      y=abs(y);rf1+=y!=ay;
      //3rd fold
      x-=xc;
      r2=x*x+y*y;
      if(rx>0) k=max(rx*rx/r2,1); else k=min(rx*rx/r2,1);
      rf2+=k!=1;
      x*=k;y*=k;
      x+=xc;
      //4th fold
      y-=yc;
      r2=x*x+y*y;
      k=max(ry*ry/r2,1);rf3+=k!=1;
      x*=k;y*=k;
      y+=yc;
   }
   (inside(x,y))*checker(rf0,rf1,rf2,rf3)
}
init(l,k,angle){
   c=cos(pi/l);
   rx=1/sqrt(k*c);
   ry=sqrt(k/c);
   xc=sqrt(1+rx*rx);
   yc=sqrt(1+ry*ry);
   s=sin(angle);c=cos(angle);
   xc1=c*xc*(1-s*xc)/((xc-s)^2-(rx*c)^2);
   rx=(rx*(1-s*xc)/((xc-s)^2-(rx*c)^2));
   xc=xc1;
}
controls:
-{up} & {down} arrows.
-{left} & {right} arrows
-{page up} and {page down}
- numeric pad {+} & {-}
- {F7} & {shift]+{F7}