Welcome to Fractal Forums

Fractal Software => 3D Fractal Generation => Topic started by: twinbee on January 22, 2010, 07:16:36 PM




Title: Quasi-Fuchsian fractal goodness
Post by: twinbee on January 22, 2010, 07:16:36 PM
I still love the look of this 3D fractal type. Despite its IFS nature, in many ways it's much closer the the 'true' 3D Mandelbrot, than the Mandelbulb is.

However, nobody apart from the original creators has ever rendered it, or even spoke much about it. There is information out there to create this object, but it's pretty scarce and opaque (well for me anyway ;) ).

It is of course the 'Quasi-Fuchsian' fractal by Dr. Kazushi Ahara and Dr. Yoshiaki Araki. Here is their gallery: http://www.math.meiji.ac.jp/~ahara/quasisphere/Gallery.html

... and here is a video:
http://www.youtube.com/watch?v=3lcO9zRCv-4

Anybody had a crack at recreating this?


Title: Re: Quasi-Fuchsian fractal goodness
Post by: JosLeys on January 22, 2010, 08:09:14 PM
The technique consists of repeatedly mirroring the space enclosed between a set of spheres in all the spheres that make up the set. The 'mirroring' is mirroring in a sphere, so in other words, a sphere inversion. Sphere inversions preserve spheres, so that the tiniest detail of the objects in the film are still pieces of spheres.
Due to this, to me this is not anywhere near the 'Holy Grail', although it generates very interesting pictures.

The trick to making this work is to start with the right set of spheres, which is not trivial. It is a lot like finding the right parameters for 'Kleinian Groups' as explained in 'Indra's Pearls', and this is only 2D.
 I can find no publicly available articles where the principles of the right constellation of spheres is explained. I guess we need a new, 3D version, of Indra's Pearls to start playing with this..


Title: Re: Quasi-Fuchsian fractal goodness
Post by: kram1032 on January 22, 2010, 08:36:36 PM
what would happen if you took the total spherical inverse of this? Just a huge set of nearly-spacefilling spheres with some gaps in the center?


Title: Re: Quasi-Fuchsian fractal goodness
Post by: JosLeys on January 22, 2010, 10:08:12 PM
The spheres that form the basic buiding block will necessarily overlap, so no sphere packing I'm afraid...


Title: Re: Quasi-Fuchsian fractal goodness
Post by: kram1032 on January 23, 2010, 02:17:33 PM
That's not what I meant.

Those Quasi-fuchsian fractals have gaps in them where no spheres show up.
So, if you take the inverse, those gaps would still be somewhere...


Title: Re: Quasi-Fuchsian fractal goodness
Post by: twinbee on January 23, 2010, 07:14:24 PM
They make it sound easy here:
http://www.math.meiji.ac.jp/~ahara/quasisphere/index.html

I wonder what a 2D equivalent of this set would look like.


Title: Re: Quasi-Fuchsian fractal goodness
Post by: Aexion on January 24, 2010, 02:44:05 AM
I still love the look of this 3D fractal type. Despite its IFS nature, in many ways it's much closer the the 'true' 3D Mandelbrot, than the Mandelbulb is.

However, nobody apart from the original creators has ever rendered it, or even spoke much about it. There is information out there to create this object, but it's pretty scarce and opaque (well for me anyway ;) ).

It is of course the 'Quasi-Fuchsian' fractal by Dr. Kazushi Ahara and Dr. Yoshiaki Araki. Here is their gallery: http://www.math.meiji.ac.jp/~ahara/quasisphere/Gallery.html

... and here is a video:
http://www.youtube.com/watch?v=3lcO9zRCv-4

Anybody had a crack at recreating this?



Oh..That thing... ;D
After some intense search over the net, related how that was done, I think that I got some clues from this webpage (created by Kentaro Ito):
http://www.math.nagoya-u.ac.jp/~itoken/index.html (http://www.math.nagoya-u.ac.jp/~itoken/index.html)

You can start by downloading the following paper (pdf), that appears on the page:
# (with Y. Araki) An extension of the Maskit slice for 4-dimensional Kleinian groups,
Conform. Geom. Dyn. 12 (2008), 199-226.


Take a look at the gallery:
http://www.math.nagoya-u.ac.jp/~itoken/3d-maskit.html (http://www.math.nagoya-u.ac.jp/~itoken/3d-maskit.html)

With the parameters from the article, go to this applet and play with them (some very interesting kleinians will appear):
http://www.math.nagoya-u.ac.jp/~itoken/java/masinv3.htm (http://www.math.nagoya-u.ac.jp/~itoken/java/masinv3.htm)

Replace the points with spheres and you will probably get that fractal.
I have tested some and I think that I have hit very near.
Also at the end of the article there are several 3d kleinians that looks like that fractal.

Oh well, if you want to see it in the fast way, iterate the following code:
Select the transformation (tr) randomly or in a structured fashion and (get the parameters from the article):

const   float p=0;
const   float q=1.9;
const   float r=0.04;
const   float l=2;

switch(tr){
case 0:
   w=(x*x+y*y+z*z);
   X1=x/w+p;
        Y1=-y/w+q;
        Z1=z/w+r;
break;
case 1:
      w=((x-p)*(x-p)+(y-q)*(y-q)+(z-r)*(z-r));
      X1=(x-p)/w;
      Y1=(-y+q)/w;
      Z1=(z-r)/w;
       break;
case 2:
      X1=x-l;
      Y1=y;
      Z1=z;    
      break;
case 3:
      X1=x+l;
      Y1=y;
      Z1=z;
break;

}

