// Exemplo de arquivo de descricao de cena para POV-ray // Last edited on 2023-12-23 18:36:45 by stolfi // ====================================================================== // CORES E TEXTURAS //#include "textures.inc" background{ color rgb < 240/255, 243/255, 246/255 > } #declare tx_ponto = texture{ pigment{ color rgb < 0.71, 0.71, 0.71 > } finish{ diffuse 0.9 ambient 0.1 } scale 1.0 } #declare tx_ponto_top = texture{ pigment{ color rgb < 0.80, 0.0, 0.17 > } finish{ diffuse 0.9 ambient 0.1 } scale 1.0 } #declare tx_grau1 = texture{ pigment{ color rgb < 0.17, 0.80, 1.00 > } finish{ diffuse 0.9 ambient 0.1 } scale 1.0 } #declare tx_grau2 = texture{ pigment{ color rgb < 0.80, 0.17, 1.00 > } finish{ diffuse 0.9 ambient 0.1 } scale 1.0 } #declare tx_grau3 = texture{ pigment{ color rgb < 0.10, 1.00, 0.17 > } finish{ diffuse 0.9 ambient 0.1 } scale 1.0 } #declare tx_grau4 = texture{ pigment{ color rgb < 1.00, 0.17, 0.10 > } finish{ diffuse 0.9 ambient 0.1 } scale 1.0 } #declare tx_tubo = texture{ pigment{ color rgb < 0.50, 0.70, 0.90 > } finish{ diffuse 0.9 ambient 0.1 } scale 1.0 } //-------------------------------------------------------------- #macro ponto(centro, raio) sphere{ centro, raio texture{ tx_ponto } } #end #macro ponto_top(centro, raio) sphere{ centro, raio texture{ tx_ponto_top } } #end //-------------------------------------------------------------- #macro grau1(xx, yy, zz) union{ sphere{ < xx, yy, zz>, 0.25 texture{ tx_grau1 } } cylinder{ < xx + 0.25, yy, zz>, < xx + 0.35, yy, zz >, 0.1 texture{ tx_tubo } } } #end #macro vert_grau1_base(j) #local p = < 0.25, 0, 0>; p #end #macro vert_grau1_ponta(j) #local p = < 0.35, 0, 0>; p #end //-------------------------------------------------------------- #macro grau2(xx, yy, zz) union{ cylinder{ < xx, yy, zz>, < xx, yy, zz + 0.25>, 0.35 texture{ tx_grau2 } } box{ < xx - 0.20, yy - 0.20, zz + 0.25>, < xx + 0.2, yy + 0.2, zz + 0.75 > texture{ tx_grau2 } } cylinder{ < xx, yy, zz + 0.5 >, < xx + 0.5, yy, zz + 0.5 >, 0.1 texture{ tx_tubo } } cylinder{ < xx, yy, zz + 0.5 >, < xx - 0.5, yy, zz + 0.5 >, 0.1 texture{ tx_tubo } } } #end #macro vert_grau2_base(j) #local p = < 0, 0, 0>; #if(j = 1) #local p = <0.2, 0, 0.5>; #end #if(j = 2) #local p = <-0.2, 0, 0.5>; #end p #end #macro vert_grau2_ponta(j) #local p = < 0, 0, 0>; #if(j = 1) #local p = <0.5, 0, 0.5>; #end #if(j = 2) #local p = <-0.5, 0, 0.5>; #end p #end //-------------------------------------------------------------- #macro grau3(xx, yy, zz) union{ cylinder{ < xx, yy, zz >, < xx, yy, zz + 0.5>, 0.2 texture{ tx_grau3 } } sphere{ < xx, yy, zz + 0.75 >, 0.25 texture{ tx_grau3 } } cylinder{ < xx, yy, zz + 0.25 >, < xx + 0.35, yy, zz + 0.25 >, 0.1 texture{ tx_tubo } } cylinder{ < xx, yy, zz + 0.25 >, < xx, yy + 0.35, zz + 0.25 >, 0.1 texture{ tx_tubo } } cylinder{ < xx, yy, zz + 0.25 >, < xx, yy - 0.35, zz + 0.25 >, 0.1 texture{ tx_tubo } } } #end #macro vert_grau3_base(j) #local p = < 0, 0, 0>; #if(j = 1) #local p = <0.25, 0, 0.25>; #end #if(j = 2) #local p = <0, 0.25, 0.25>; #end #if(j = 3) #local p = <0, -0.25, 0.25>; #end p #end #macro vert_grau3_ponta(j) #local p = < 0, 0, 0>; #if(j = 1) #local p = <0.35, 0, 0.25>; #end #if(j = 2) #local p = <0, 0.35, 0.25>; #end #if(j = 3) #local p = <0, -0.35, 0.25>; #end p #end //-------------------------------------------------------------- #macro grau4(xx, yy, zz) union{ sphere{ < xx, yy, zz + 0.25 >, 0.25 texture{ tx_grau4 } } cone{ < xx, yy, zz + 0.75 >, 0, < xx, yy, zz + 0.5 >, 0.3 texture{ tx_grau4 } } cylinder{ < xx, yy, zz + 0.25 >, < xx + 0.35, yy, zz + 0.25 >, 0.1 texture{ tx_tubo } } cylinder{ < xx, yy, zz + 0.25 >, < xx, yy + 0.35, zz + 0.25 >, 0.1 texture{ tx_tubo } } cylinder{ < xx, yy, zz + 0.25 >, < xx, yy - 0.35, zz + 0.25 >, 0.1 texture{ tx_tubo } } cylinder{ < xx, yy, zz + 0.25 >, < xx - 0.35, yy, zz + 0.25 >, 0.1 texture{ tx_tubo } } } #end #macro vert_grau4_base(j) #local p = < 0, 0, 0>; #if(j = 1) #local p = <0.25, 0, 0.25>; #end #if(j = 2) #local p = <0, 0.25, 0.25>; #end #if(j = 3) #local p = <0, -0.25, 0.25>; #end #if(j = 4) #local p = <-0.25, 0, 0.25>; #end p #end #macro vert_grau4_ponta(j) #local p = < 0, 0, 0>; #if(j = 1) #local p = <0.35, 0, 0.25>; #end #if(j = 2) #local p = <0, 0.35, 0.25>; #end #if(j = 3) #local p = <0, -0.35, 0.25>; #end #if(j = 4) #local p = <-0.35, 0, 0.25>; #end p #end //------------------------------------------------------------------ #macro interpola_1(tt, t0, t1, p0, p1) #local ss = (tt - t0)/(t1 - t0); #local vv = (1 - ss)*p0 + ss*p1; vv #end #macro interpola_3(tt, t0, t1, p0, p1, p2, p3) #local p01 = interpola_1(tt, t0, t1, p0, p1); #local p12 = interpola_1(tt, t0, t1, p1, p2); #local p23 = interpola_1(tt, t0, t1, p2, p3); #local p012 = interpola_1(tt, t0, t1, p01, p12); #local p123 = interpola_1(tt, t0, t1, p12, p23); #local p = interpola_1(tt, t0, t1, p012, p123); p #end #macro testa_interpola_1(p0, p1, n, raio) union{ #local i = 0; #while(i < n) #local centro = interpola_1(i, 0, n, p0, p1); ponto(centro, raio) #local i = i + 1; #end } #end #macro testa_interpola_3(p0, p1, p2, p3, n, raio) union{ #local i = 0; #while(i < n) #local centro = interpola_3(i, 0, n, p0, p1, p2, p3); ponto(centro, raio) #local i = i + 1; #end } #end //------------------------------------------------------------------ #macro interpola3_multi(tt, p_ini, n, p1, p2, p_fim) #local k = floor(tt); // Inicializa para preencher dps #local Q0 = <0,0,0>; #local Q1 = <0,0,0>; #local Q2 = <0,0,0>; #local Q3 = <0,0,0>; #if (k = 0) #local Q0 = p_ini; #end #if (k > 0) #local Q0 = (p2[k-1] + p1[k])/2; #end #if (k = n-1) #local Q3 = p_fim; #end #if (k < n-1) #local Q3 = (p2[k] + p1[k+1])/2; #end #local Q1 = p1[k]; #local Q2 = p2[k]; #local centro = interpola_3(tt, k, k+1, Q0, Q1, Q2, Q3); ponto(centro, 0.05) // ponto_top(Q3, 0.5) #end #macro teste_interpola3_multi() #local N = 3; #declare p1 = array[N] #declare p1[0] = <0,-4,1.25>; #declare p1[1] = <0,8,2.5>; #declare p1[2] = <-2,-8,0.5>; #local p2 = array[N] #declare p2[0] = <-10,10,10>; #declare p2[1] = <10, -10, -10>; #declare p2[2] = <-5,5,0>; #declare p_ini = <2.75, 4.66726, 1>; #declare p_fim = <1, 4.66726, 2.75>; #local raio = 0.05; // ponto_top(p_ini, 0.5) // ponto_top(p_fim, 0.5) #local tt = 0; #while(tt < N) interpola3_multi(tt, p_ini, N, p1, p2, p_fim) #local tt = tt + 0.001; #end #end //------------------------------------------------------------------ #declare roleta1 = seed(92839); #declare roleta2 = seed(72837); #declare roleta3 = seed(10567); #macro conector(na, nb, pini, tini, pfin, tfin) #local p1 = array[na] #local p2 = array[na] #local i = 0; #while( i < na) #local xx = D*rand(roleta1); // prof #local yy = D*rand(roleta2); // prof #local zz = D*rand(roleta3); #local p1[i] = ; #local p2[i] = ; #if(i = 0) #local p1[i] = tini; #end #if(i = na-1) #local p2[i] = tfin; #end #local i = i + 1; #end #local tt = 0; #while(tt < na) interpola3_multi(tt, pini, na, p1, p2, pfin) #local tt = tt + 0.001; #end #end #macro gera_grafo(nv, ne, org, dst, D, na, nb) // vertices #local coord = array[1000]; #local nt = array[nv]; #local vert_tipos = array[nv]; #local i = 0; #while( i < nv) #local xx = D*rand(roleta1); #local yy = D*rand(roleta2); #local zz = D*rand(roleta2); #local p = ; #local coord[i] = p; #local r = int(4*rand(roleta3)) + 1; #if(r = 1) grau1(xx, yy, zz) #local nt[i] = 1; #local vert_tipos[i] = 1; #end #if(r = 2) grau2(xx, yy, zz) #local nt[i] = 2; #local vert_tipos[i] = 2; #end #if(r = 3) grau3(xx, yy, zz) #local nt[i] = 3; #local vert_tipos[i] = 3; #end #if(r = 4) grau4(xx, yy, zz) #local nt[i] = 4; #local vert_tipos[i] = 4; #end #local i = i + 1; #end // arestas #local i = 0; #while(i < ne) #local tlivre_ini = nt[org[i]]; #local tlivre_fin = nt[dst[i]]; // ini #if(vert_tipos[org[i]] = 1) #local pini = vert_grau1_base(tlivre_ini); #local tini = vert_grau1_ponta(tlivre_ini); #end #if(vert_tipos[org[i]] = 2) #local pini = vert_grau2_base(tlivre_ini); #local tini = vert_grau2_ponta(tlivre_ini); #end #if(vert_tipos[org[i]] = 3) #local pini = vert_grau3_base(tlivre_ini); #local tini = vert_grau3_ponta(tlivre_ini); #end #if(vert_tipos[org[i]] = 4) #local pini = vert_grau4_base(tlivre_ini); #local tini = vert_grau4_ponta(tlivre_ini); #end // fin #if(vert_tipos[dst[i]] = 1) #local pfin = vert_grau1_base(tlivre_fin); #local tfin = vert_grau1_ponta(tlivre_fin); #end #if(vert_tipos[dst[i]] = 2) #local pfin = vert_grau2_base(tlivre_fin); #local tfin = vert_grau2_ponta(tlivre_fin); #end #if(vert_tipos[dst[i]] = 3) #local pfin = vert_grau3_base(tlivre_fin); #local tfin = vert_grau3_ponta(tlivre_fin); #end #if(vert_tipos[dst[i]] = 4) #local pfin = vert_grau4_base(tlivre_fin); #local tfin = vert_grau4_ponta(tlivre_fin); #end #local pini = pini + coord[org[i]]; #local tini = tini + coord[org[i]]; #local pfin = pfin + coord[dst[i]]; #local tfin = tfin + coord[dst[i]]; #if (i = i) conector(na, nb, pini, tini, pfin, tfin) #end #local nt[org[i]] = nt[org[i]] - 1; #local i = i + 1; #end #end union{ #local nv = 10; #local ne = 4; #local org = array[ne] #local dst = array[ne] //-- #local org[0] = 1; #local org[1] = 2; #local org[2] = 3; #local org[3] = 4; #local dst[0] = 2; #local dst[1] = 3; #local dst[2] = 4; #local dst[3] = 1; //-- #local D = 10; #local na = 3; #local nb = 1000; gera_grafo(nv, ne, org, dst, D, na, nb) light_source { <0, 10, -3> color rgb < 200/255, 42/255, 222/255 > spotlight radius 100 falloff 30 tightness 10 point_at <0, 0, 0> } } #declare cmin = < 0, 0, 0 >; #declare cmax = < D, D, D >; #include "gaiola.inc" // object{ gaiola(cmin,cmax) } #declare centro_cena = (cmin + cmax)/2; #declare raio_cena = 0.55*vlength(cmax-cmin); #declare dist_camera = 7*raio_cena; #include "camlight.inc" #declare dir_camera = < 10.00, 5.00, 3.00 >; #declare intens_luz = 0.80; camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)