// Psr.pov - pure set version of a number as a parallelipiped #version 3.1; global_settings { assumed_gamma 1.0 ambient_light <.846, 1.041, 1.041> max_trace_level 500} #include "colors.inc" #declare C = 10; // number to render (nonnegative integer 0-23) // memory use doubles at each increase // 12 is about 96 megs #declare C = min(int(abs(C)), 23); sky_sphere { pigment { color Yellow } } #declare M = texture { pigment { color Blue } } #macro B(_x, _y, _z, _u, _v, _w) union { //box { <_x, _y, _z>, <_x + _u, _y + _v, _z + _w> texture { pigment { color Red transmit .9 } } } sphere { <_x,_y, _z>, .1 texture { M } } sphere { <_x + _u,_y, _z>, .1 texture { M } } sphere { <_x,_y + _v, _z>, .1 texture { M } } sphere { <_x,_y, _z + _w>, .1 texture { M } } sphere { <_x + _u,_y + _v, _z>, .1 texture { M } } sphere { <_x + _u,_y, _z + _w>, .1 texture { M } } sphere { <_x,_y + _v, _z + _w>, .1 texture { M } } sphere { <_x + _u,_y + _v, _z + _w>, .1 texture { M } } cylinder { <_x, _y, _z>, <_x + _u, _y, _z>, .1 texture { M } } cylinder { <_x, _y, _z>, <_x, _y + _v, _z>, .1 texture { M } } cylinder { <_x, _y, _z>, <_x, _y, _z + _w>, .1 texture { M } } cylinder { <_x + _u, _y, _z>, <_x + _u, _y + _v, _z>, .1 texture { M } } cylinder { <_x + _u, _y, _z>, <_x + _u, _y, _z + _w>, .1 texture { M } } cylinder { <_x, _y + _v, _z>, <_x + _u, _y + _v, _z>, .1 texture { M } } cylinder { <_x, _y + _v, _z>, <_x, _y + _v, _z + _w>, .1 texture { M } } cylinder { <_x, _y, _z + _w>, <_x + _u, _y, _z + _w>, .1 texture { M } } cylinder { <_x, _y, _z + _w>, <_x, _y + _v, _z + _w>, .1 texture { M } } cylinder { <_x + _u, _y + _v, _z>, <_x + _u, _y + _v, _z + _w>, .1 texture { M } } cylinder { <_x + _u, _y, _z + _w>, <_x + _u, _y + _v, _z + _w>, .1 texture { M } } cylinder { <_x, _y + _v, _z + _w>, <_x + _u, _y + _v, _z + _w>, .1 texture { M } } } #end #macro S(_n) // calculates box size #local _a = array[_n + 1] #local _a[0] = <2, 2, 2>; #if(_n > 0) #local _i = 1; #while(_i <= _n) #local _t = _a[_i - 1]; #switch(mod(_i - 1, 3)) #case(0) #local _a[_i] = <_t.x + 4, _t.y + 4, _t.z * 2 + 2>; #break #case(1) #local _a[_i] = <_t.x * 2 + 2, _t.y + 4, _t.z + 4>; #break #case(2) #local _a[_i] = <_t.x + 4, _t.y * 2 + 2, _t.z + 4>; #break #end #local _i = _i + 1; #end #end _a[_n] #end #macro Zero(_x, _y, _z) #local _t = S(0); B(_x, _y, _z, _t.x, _t.y, _t.z) #end #macro One(_x, _y, _z, _b) #local _t = S(1); #local _q = S(0); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #else sphere { <0, 0, 0>, .01 texture { pigment { color Clear } } } // avoid degenerate unions #end Zero(_x + 2, _y + 2, _z + _q.z) } #end #macro Two(_x, _y, _z, _b) #local _t = S(2); #local _q = S(1); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end One(_x + _q.x, _y + 2, _z + 2, 1) One(_x, _y + 2, _z + 2, 0) } #end #macro Three(_x, _y, _z, _b) #local _t = S(3); #local _q = S(2); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Two(_x + 2, _y + 2, _z + 2, 1) Two(_x + 2, _y + _q.y + 2, _z + 2, 0) } #end #macro Four(_x, _y, _z, _b) #local _t = S(4); #local _q = S(3); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Three(_x + 2, _y + 2, _z + _q.z, 1) Three(_x + 2, _y + 2, _z, 0) } #end #macro Five(_x, _y, _z, _b) #local _t = S(5); #local _q = S(4); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Four(_x + _q.x, _y + 2, _z + 2, 1) Four(_x, _y + 2, _z + 2, 0) } #end #macro Six(_x, _y, _z, _b) #local _t = S(6); #local _q = S(5); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Five(_x + 2, _y + 2, _z + 2, 1) Five(_x + 2, _y + _q.y + 2, _z + 2, 0) } #end #macro Seven(_x, _y, _z, _b) #local _t = S(7); #local _q = S(6); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Six(_x + 2, _y + 2, _z + _q.z, 1) Six(_x + 2, _y + 2, _z, 0) } #end #macro Eight(_x, _y, _z, _b) #local _t = S(8); #local _q = S(7); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Seven(_x + _q.x, _y + 2, _z + 2, 1) Seven(_x, _y + 2, _z + 2, 0) } #end #macro Nine(_x, _y, _z, _b) #local _t = S(9); #local _q = S(8); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Eight(_x + 2, _y + 2, _z + 2, 1) Eight(_x + 2, _y + _q.y + 2, _z + 2, 0) } #end #macro Ten(_x, _y, _z, _b) #local _t = S(10); #local _q = S(9); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Nine(_x + 2, _y + 2, _z + _q.z, 1) Nine(_x + 2, _y + 2, _z, 0) } #end #macro Eleven(_x, _y, _z, _b) #local _t = S(11); #local _q = S(10); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Ten(_x + _q.x, _y + 2, _z + 2, 1) Ten(_x, _y + 2, _z + 2, 0) } #end #macro Twelve(_x, _y, _z, _b) #local _t = S(12); #local _q = S(11); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Eleven(_x + 2, _y + 2, _z + 2, 1) Eleven(_x + 2, _y + _q.y + 2, _z + 2, 0) } #end #macro Thirteen(_x, _y, _z, _b) #local _t = S(13); #local _q = S(12); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Twelve(_x + 2, _y + 2, _z + _q.z, 1) Twelve(_x + 2, _y + 2, _z, 0) } #end #macro Fourteen(_x, _y, _z, _b) #local _t = S(14); #local _q = S(13); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Thirteen(_x + _q.x, _y + 2, _z + 2, 1) Thirteen(_x, _y + 2, _z + 2, 0) } #end #macro Fifteen(_x, _y, _z, _b) #local _t = S(15); #local _q = S(14); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Fourteen(_x + 2, _y + 2, _z + 2, 1) Fourteen(_x + 2, _y + _q.y + 2, _z + 2, 0) } #end #macro Sixteen(_x, _y, _z, _b) #local _t = S(16); #local _q = S(15); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Fifteen(_x + 2, _y + 2, _z + _q.z, 1) Fifteen(_x + 2, _y + 2, _z, 0) } #end #macro Seventeen(_x, _y, _z, _b) #local _t = S(17); #local _q = S(16); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Sixteen(_x + _q.x, _y + 2, _z + 2, 1) Sixteen(_x, _y + 2, _z + 2, 0) } #end #macro Eighteen(_x, _y, _z, _b) #local _t = S(18); #local _q = S(17); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Seventeen(_x + 2, _y + 2, _z + 2, 1) Seventeen(_x + 2, _y + _q.y + 2, _z + 2, 0) } #end #macro Nineteen(_x, _y, _z, _b) #local _t = S(19); #local _q = S(18); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Eighteen(_x + 2, _y + 2, _z + _q.z, 1) Eighteen(_x + 2, _y + 2, _z, 0) } #end #macro Twenty(_x, _y, _z, _b) #local _t = S(20); #local _q = S(19); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Nineteen(_x + _q.x, _y + 2, _z + 2, 1) Nineteen(_x, _y + 2, _z + 2, 0) } #end #macro Twentyone(_x, _y, _z, _b) #local _t = S(21); #local _q = S(20); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Twenty(_x + 2, _y + 2, _z + 2, 1) Twenty(_x + 2, _y + _q.y + 2, _z + 2, 0) } #end #macro Twentytwo(_x, _y, _z, _b) #local _t = S(22); #local _q = S(21); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Twentyone(_x + 2, _y + 2, _z + _q.z, 1) Twentyone(_x + 2, _y + 2, _z, 0) } #end #macro Twentythree(_x, _y, _z, _b) #local _t = S(23); #local _q = S(22); union { #if(_b = 1) B(_x, _y, _z, _t.x, _t.y, _t.z) #end Twentytwo(_x + _q.x, _y + 2, _z + 2, 1) Twentytwo(_x, _y + 2, _z + 2, 0) } #end #macro D(_s) #local _p = S(_s); #local _k = max(_p.x, _p.y); #local _k = max(_k, _p.z); camera { up <0, 1, 0> right <4 / 3, 0, 0> location <2 * _k, 2 * _k, -3 * _k> look_at <0, 0, 0> } light_source { <-2 * _p.x, 2 * _p.y, -1 * _p.z> color rgb <1.103, .993, .772> } object { #switch(_s) #case(0) Zero(0, 0, 0) #break #case(1) One(0, 0, 0, 1) #break #case(2) Two(0, 0, 0, 1) #break #case(3) Three(0, 0, 0, 1) #break #case(4) Four(0, 0, 0, 1) #break #case(5) Five(0, 0, 0, 1) #break #case(6) Six(0, 0, 0, 1) #break #case(7) Seven(0, 0, 0, 1) #break #case(8) Eight(0, 0, 0, 1) #break #case(9) Nine(0, 0, 0, 1) #break #case(10) Ten(0, 0, 0, 1) #break #case(11) Eleven(0, 0, 0, 1) #break #case(12) Twelve(0, 0, 0, 1) #break #case(13) Thirteen(0, 0, 0, 1) #break #case(14) Fourteen(0, 0, 0, 1) #break #case(15) Fifteen(0, 0, 0, 1) #break #case(16) Sixteen(0, 0, 0, 1) #break #case(17) Seventeen(0, 0, 0, 1) #break #case(18) Eighteen(0, 0, 0, 1) #break #case(19) Nineteen(0, 0, 0, 1) #break #case(20) Twenty(0, 0, 0, 1) #break #case(21) Twentyone(0, 0, 0, 1) #break #case(22) Twentytwo(0, 0, 0, 1) #break #case(23) Twentythree(0, 0, 0, 1) #break #else Four(0, 0, 0, 1) #break #end scale 3.75 translate <-_p.x * 2, -_p.y * 2.05, 0> } #end D(C)