x=X1;
y=Y1;
z=Z1;

Now, with the iteration values 3d point, map it to the spherical function:
double rr=sqrt(q*q+r*r);
double xn=X1;
double yn=Y1+2*r/rr;
double zn=Z1-2*q/rr;
Xp=4*rr*xn/(xn*xn+yn*yn+zn*zn);
Yp=4*rr*(yn/(xn*xn+yn*yn+zn*zn)-r/(4*rr));
Zp=4*rr*(zn/(xn*xn+yn*yn+zn*zn)+q/(4*rr));

and plot the point (Xp,Yp,Zp)..

That set of parameters will not produce something like that fractal, but it will produce something very very interesting.. :)





Title: Re: Quasi-Fuchsian fractal goodness
Post by: twinbee on January 27, 2010, 05:38:16 PM
Nice one, let's see some pics! :)

Also found these videos (first found by Paul Nylander a while back) which have the same style:

http://www.youtube.com/watch?v=yY1-D13KICw
http://www.youtube.com/watch?v=dkBNc2WqdrI


Title: Re: Quasi-Fuchsian fractal goodness
Post by: Aexion on January 29, 2010, 07:21:24 PM
Nice one, let's see some pics! :)

Also found these videos (first found by Paul Nylander a while back) which have the same style:



 :o

The first one is the real 3D Kleinian!!.. all of my kleinian renders just pale in front of that beauty!
I have tried several 3d kleinians using quaternionic mobius transformations, but have failed because thanks to the noncommutative quality of the quaternions, there are eight possibilites in every transformation..  ???
Heres a good link for those quaternionic mobius transformations if anyone is interested: https://faculty.digipen.edu/~jhanson/geometry/moebius/qmoebius_demo1.html

The second one looks like sphere inversion fractals, based on quaternionic mobius transformations too.. those are easier to render (and I think that i have one somewhere in my hdd), but is not the first one..

Just for a curiosity, anyone have tried a triplex mobius transformation..??

ps. How I upload an image to the forums.. 




Title: Re: Quasi-Fuchsian fractal goodness
Post by: xenodreambuie on February 01, 2010, 09:46:09 AM
Aexion, many thanks for posting the 3D Maskit links and code. I only understand half the math in the paper but it's a big help. Until I get Indra's Pearls I won't really know the difference between Kleinian, Fuchsian and Schottky groups.

I also did some experiments using only 2 generators: the case 0 sphere inversion and a rotation (180, 120, 90, etc), which makes some nice spirals, especially with a base shape.


Title: Re: Quasi-Fuchsian fractal goodness
Post by: KRAFTWERK on February 01, 2010, 10:50:49 AM
ps. How I upload an image to the forums.. 

You have to clic "Additional Options" to get a browse-button.

J


Title: Re: Quasi-Fuchsian fractal goodness
Post by: Aexion on February 04, 2010, 01:44:44 PM
ps. How I upload an image to the forums.. 

You have to clic "Additional Options" to get a browse-button.

J

thanks!!
The equations that I have posted, produce something like the the following image..
(If the overall shape reminds some other fractal, its just an intentional coincidence..  ;D )


Title: Re: Quasi-Fuchsian fractal goodness
Post by: KRAFTWERK on February 04, 2010, 02:21:58 PM
Hmmm reminds me of one in this very thread  O0
Beautiful!!!


Title: Re: Quasi-Fuchsian fractal goodness
Post by: kram1032 on February 04, 2010, 09:37:45 PM
wow, nice :D
Well done :)


Title: Re: Quasi-Fuchsian fractal goodness
Post by: Tglad on February 17, 2010, 12:46:11 AM
This website is a superb interactive description of the indra's pearls type fractals- http://www-m10.ma.tum.de/bin/view/MatheVital/IndrasPearls/WebHomeEn (http://www-m10.ma.tum.de/bin/view/MatheVital/IndrasPearls/WebHomeEn)
It shows you exactly how they work.

Its 2d, but since mobius transforms also all exist in 3d, it is clear that you could make 3d versions with the same method. Or 4d ones.

Some of the patterns look Mandelbrot-like, but they are of course not, since Z^2 is a different transformation altogether to the mobius transformations.


Title: Re: Quasi-Fuchsian fractal goodness
Post by: DarkBeam on February 28, 2011, 10:28:17 AM
Awasome Aexion!!!!!!!! I will try to transpose to MB3D formula one day for sure! If you know more variations please post :D :dink:


Title: Re: Quasi-Fuchsian fractal goodness
Post by: DarkBeam on March 01, 2011, 07:21:01 PM
I tried to translate the code to UF but it don't really works as expected. The limit is too unstable, and the generated spirals are too much deformed to look good :-\ Anyone knows?

