//by Mike Metheny, aka Lone Shepherd. #include "colors.inc" #include "stones.inc" sky_sphere { pigment { gradient y color_map { [0.0 color rgb <0.7,0.7,1.0>] [1.0 color blue 0.5] } } } #declare loc1 = <-.3,1.5,-1>*.9; //for looking at the cube, or frac4 #declare look1 = <.25,.75,0>*.9; #declare loc2 = <-.1,1,-2>*1.2; //for looking at the 'city' camera{location loc2 look_at <0,0,0>} light_source{<10000,10000,-10000> White} light_source{<-10000,-10000,-10000> White} #declare widd=1; //this is the approximate width of the actual fractal. It extends just a tiny bit to the left and right of widd. #declare iterr=2; //this # is not actually the correct iteration level, it is one less than the actual iteration level. #declare radd = (1/5)*widd; //the radius of the cylinder and sphere as a function of width of the fractal. very thick so pixel wide lines don't disappear at high recursion levels. #declare cc = 1; //the count incrementer #declare plank = //the capped cylinder which is the segment or building block for the fractal. union{ sphere{<0,0,0>,radd} cylinder{<0,0,0>,,radd} sphere{<0,0,0>,radd translate } } #declare frac1 = //the first iteration union{ object{plank scale 1/3} object{plank scale 1/3 rotate 90*z translate <(1/3)*widd,0,0>} object{plank scale 1/3 translate <((1/3)*widd),(1/3)*widd,0>} object{plank scale 1/3 rotate -90*z translate <(2/3)*widd,(1/3)*widd,0>} object{plank scale 1/3 translate <(2/3)*widd,0,0>} } #declare fracc=object{frac1} #while(cc<=iterr) #declare fract = //loop scales each previous iteration and replaces each 'segment' union{ object{fracc scale 1/3} object{fracc scale 1/3 rotate 90*z translate <(1/3)*widd,0,0>} object{fracc scale 1/3 translate <((1/3)*widd),(1/3)*widd,0>} object{fracc scale 1/3 rotate -90*z translate <(2/3)*widd,(1/3)*widd,0>} object{fracc scale 1/3 translate <(2/3)*widd,0,0>} } #declare fracc = object{fract} #declare cc=cc+1; #end //------------------------------------------------------------------------------ //this is the second fractal, the 'cityscape' #declare wid=1; #declare iter=1; #declare bwid = (1/50)*wid; //you can play with this value for different iteration levels. #declare c = 1; #declare frat = (1/16); #declare frat2 = (1/16)*wid; #declare rodd = box{<0,-.5*bwid,-.5*bwid>,} //the segment #declare ffracte = //first iteration union{ object{rodd} object{rodd scale <8*frat,1,1> translate <4*frat2,1*frat2,0>} object{rodd scale <2*frat,1,1> translate <2*frat2,3*frat2,0>} object{rodd scale <2*frat,1,1> translate <12*frat2, 3*frat2,0>} object{rodd scale <5*frat,1,1> translate <2*frat2,5*frat2,0>} object{rodd scale <5*frat,1,1> translate <9*frat2,5*frat2,0>} object{rodd scale <5*frat,1,1> translate <0,6*frat2,0>} object{rodd scale <5*frat,1,1> translate <11*frat2,6*frat2,0>} object{rodd scale <2*frat,1,1> translate <5*frat2,10*frat2,0>} object{rodd scale <2*frat,1,1> translate <9*frat2,10*frat2,0>} object{rodd scale <6*frat,1,1> rotate 90*z} object{rodd scale <6*frat,1,1> rotate 90*z translate <16*frat2,0,0>} object{rodd scale <2*frat,1,1> rotate 90*z translate <2*frat2,3*frat2,0>} object{rodd scale <2*frat,1,1> rotate 90*z translate <14*frat2,3*frat2,0>} object{rodd scale <2*frat,1,1> rotate 90*z translate <4*frat2,1*frat2,0>} object{rodd scale <2*frat,1,1> rotate 90*z translate <12*frat2,1*frat2,0>} object{rodd scale <4*frat,1,1> rotate 90*z translate <5*frat2,6*frat2,0>} object{rodd scale <4*frat,1,1> rotate 90*z translate <11*frat2,6*frat2,0>} object{rodd scale <5*frat,1,1> rotate 90*z translate <7*frat2,5*frat2,0>} object{rodd scale <5*frat,1,1> rotate 90*z translate <9*frat2,5*frat2,0>} } #declare fracte = object{ffracte} #while (c<=iter) #declare ffractee = union{ object{fracte rotate 180*z translate wid*x} object{fracte scale <8*frat,1,1> translate <4*frat2,1*frat2,0>} object{fracte scale <2*frat,1,1> translate <2*frat2,3*frat2,0>} object{fracte scale <2*frat,1,1> translate <12*frat2, 3*frat2,0>} object{fracte scale <5*frat,1,1> translate <2*frat2,5*frat2,0>} object{fracte scale <5*frat,1,1> translate <9*frat2,5*frat2,0>} object{fracte scale <5*frat,1,1> translate <0,6*frat2,0>} object{fracte scale <5*frat,1,1> translate <11*frat2,6*frat2,0>} object{fracte scale <2*frat,1,1> translate <5*frat2,10*frat2,0>} object{fracte scale <2*frat,1,1> translate <9*frat2,10*frat2,0>} object{fracte scale <6*frat,1,1> rotate 90*z} object{fracte scale <6*frat,1,1> rotate -90*z translate <16*frat2,6*frat2,0>} object{fracte scale <2*frat,1,1> rotate 90*z translate <2*frat2,3*frat2,0>} object{fracte scale <2*frat,1,1> rotate -90*z translate <14*frat2,(3*frat2)+(2*frat2),0>} object{fracte scale <2*frat,1,1> rotate 90*z translate <4*frat2,1*frat2,0>} object{fracte scale <2*frat,1,1> rotate -90*z translate <12*frat2,(1*frat2)+(2*frat2),0>} object{fracte scale <4*frat,1,1> rotate 90*z translate <5*frat2,6*frat2,0>} object{fracte scale <4*frat,1,1> rotate -90*z translate <11*frat2,(6*frat2)+(4*frat2),0>} object{fracte scale <5*frat,1,1> rotate 90*z translate <7*frat2,5*frat2,0>} object{fracte scale <5*frat,1,1> rotate -90*z translate <9*frat2,(5*frat2)+(5*frat2),0>} } #declare fracte = object{ffractee} #declare c=c+1; #end //------------------------------------------------------------------------------ #declare frac2=object{fract rotate -90*x} #declare frac3= //makes a square of 4 of the first triangle-shaped fractals. union{ object{frac2 rotate 180*y translate widd*x } object{frac2 rotate 90*y translate } object{frac2 rotate -90*y} object{frac2 translate widd*z} } #declare frac4= //makes the 'borg snowflake' from six of the square fractals union{ object{frac3} object{frac3 translate <0,widd,0>} object{frac3 rotate 90*z} object{frac3 rotate 90*z translate widd*x} object{frac3 rotate 90*z rotate 90*y} object{frac3 rotate 90*z rotate 90*y translate widd*z} } //object{frac4 texture{T_Stone3 scale .25} finish{roughness .9 } normal{bumps .3}} //the borg snowflake object{ffractee texture{T_Stone13 scale .25} translate <-8*frat2,-5*frat2,0>} //the cityscape