/*========================================================= Esercizio sulle macro ricorsive: tetraedro di Sierpinski con sferette all'interno dei tetraedri Metodi e Modelli Matematici Gian Marco Todesco, ottobre 2007 http://archinet.uniroma3.it/mate/metodi/2007 =========================================================*/ #include "colors.inc" #include "textures.inc" camera { location <0, 0, -6> right x*image_width/image_height look_at 0 angle 35 } light_source { <-10, 10, -30> color 1 } light_source { < 10, 10, -30> color 1 } // cielo sky_sphere { pigment { gradient y color_map { [0.3 rgb <0.8,0.7,1.0>] [0.6 rgb <0.0,0.1,0.8>] } scale 2 translate y } } /* // pavimento plane { y,-2 pigment {White} } */ // // procedura ricorsiva: // disegna un tetraedro di Sierpinski di livello N e vertici A,B,C,D // #macro TetraedroDiSierpinski(N, A,B,C,D) #if(N=0) // se N = 0 disegno un tetraedro semplice union { triangle {A,B,C} triangle {A,C,D} triangle {A,D,B} triangle {B,C,D} pigment {White} } #else // se N > 0 disegno quattro Sierpinski di livello N-1 // calcolo i punti medi dei lati #local AB = (A+B)/2; #local BC = (B+C)/2; #local AC = (A+C)/2; #local AD = (A+D)/2; #local BD = (B+D)/2; #local CD = (C+D)/2; // chiamata ricorsiva TetraedroDiSierpinski(N-1, A,AB,AC,AD) TetraedroDiSierpinski(N-1, B,AB,BC,BD) TetraedroDiSierpinski(N-1, C,AC,BC,CD) TetraedroDiSierpinski(N-1, D,AD,BD,CD) // aggiungo una sfera al centro del tetraedro ABCD, tangente alle facce #local M = (A+B+C+D)/4; // centro del tetraedro #local R = vlength(M-(A+B+C)/3); sphere { M,R texture { pigment {Orange} finish {Metal} } } #end #end // invoco la macro partendo dai vertici di un tetraedro regolare // (quattro degli otto vertici di un cubo) union { TetraedroDiSierpinski(5, <1,1,1>,<1,-1,-1>,<-1,1,-1>,<-1,-1,1>) rotate -5*y rotate -10*x }