Code:
tester00 {
; ----------------

init:
  z = #pixel
  float x = real(z)
  float y = imag(z)
  ;float x2 = x
  float zz = @zinit
  float rad = 0
  float rr = 0
  int i = @itercnt
loop:

  ; here is the main fmla
  ; -------------------
  while i>1
  x = x-@p
  y = y-@q
  zz = zz-@r
  rad=(x*x+y*y+zz*zz)
  x=x/rad
  y=-y/rad
  zz = (zz+@r)/rad
  i = i-1
  endwhile
  ; -------------------
  ;while i>1
  rr=sqrt(@q*@q+@r*@r)
  y=y+2*@r/rr
  zz=zz-2*@q/rr
  rad=(x*x+y*y+zz*zz)
  x=4*rr*x/rad
  y=4*rr*(y/rad)-@r
  zz=4*rr*(zz/rad)+@q
  ;i = i-1
  ;endwhile
  ; -------------------
  z = x + flip(y)
  ;ends here
bailout:
   false
   ;|z| > @bailout
default:
  title = "Test function"
  center = (0,0)
  float param p
    caption = "p"
    default = 0
  endparam
  float param q
    caption = "q"
    default = 1.9
  endparam
  float param r
    caption = "r"
    default = .04
  endparam
  float param zinit
    caption = "z init"
    default = 0
  endparam
  int param itercnt
    caption = "Iter count"
    default = 30
  endparam
  float param bailout
    caption = "Bailout"
    hint = "-disabled-"
    default = 1024
  endparam
}


Title: Re: Quasi-Fuchsian fractal goodness
Post by: Aexion on March 01, 2011, 10:08:00 PM
I tried to translate the code to UF but it don't really works as expected. The limit is too unstable, and the generated spirals are too much deformed to look good :-\ Anyone knows?

Code:
tester00 {
; ----------------

init:
  z = #pixel
  float x = real(z)
  float y = imag(z)
  ;float x2 = x
  float zz = @zinit
  float rad = 0
  float rr = 0
  int i = @itercnt
loop:

  ; here is the main fmla
  ; -------------------
  while i>1
  x = x-@p
  y = y-@q
  zz = zz-@r
  rad=(x*x+y*y+zz*zz)
  x=x/rad
  y=-y/rad
  zz = (zz+@r)/rad
  i = i-1
  endwhile
  ; -------------------
  ;while i>1
  rr=sqrt(@q*@q+@r*@r)
  y=y+2*@r/rr
  zz=zz-2*@q/rr
  rad=(x*x+y*y+zz*zz)
  x=4*rr*x/rad
  y=4*rr*(y/rad)-@r
  zz=4*rr*(zz/rad)+@q
  ;i = i-1
  ;endwhile
  ; -------------------
  z = x + flip(y)
  ;ends here
bailout:
   false
   ;|z| > @bailout
default:
  title = "Test function"
  center = (0,0)
  float param p
    caption = "p"
    default = 0
  endparam
  float param q
    caption = "q"
    default = 1.9
  endparam
  float param r
    caption = "r"
    default = .04
  endparam
  float param zinit
    caption = "z init"
    default = 0
  endparam
  int param itercnt
    caption = "Iter count"
    default = 30
  endparam
  float param bailout
    caption = "Bailout"
    hint = "-disabled-"
    default = 1024
  endparam
}

Hello

I tried your formula on UF, but got nothing (a blue image)..  :(
any hint about what im doing wrong?
I just pasted the formula on the editor and used it with the default parameters..


Title: Re: Quasi-Fuchsian fractal goodness
Post by: DarkBeam on March 01, 2011, 10:31:06 PM
Whoa thanks for the reply!
Well, I see something when I choose orbit traps or smooth as inside and outside colorings! :D


Title: Re: Quasi-Fuchsian fractal goodness
Post by: Aexion on March 01, 2011, 11:46:41 PM
Whoa thanks for the reply!
Well, I see something when I choose orbit traps or smooth as inside and outside colorings! :D

Blue all the way :(

Can you post an image?

BTW.. I have many 3D formulaes for escape time, but all coded in C, since they are a bit more complicated than the classic iteration schema.. if you can translate them I will post the most interesting ones.. :)


Title: Re: Quasi-Fuchsian fractal goodness
Post by: DarkBeam on March 02, 2011, 12:01:24 AM
What you are waiting for? You want to hide them out? ;)
Spread your amazing knowledge please, I will try to make it work. But it is not guaranteed because I'm not that expert :)


Title: Re: Quasi-Fuchsian fractal goodness
Post by: Aexion on March 02, 2011, 01:51:32 AM
What you are waiting for? You want to hide them out? ;)
Spread your amazing knowledge please, I will try to make it work. But it is not guaranteed because I'm not that expert :)

Amazing knowledge!?? me?.. no.. Im just an experimentalist.. :)

Here is some some code:
1. First define this Global Array (I know..globals are ugly):

Code:
float SAVEMANDELITER[130];

2. on your main function, fill it with this procedure:

Code:
SAVEMANDELITER[0]=0;
for (int tr=1;tr<129;tr++) SAVEMANDELITER[tr]=pow(SAVEMANDELITER[tr-1],0.85)+0.1475;


Now, for every point in the space, use the following function:

