/* -------------------------- Entry: 0001 WWW: http://astronomy.swin.edu.au/~pbourke/ Title: Sphere, trapped in a fractal world. Author: Paul Bourke ---------------------------*/ /* Euclidean sphere trapped in the fractal domain Attractors by Roger Bagula */ #declare VP = <1.2,-0.2,0.2>; #declare VU = <0,0,1>; #declare VLOOK = <0,0,0.15>; #declare VD = vnormalize(VLOOK - VP); #declare N = 100000; camera { location VP up y right x angle 60 sky VU look_at VP + VD } light_source { <0,0,1> color rgb <1,1,1> } light_source { VP + <0,-1,0> color rgb <1,1,1> } fog { distance 3 color rgb <0,0,0> } global_settings { ambient_light <1,1,1> } sphere { <0,0,0>,0.3 texture { pigment { color rgb <0.8,0.8,0.7> } finish { ambient 0.15 brilliance 5 diffuse 0.6 metallic specular 0.80 roughness 1/100 reflection 0.65 } } translate <0,0,0.1> } #declare cagetexture = texture { pigment { color rgb <1,0.5,0.5> } finish { ambient 0.2 diffuse 0.8 specular 0.5 } } #declare crown = union { #declare A = 5; #declare B = log(2) / log(3); #declare ARG1 = 0; #declare ARG2 = 0; #declare I = 0; #while (I < N) #declare T = -pi + 2 * pi * I / N; #declare RE = 0; #declare IM = 0; #declare K = 1; #while (K < 15) #declare ARG1 = pow(A,K) * T * pow(-1.0,K); #declare ARG2 = pow(A,B*K); #declare RE = RE + cos(ARG1) / ARG2; #declare IM = IM + sin(ARG1) / ARG2; #declare K = K + 1; #end #if (I > 10) sphere { , 0.001 } #end #declare I = I + 1; #end } /* Form the cage */ union { crown texture { cagetexture } scale <1,1,1.5> translate <0,0,-0.2> } union { crown texture { cagetexture } scale <1,1,-0.5> translate <0,0,0.45> } union { crown texture { cagetexture } rotate <0,0,36> scale <1,1,1.5> translate <0,0,-0.2> } union { crown texture { cagetexture } rotate <0,0,36> scale <1,1,-0.5> translate <0,0,0.45> } /* The ground plane */ #declare groundplane = union { #declare SEED1 = seed(12345); #declare I = 0; #declare X2 = 0; #declare Y2 = 0; #declare X1 = rand(SEED1); #declare Y1 = rand(SEED1); #while (I < N/10) #declare A = rand(SEED1); #if (A < 0.3333333) #declare X2 = X1 / 2; #declare Y2 = Y1 / 2; #else #if (A < 0.666666) #declare X2 = Y1 / 2; #declare Y2 = -X1 / 2 - 0.5; #else #declare X2 = -Y1 / 2 - 0.5; #declare Y2 = X1 / 2; #end #end #if (I > 10) sphere { , 0.0005 } #end #declare X1 = X2; #declare Y1 = Y2; #declare I = I + 1; #end } #declare planetexture = texture { pigment { color rgb <0.3,0.7,0.3> } finish { ambient 0.2 diffuse 0.8 specular 0.5 } } /* Tile the plane fractal */ #declare PLANEDEPTH = -0.2; #declare X1 = -4; #while (X1 < 4) #declare Y1 = -4; #while (Y1 < 4) union { groundplane texture { planetexture } scale 2 translate } #declare Y1 = Y1 + 1; #end #declare X1 = X1 + 1; #end #declare startexture = texture { pigment { color rgb 2*<1,1,1> } finish { ambient 1 diffuse 1 } } /* Stars */ #declare starfield = union { #declare I = 0; #declare x1 = 0; #declare y1 = 0; #while (I < N) #declare A = rand(SEED1); #if (A < 0.90) #declare X2 = 0.787879 * X1 - 0.424242 * Y1 + 1.758647; #declare Y2 = 0.242424 * X1 + 0.859848 * Y1 + 1.408065; #else #if (A < 0.95) #declare X2 = -0.121212 * X1 + 0.257576 * Y1 - 6.721654; #declare Y2 = 0.151515 * X1 + 0.053030 * Y1 + 1.377236; #else #declare X2 = 0.181818 * X1 - 0.136364 * Y1 + 6.086107; #declare Y2 = 0.090909 * X1 + 0.181818 * Y1 + 1.568035; #end #end #if (I > 10) sphere { , 0.0015 } #end #declare X1 = X2; #declare Y1 = Y2; #declare I = I + 1; #end } union { starfield texture { startexture } scale 2 translate <0,-4,1.5> }