Code:
bool Newton(float x, float y, float z){
float a,b,c,d,e,f,d1,g1,e1,potential;
float w,X1,Y1,Z1,xiter,yiter,W1,radius,radius1,angle,angle1, inside;
char u_Counter;
potential=0;
if(z<=0)return (false);
W1=0;
a=x;
b=y;
inside=1000;
radius=0;
xiter=x;
yiter=y;
for(u_Counter=0;u_Counter<100;u_Counter++){
w=W1;
c=xiter;
d=yiter;
const float X2=xiter*xiter;
const float Y2=yiter*yiter;
const float X3=X2*xiter;
const float Y3=Y2*yiter;
const float X4=X2*X2;
const float Y4=Y2*Y2;
const float X5=X4 - 6 *X2 *Y2 + Y4 - 1;
const float Y5=4* X3 *yiter - 4.0*xiter *Y3;
const float X6=4 *( X3 - 3.0*xiter *Y2 );
const float Y6= 4 *( 3 *X2 *yiter - Y3 );
const float den = 1.0f / (X6*X6 + Y6*Y6);
X1 = xiter-(X5*X6 + Y5*Y6) * den;
Y1 = yiter-(Y5*X6 - X5*Y6) * den;
radius1=radius;
radius=sqrt(X1*X1+Y1*Y1);
if(radius<inside)inside=radius;
xiter=X1;
yiter=Y1;
W1=SAVEMANDELITER[u_Counter]; //W1=powf(W1,0.85)+0.1475; //if you cannot use arrays.. runs slower..
if (fabs(radius-radius1)<0.01) break;
}
X1=a;
Z1=b;
potential=radius1;
if (radius<10){potential=inside*5; }
if(W1<z)return(false);
if (radius<10)w=inside;
f=((z-w)/(W1-w))*5;
angle=10-radius1;
angle1=radius-radius1;
c=(c/10.0)*5;
d=(d/10.0)*5;
radius= 7 - (cos(c + 1.61803399*f) + cos(c - 1.61803399*f) + cos(f + 1.61803399*d) + cos(f - 1.61803399*d) + cos(d - 1.61803399*c) + cos(d + 1.61803399*c));

//if(potential<0)return false; else return true;

if (radius<4.8)return (true);
return(false);
}


It returns TRUE if you're in the fractal..and FALSE if you're not..(or it was reversed..long time without touching this formula)
you can also use the "potential" variable to define distance from the fractal surface, but the result is not very interesting..

Without much complexity, you can turn this formula into a Nova fractal..by just adding a C value..
If this is too complex, let me know and I will send something more simpler.. :)

Good Luck

ps. Completely this code is completely unoptimized..just to make things clear..


Title: Re: Quasi-Fuchsian fractal goodness
Post by: DarkBeam on March 02, 2011, 08:12:25 AM
 :-\ :-\ :-\

1) I can't use any additional global variable. Only x,y,z,w and Cx,Cy,,Cz,Cw
2) It is hard for me use arrays (even nonglobal ones)
You need it only for precalc pow? Okay I can call pow() instead, I have the opcode fast translated version. :D
3) MB formulas I can write have only a loop section. Moreover, they must return only 8. Instead I can make something like;

   if (radius<4.8) return 8;
        x = 1000, y=1000, z=1000, w=1000 ;forced bailout
   return 8;

This solution works fine I have already tried it. :dink:


Title: Re: Quasi-Fuchsian fractal goodness
Post by: DarkBeam on March 02, 2011, 08:21:36 AM
qfuchstester {
::y+tb/gn2lF1yOyNIQw7Wy/DIuHPNv8jExlcI/Ary5VEbsnWBDOYs2dyXfwP2RrUugaqqrqrG
  Gjm+kx91yCCJhJnVT/xJEjSeDHS311Sgc3iT3TaZLQcmH24qmtroPaHw0qm+zk1nsfTcjfjD
  MGts4otDb7NLJM410vb6/9UMs5HokwipHTP0MAKLmNLLof6s7dji6vAVcQW32I76uBVddQNP
  XCdkZzkXzq4dKlsuusYMEn3cmDxzm3xd1cFQGRn1bmzL0Mar2Gnpks1xHaayumbCAKZ51FNk
  P/T2Q5uBLvG1QF0mL+L6xU+CPXvbavPpFwe3/yguwWKndeWE6XxB75DY04XHzz3H82yicP/P
  lD9WT8Tp7lkxPYiDVb9unR8l5QId/Igh32XobwZ8eObebVGaKaGwsmjZseIS/wuSihk54RnR
  Q/g998W2HchouWpUiO+Fat8CmJECGXw3t5kiV3+BXdTTDrr5igrauIkimG1FqQKuQVssLXfv
  fOW+wzo8xnPXpKL+HgC7EzO=
}

A test render with my UF function. It looks promising but too much deformed! :-\

(http://img40.imagefra.me/i532/kriptokapi/cigk_e1a_u6bci.jpg) (http://i.imagefra.me/014i239v)


test2{
::hOWEZin2lF1yOyJMQw7Ix/glvHG/AjnJR+SOkfgV58qOghpVM2EjR7O5rPGD7oVKcBoququ6
  uHjQfCcftuiQSYyZN0fcAxpk3wh0dTXLjc3iT3Tm2rMiDeYjrG+ui+odATrG6PTWfy+N5FxF
  Bjzp1VlyK22DLJM4N0vD9/eKG28DUSYB6x0DDnxqrmhlF0PdU9uRRDrRrbvVeuKlqLsmOuQR
  mhJvR0oUS+NuquaMEn3cQR5M8OuLVoYkR0Z9wceamRbz24Mlk9N+wQT21cRMGls86SuN887/
  Y4NidLWeNa+yB2fRPmMs8X7m27TGpI/zvA0F2S5cLarrQ/KOYPWeRwvOmbvP4t1V5a+fKH6t
  Q8Th7lE4Hg4QzWv7ZCfZOES3L5L82+8chdktn9WctJDNFhBMrp0j1iIzD7KJGSQZhzJofw+e
  eI6DuQ00py7tbiT0u2TYuUK5CZZBcQx7u+BXnWr530nECl+koVq1qTUZr8EVxzucea/cs8hn
  R5jDvQlPf/j0NQMH
}

These params look more promising. Too bad the figure tends to be smaller & smaller, it almost disappears for numiter > 70 :sad1:



Title: Re: Quasi-Fuchsian fractal goodness
Post by: Aexion on March 02, 2011, 09:16:07 AM
:-\ :-\ :-\

1) I can't use any additional global variable. Only x,y,z,w and Cx,Cy,,Cz,Cw
2) It is hard for me use arrays (even nonglobal ones)
You need it only for precalc pow? Okay I can call pow() instead, I have the opcode fast translated version. :D
3) MB formulas I can write have only a loop section. Moreover, they must return only 8. Instead I can make something like;

   if (radius<4.8) return 8;
        x = 1000, y=1000, z=1000, w=1000 ;forced bailout
   return 8;

This solution works fine I have already tried it. :dink:

Oh.. :(
Perhaps something far more simpler is a good start (no globals, no arrays, no complex loops..just the simple old loop procedure):

Code:
bool Mandel3TriZ(double x, double y, double z){
//space coordinates transformations..
//Turns the 3D space in an infinite amount
//of 2D slices

const double w=1/(x*x+y*y+z*z);
const double dem=1-(z)*w;
const double ctx =((x)*w)/dem;
const double cty =((-y)*w)/dem;
double Xp=0,Yp=0;
double radius;

//put your favorite fractal iteration here
//A simple Mandelbrot is show..but you can
//try others..
for(unsigned char Counter=0;Counter<20;Counter++){
const double xs=Xp*Xp-Yp*Yp+ctx;
const double ys=2*Xp*Yp+cty;
Xp =xs;
Yp = ys;
radius=Xp*Xp+Yp*Yp;
if (radius>100) break;
const double w1=1/(xs*xs+ys*ys+z*z);
const double dem1=1-(z)*w;
Xp =((xs)*w1)/dem1;
Yp =((-ys)*w1)/dem1;

}
//false, the iteration took the blue pill
//true, the iteration took the red pill
if(radius<100)
return false;
else
return true;
}

Code:
//Based on the MandelBox..4D
bool CheeseBox(double x, double y, double z){

  const double ctx =(x   + y   + z);
  const double cty = (-x -y + z);
  const double ctz =(-x + y   -z);
  const double ctw = (x   -y -z);
float w=0;//cheesebox
//float w=pow(x*x+y*y+z*z,0.333); //cybertronian box
for(unsigned char Counter=0;Counter<15;Counter++){
if(x>1)x=2-x;
else
if(x<-1)x=-2-x;
if(y>1)y=2-y;
else
if(y<-1)y=-2-y;
if(z>1)z=2-z;
else
if(z<-1)z=-2-z;
if(w>1)w=2-w;
else
if(w<-1)w=-2-w;
const float vm=sqrt(x*x+y*y+z*z+w*w);

if(vm<0.5){
x=x*4;
y=y*4;
z=z*4;
w=w*4;
} else
if(vm<1){
const float vsq=vm*vm;
x/=vsq;
y/=vsq;
z/=vsq;
w/=vsq;
}
x=x*2+ctx;
y=y*2+cty;
z=z*2+ctz;
w=w*2+ctw;

radius=sqrt(x*x+y*y+z*z+w*w);

if (radius>60) break;

}


if(radius<60)
return true;
else
return false;
}


Title: Re: Quasi-Fuchsian fractal goodness
Post by: DarkBeam on March 02, 2011, 11:32:49 AM
Ok. But you have nothing to say about the other message? ;D

Thanks a lot for your time :D


Title: Re: Quasi-Fuchsian fractal goodness
Post by: Aexion on March 02, 2011, 12:19:12 PM
Ok. But you have nothing to say about the other message? ;D

Thanks a lot for your time :D

Oh, yes, I forgot:
Since the original iteration has many transformations, you must reflect that on the escape time iteration..
one solution for example is iterating both transformations but selecting only the most closest one to the starting point, but thats a brute force solution, and not always give good results.. There are better solutions (such as space partitioning), that most probably works better with this particular case. Ask to David Makin, since he has mastered those methods.

btw, no idea how to use those parameters on UF (I'm a little outdated on the usage of most fractal programs..)

 
 


Title: Re: Quasi-Fuchsian fractal goodness
Post by: DarkBeam on March 02, 2011, 04:21:54 PM
 :sad1:

Thanks for the help anyway


Title: Re: Quasi-Fuchsian fractal goodness
Post by: fractalrebel on March 02, 2011, 05:49:28 PM
A reminder, but I am sure you already know, Quasi-Fuchsian fractals from a Kleinian group, and the transforms are Mobius transforms, not affine transforms. There is a lot of information in the book Indra's Pearls by Mumford, Series and Wright. I have several UF formulas that deal with Kleinian groups based upon the Indra's Pearls book. None of them are really 3D - thats one of my many projects on the back burner. Here is a an example generated in UF:



Title: Re: Quasi-Fuchsian fractal goodness
Post by: fractalrebel on March 02, 2011, 05:56:58 PM
This is still 2D but using spheres:



Title: Re: Quasi-Fuchsian fractal goodness
Post by: Aexion on March 02, 2011, 06:03:31 PM
http://www.youtube.com/watch?v=yY1-D13KICw&feature=player_embedded

No 3D..no?? ;D
They can be 3D but no idea about the formula..


Title: Re: Quasi-Fuchsian fractal goodness
Post by: DarkBeam on March 02, 2011, 06:41:09 PM
A reminder, but I am sure you already know, Quasi-Fuchsian fractals from a Kleinian group, and the transforms are Mobius transforms, not affine transforms. There is a lot of information in the book Indra's Pearls by Mumford, Series and Wright. I have several UF formulas that deal with Kleinian groups based upon the Indra's Pearls book. None of them are really 3D - thats one of my many projects on the back burner. Here is a an example generated in UF:

Thanks for the reply. :)

What we all lookin for is one simple (escape time?) formula that generate those shapes, in 3D, but without the massive use of matrices/matrix inversions and all the stuff that you use in your UF formulas, that are really beautiful but slow. Impossible, I fear? :-\ But Aexion has obtained a great image without using matrices...  :dink:


Title: Re: Quasi-Fuchsian fractal goodness
Post by: DarkBeam on March 02, 2011, 07:00:59 PM
http://www.fractalforums.com/theory/triplex-algebra/

It will be nice to assemble the Mobius formula using Triplex algebra. The formula has already been written (needs only to be transposed in a working code and with all the needed parameters; for 3D transform -> 3 dimensions x 2 kinds x 2 transforms = 12 total. a1,a2,a3, b1,... d2, d3.). The last problem is; what transform we must do? How many (important, because MB can take only 6 transforms in total)? In which order? And after the transforms, we must do some other passages? ^-^

(Moreover. Are they all with FIXED parameters (a1,a2... d4) are always the same or change in between? The Aexion code uses some magnifications with non fixed factors).

Another question is; the code would be much (I mean really much) more simple if the transformations are INVERSIONS, SCALINGS, SHIFTS, ROTATIONS and no transform is composite (with both constants non zero, or at least if a and b are nonzero c must be, and if c&d!=0 a must be zero if the transform is of simple type) - the Aexion code uses only simple transformations.

inversion -> I can use Sphere Inversion's code. That covers all kinds of inversion with scaling - but with no rotations.
scaling -> simply multiply everything by a number.
shift -> simply add/sub a set of numbers.
rotate -> more complicated and the slowest transform (if expressed in angular terms), but the code is already written and works good.
Otherwise I can write a rot code using triplex polynomial product formula, faster.

A Mobius transform of composite type can always be simplified as;

(a z + b)/(c z + d) = (z + b1)/(c1 z + d1) where b1=b/a, c1=c/a, d1=d/a

Not true if the transform is "simple". I mean that simple transforms can be coded with much simpler and faster codes.
Any simple transform can be expressed in terms of composition of more "fast" transforms. Those transforms can be done without allocating stack memory if fp stack is free.


Title: Re: Quasi-Fuchsian fractal goodness
Post by: fractalrebel on March 02, 2011, 09:13:58 PM
What we all lookin for is one simple (escape time?) formula that generate those shapes, in 3D, but without the massive use of matrices/matrix inversions and all the stuff that you use in your UF formulas, that are really beautiful but slow. Impossible, I fear? :-\ But Aexion has obtained a great image without using matrices...  :dink:

QuasiFuchsianSingleDegenerate renders in 2.95 sec on my system, while EarthMap takes 35.84 sec.  ;D


Title: Re: Quasi-Fuchsian fractal goodness
Post by: DarkBeam on March 02, 2011, 09:21:13 PM
I am studying some combination of IFS logic and Mobius. (Just like "IFS Mobius" methos but very simplified). This function is fantastic looking... A sort of Mobius equivalent to Sierpinski.

tester01 {
; ----------------

init:
  z = #pixel
  ;c = @seed
loop:

  ; here is the main fmla
  ; -------------------
  z = (2*@seed1)/(z-flip(@seed2)) + @edge
  z = (2*@seed2)/(z-flip(@seed1)) + @edge
  if real(z)>@edge
  z = flip(@edge-z)
  endif
  if imag(z)>@edge
  z = 1i*@edge-z
  endif
  ;ends here
bailout:
  true
default:
  title = "Test function"
  center = (0,0)
  param seed1
    caption = "Seed 1"
    default = (1,0)
  endparam
  param seed2
    caption = "Seed 2"
    default = (0,1)
  endparam
  float param edge
    caption = "Edge"
    default = 1
  endparam
  int param itercnt
    caption = "Iter count"
    default = 30
  endparam
  float param bailout
    caption = "Bailout"
    hint = "-disabled-"
    default = 1024
  endparam
}

That renders in a fraction of seconds, is autosimilar and fractal. Too bad, in 2D. But it should be easy to convert in 3D.
Look at the picture to be convinced of the power of this method :)

The only defect of these solutions is the discontinuity. :-\


Title: Re: Quasi-Fuchsian fractal goodness
Post by: fractalrebel on March 02, 2011, 10:13:24 PM
Looks promising! ;D


Title: Re: Quasi-Fuchsian fractal goodness
Post by: DarkBeam on March 02, 2011, 10:37:39 PM
Looks promising! ;D
Definitely my friend :D
Too bad needs a radical simplification but I'm afraid I'll not be able...
How can I transform the two consecutive inversion in a single one? :) And the same have to be generalized in 3d. I think that it can be done with 3 flipped sphere inversions, but what is the correct seq and final formula? :D
The two distinct factors must remain unitary (100 010 001) to vary the effect I will use a single rotation after the fixed inversion sum of flipped inversions... :o

Definitely simpler than it seems but I don't have a symbolic evaluator!


Title: Re: Quasi-Fuchsian fractal goodness
Post by: Aexion on March 02, 2011, 11:58:02 PM
I am studying some combination of IFS logic and Mobius. (Just like "IFS Mobius" methos but very simplified). This function is fantastic looking... A sort of Mobius equivalent to Sierpinski.

That renders in a fraction of seconds, is autosimilar and fractal. Too bad, in 2D. But it should be easy to convert in 3D.
Look at the picture to be convinced of the power of this method :)

The only defect of these solutions is the discontinuity. :-\

This is a little formula written in old Fractint style..(sorry, I'm from the elder fractal times)
But if you can translate it to Ultrafractal, you will see an inverted Tree made of mobius transformations (the original attractor is an ifs that looks like a tree..in order to made this, I just inverted the mobius transformations)

P1 is complex and has the real and imag values: (13.37,-6)


ifs4j{
a0 = 0.8475 + flip(0.1812), b0 = 0.4308 + flip(0.2933),
c0 = 0.4665 + flip(0.4267), d0 = -0.7446 +flip( -0.2949),
a1 = -0.0167 + flip(0.4265), b1 = -0.1233 + flip(0.2518),
c1 = 0.1645 + flip(0.1547), d1 = -0.0128 + flip(0.0204),
z=pixel:
o0=(d0*z-b0)/(-c0*z+a0)
op0=|o0-p1|
o1=(d1*z-b1)/(-c1*z+a1)
op1=|o1-p1|
IF (op0<=op1)
z=o0
ELSE
z=o1
ENDIF
|z|<=1000
}

What it does is very simple, calculates both transformations but select the closest one to the p1 point (ala Julia C)
I suspect that for 3d mobius transformation the procedure is the same, but as I told before, the method isn't good, its just a brute force method..



Title: Re: Quasi-Fuchsian fractal goodness
Post by: David Makin on March 03, 2011, 01:40:11 AM
The problem with the "brute-force' method that Aexion mentions is that in a system using multiple transforms then to get the "complete" attractor using the escape-time method you have to make sure you choose the "correct' transform on each iteration.

In some cases then having a point associated with each transform and choosing the transform to use on a given iteration based on which of these is closest to the current "z" is suffcient.
This is because the correct transform to apply next is based on the current location of the z value - the problem is that these areas/volumes are generally not easy to define, especially when using non-affine transforms, and in some cases the relevant areas/volumes actually overlap and in such cases there are some values of z where more than one possible transform on that iteration must be considered for "correct" "complete" rendering resulting in a more complex and considerably slower branched iteration loop.

If trying to render a Sierpinski Triangle using the escape-time method for example and only applying one transform per iteration and you sometimes choose the wrong transform then parts of the S T will be missing.

In fact the Mandelbox and KIFS are examples of "incorrect" rendering of full IFS systems where the conditional execution of transforms does not necessarily match the areas belonging to those transforms and in fact this failure to render the "true" full IFS is part of what contributes to the final shape.

If the transformations involved are completely affine then there is an alternative method to ray-casting using DE for which my older basic algorithm for escape-time 3D IFS in UF uses (method from Hart et al), this method essentially finds intersection of the viewing ray with the attractor (or not) without any stepping but involves a branching iteration loop - since the Mandelbox and KIFS etc. I've realised that it can be vastly optimised by applying the same location rules regarding transforms to use on each iteration as in the non-branched method in order to reduce the total branching necessary.

In fact a location based method that also allows for branching could be used both for the ray intersection method (if everything is affine) and for the DE method where we have non-affine elements.

Obviously both could also have all the other potential RIFS methods added such as transform x cannot follow (or precede) transform y, transform a cannot be used on the nth iteration or z location based controls (per iteration depth?) to choose the next transform that don't necessarily match the correct location control and these could even vary from one iteration to the next, plus anything else we can dream up :)

A system such as this would give a lot more control over the results (if wanted) or could just be used to produce competely unpredictable results.

For example, can you guess what you get if you correctly apply the Sierpinski tetrahedron IFS for just one iteration and then continue from then on with a Mandelbrot or Julia (where the constant or zstart are taken from the result of the single IFS iteration) ?
What if you apply the IFS twice first ? Or three times ? etc.


Title: Re: Quasi-Fuchsian fractal goodness
Post by: DarkBeam on March 03, 2011, 09:19:23 AM
Another image made with my new Mobius-Sierpinski formula; angles are equal but opposite :o


Title: Re: Quasi-Fuchsian fractal goodness
Post by: DarkBeam on March 03, 2011, 10:35:08 AM
I am studying some combination of IFS logic and Mobius. (Just like "IFS Mobius" methos but very simplified). This function is fantastic looking... A sort of Mobius equivalent to Sierpinski.

That renders in a fraction of seconds, is autosimilar and fractal. Too bad, in 2D. But it should be easy to convert in 3D.
Look at the picture to be convinced of the power of this method :)

The only defect of these solutions is the discontinuity. :-\

This is a little formula written in old Fractint style..(sorry, I'm from the elder fractal times)
But if you can translate it to Ultrafractal, you will see an inverted Tree made of mobius transformations (the original attractor is an ifs that looks like a tree..in order to made this, I just inverted the mobius transformations)

P1 is complex and has the real and imag values: (13.37,-6)


ifs4j{
a0 = 0.8475 + flip(0.1812), b0 = 0.4308 + flip(0.2933),
c0 = 0.4665 + flip(0.4267), d0 = -0.7446 +flip( -0.2949),
a1 = -0.0167 + flip(0.4265), b1 = -0.1233 + flip(0.2518),
c1 = 0.1645 + flip(0.1547), d1 = -0.0128 + flip(0.0204),
z=pixel:
o0=(d0*z-b0)/(-c0*z+a0)
op0=|o0-p1|
o1=(d1*z-b1)/(-c1*z+a1)
op1=|o1-p1|
IF (op0<=op1)
z=o0
ELSE
z=o1
ENDIF
|z|<=1000
}

What it does is very simple, calculates both transformations but select the closest one to the p1 point (ala Julia C)
I suspect that for 3d mobius transformation the procedure is the same, but as I told before, the method isn't good, its just a brute force method..

Fractint formulas are supported by UF for backwards compatibility. :dink:
I see no trees, but a fascinating spiral! :)


Title: Re: Quasi-Fuchsian fractal goodness
Post by: Aexion on March 03, 2011, 11:48:42 AM

Fractint formulas are supported by UF for backwards compatibility. :dink:
I see no trees, but a fascinating spiral! :)

Thats because you're close to it..unzoom.. :D



Title: Re: Quasi-Fuchsian fractal goodness
Post by: DarkBeam on March 03, 2011, 12:20:29 PM

Fractint formulas are supported by UF for backwards compatibility. :dink:
I see no trees, but a fascinating spiral! :)

Thats because you're close to it..unzoom.. :D



Yes, but it again looks like a spiral rather than a tree... The irresistible force of the Mobius swirliness :dink:


Title: Re: Quasi-Fuchsian fractal goodness
Post by: Jesse on March 03, 2011, 09:25:10 PM
1) I can't use any additional global variable. Only x,y,z,w and Cx,Cy,,Cz,Cw

dfree1+2, deriv2+3

Quote
3) MB formulas I can write have only a loop section. Moreover, they must return only 8. Instead I can make something like;

In assembler, return 8 means that 8 bytes are popped from the stack register, this not a return value.
The reason for it is that 2 pointers are pushed, the pointers for w and the Ieration3d struct.


Title: Re: Quasi-Fuchsian fractal goodness
Post by: Aexion on March 04, 2011, 12:17:29 AM

Fractint formulas are supported by UF for backwards compatibility. :dink:
I see no trees, but a fascinating spiral! :)

Thats because you're close to it..unzoom.. :D



Yes, but it again looks like a spiral rather than a tree... The irresistible force of the Mobius swirliness :dink:

Oh, rotate the fractal counterclockwise 45 degrees (at least on my image), you will see the tree (ok.. add a lot of imagination)..
But not always the Mobius gives swirliness..  ;D



Title: Re: Quasi-Fuchsian fractal goodness
Post by: DarkBeam on March 04, 2011, 07:29:55 PM
Uhm! I tried to do a Mobius transform in 3D, but without a good param choice... :sad1:


Title: Re: Quasi-Fuchsian fractal goodness
Post by: DarkBeam on March 04, 2011, 07:41:19 PM
Another try:


Mandelbulb3Dv16{
M.....S....O/...w....2....EUFhmF4QL9.Lfhs9eFPr4ExnolBWS.Bx1CvM1Yc5EHzw0P9yWOo40E
................................BW69556i3z1........A./..................y.2.....
................/ME//....6UF....o6....E2.....cwvA.JZJftD/..........c./...w1/...U
z.....kD..../..........wz.............................................sD...../..
.w1...sDhm8nBJNpOy1..........GWxuL.YvLgj8JFYdZV.mrPfgmQHJKhazMmsWE.YvLgjaAi62.ty
3vH7qfT/EiTlywLOAiIZJftD......IE......................sD..kz0...................
.............................UJRR4.wppN.6OLb/.mRR4.irpN.EVLb/UCSR4..............
...........................U..6.P....M4...EB....W....61....F....8/...I1....UJl12
...U.iVFwxDE./ozPM2Tzz7lz16.mc..zXCc.El18XGQeGyDjvIRhrVAkz1............28.kFrA0.
FWb96aAIVzvh1se7Umvxz0........../6U0.wzzz1................................E.0c..
zzzz.................................2U.8.kzzzD.................................
/6U0.wzzz1...................................2CcN/UvNP6.eeWCNq0.yRii.EJJUk1f..XR
S1.mx3CcN/UvNP6.QsLsUa3.ibhV..bTV1OK.sSq40.ly3CcN/UvNP6.MwLsUa3.ibhV.kqTV1OK.sSq
40.kz3CcN/UvNP6...EsUa3.eeWCNq0.IJ36wk8.wyLsUa3.................................
E....E....E.....I....M....kL1xaPYZ2RXxKRiFbI.........................YE006U.0...
...................wz..........E..........2........wz...........................
................................................................................
.....................2.....3....A....wJHj7KOpB5JkV5.............................
...............................................................E..........2.....
..............zD..............................xj........Ez1.....................
................................/....E/...U/....TBoPiFKGoBqPpt4RG/..............
..........E076U.06......................kz1........../......../E................
...wz.........zD................................................................
..........................................E.....I....k....kLBxaMdJrQI/5S........
................................................................................
.....1.........E...................wz0.............................oz.........xD
........................................................}

But not very good, still. ^-^