// Exemplo de arquivo de descricao de cena para POV-ray // Last edited on 2020-09-30 19:57:13 by jstolfi // ====================================================================== // Declarações essenciais background{ color rgb < 0.75, 0.75, 0.85 > } #declare theSeed = seed(4200); // ====================================================================== // Texturas #declare tx_tubo = texture{ pigment{ color rgb < 0.50, 0.50, 0.50 > } finish{ diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 } } #declare tx_fosca_vermelha = texture{ pigment{ color rgb < 0.70, 0.10, 0.10 > } finish{ diffuse 0.9 ambient 0.1 } } #declare tx_fosca_verde = texture{ pigment{ color rgb < 0.10, 0.70, 0.10 > } finish{ diffuse 0.9 ambient 0.1 } } #declare tx_fosca_azul = texture{ pigment{ color rgb < 0.10, 0.10, 0.70 > } finish{ diffuse 0.9 ambient 0.1 } } #declare tx_fosca_amarela = texture{ pigment{ color rgb < 0.70, 0.70, 0.10 > } finish{ diffuse 0.9 ambient 0.1 } } #declare tx_chao = texture{ pigment{ color rgb < 0.60, 0.40, 0.40 > } finish{ diffuse 0.9 ambient 0.1 } } // ====================================================================== // Formas #declare tanque1 = union{ sphere{<0,0,0.6>, 0.6 texture{tx_fosca_amarela}} cylinder{<0,0,0.6>, <0.9,0,0.6>, 0.1 texture{tx_tubo}} } #declare tanque2 = union{ sphere{<0,0,0.9>, 0.4 texture{tx_fosca_verde}} sphere{<0,0,0.4>, 0.5 texture{tx_fosca_verde}} cylinder{<0,0,0.4>, <0.7,0,0.4>, 0.1 texture{tx_tubo}} cylinder{<0,0,0.9>, <0.6,0,0.9>, 0.1 texture{tx_tubo}} } #declare tanque3 = union{ cone{<0,0,0>, 0.8, <0,0,0.3>, 0.6 texture{tx_fosca_vermelha}} cylinder{<0,0,0.3>, <0,0,1.5>, 0.6 texture{tx_fosca_vermelha}} cylinder{<-0.7,0,0.4>, <0.7,0,0.4>, 0.1 texture{tx_tubo}} cylinder{<0,0,0>, <0,0,1.8>, 0.1 texture{tx_tubo}} } #declare tanque4 = union{ cone{<0,0,0>,0.8 , <0,0,0.7>, 0.5 texture{tx_fosca_azul}} sphere{<0,0,0.7>, 0.5 texture{tx_fosca_azul}} cylinder{<-0.7,0,0.4>, <0.7,0,0.4>, 0.1 texture{tx_tubo}} cylinder{<0,-0.7,0.4>, <0,0.7,0.4>, 0.1 texture{tx_tubo}} } // ====================================================================== // Macros #macro interpola1(ta,t0,v0,t1,v1) #local fator = (ta-t0)/(t1-t0); #local valor = (fator * v1) + ((1-fator) * v0); valor #end #macro interpola2(p0,p1,num) union{ #local currentnum = num; #while(currentnum > 0) #local centro = interpola1(currentnum, 0, p0, num, p1); object{sphere{centro, 0.1} texture{tx_tubo}} #local currentnum = currentnum - 1; #end } #end #macro interpola3(ta,t0,tf,v0,v1,v2,v3) #local v01 = interpola1(ta,t0,v0,tf,v1); #local v12 = interpola1(ta,t0,v1,tf,v2); #local v23 = interpola1(ta,t0,v2,tf,v3); #local v012 = interpola1(ta,t0,v01,tf,v12); #local v123 = interpola1(ta,t0,v12,tf,v23); #local v0123 = interpola1(ta,t0,v012,tf,v123); v0123 #end #macro interpola4(p0,p1,p2,p3,num) union{ #local currentnum = num; #while(currentnum > 0) #local centro = interpola3(currentnum, 0, num, p0, p1, p2, p3); object{sphere{centro, 0.1} texture{tx_tubo}} #local currentnum = currentnum - 1; #end } #end #macro interpola3_multi(ta,tsize,p0,n,ar1,ar2,pf) #local k = int(ta); #if(k = 0) #local q0 = p0; #else #local q0 = (ar2[k-1] + ar1[k]) /2; #end #if(k = n-1) #local qf = pf; #else #local qf = (ar2[k] + ar1[k+1]) /2; #end #local pt = interpola3(ta, k, k+1,q0,ar1[k],ar2[k],qf); pt #end #macro interpola4_multi(p0,n,ar1,ar2,pf,num) union{ #local currentnum = (num*n)-1; #while(currentnum > 0) #local centro = interpola3_multi(currentnum/num, num, p0, n, ar1, ar2, pf); object{sphere{centro, 0.1} texture{tx_tubo}} #local currentnum = currentnum - 1; #end } #end #macro gera_grafo(nv, ne, org, des, D, na, nb) #local deg = array[nv]; #local vertex_pos = array[nv]; #for(i,0,nv-1) #local deg[i] = 0; #local vertex_pos[i] = ; #end #for(i,0,ne-1) #local deg[org[i]] = deg[org[i]] + 1; #local deg[des[i]] = deg[des[i]] + 1; #end #local free_deg = deg; union{ //Create objects on vertexes #for(i,0,nv-1) #if(deg[i] = 1) object{tanque1 translate vertex_pos[i]} #elseif(deg[i] = 2) object{tanque2 translate vertex_pos[i]} #elseif(deg[i] = 3) object{tanque3 translate vertex_pos[i]} #elseif(deg[i] = 4) object{tanque4 translate vertex_pos[i]} #end #end //Create connections #for(i,0,ne-1) //Build pipe positions #local array1 = array[na]; #local array2 = array[na]; #for(j,0,na-1) #local array1[j] = ; #local array2[j] = ; #end //Find pipe start #if(deg[org[i]] = 1) #local ponto_org = vertex_pos[org[i]] + <0.9,0,0.6>; //Only one available slot #elseif(deg[org[i]] = 2 & free_deg[org[i]] = 2) #local ponto_org = vertex_pos[org[i]] + <0.7,0,0.4>; #local free_deg[org[i]] = free_deg[org[i]] - 1; #elseif(deg[org[i]] = 2 & free_deg[org[i]] = 1) #local ponto_org = vertex_pos[org[i]] + <0.6,0,0.9>; #local free_deg[org[i]] = free_deg[org[i]] - 1; #elseif(deg[org[i]] = 3 & free_deg[org[i]] = 3) #local ponto_org = vertex_pos[org[i]] + <-0.7,0,0.4>; #local free_deg[org[i]] = free_deg[org[i]] - 1; #elseif(deg[org[i]] = 3 & free_deg[org[i]] = 2) #local ponto_org = vertex_pos[org[i]] + <0,0,1.8>; #local free_deg[org[i]] = free_deg[org[i]] - 1; #elseif(deg[org[i]] = 3 & free_deg[org[i]] = 1) #local ponto_org = vertex_pos[org[i]] + <0.7,0,0.4>; #local free_deg[org[i]] = free_deg[org[i]] - 1; #elseif(deg[org[i]] = 4 & free_deg[org[i]] = 4) #local ponto_org = vertex_pos[org[i]] + <0,-0.7,0.4>; #local free_deg[org[i]] = free_deg[org[i]] - 1; #elseif(deg[org[i]] = 4 & free_deg[org[i]] = 3) #local ponto_org = vertex_pos[org[i]] + <-0.7,0,0.4>; #local free_deg[org[i]] = free_deg[org[i]] - 1; #elseif(deg[org[i]] = 4 & free_deg[org[i]] = 2) #local ponto_org = vertex_pos[org[i]] + <0.7,0,0.4>; #local free_deg[org[i]] = free_deg[org[i]] - 1; #elseif(deg[org[i]] = 4 & free_deg[org[i]] = 1) #local ponto_org = vertex_pos[org[i]] + <0,0.7,0.4>; #local free_deg[org[i]] = free_deg[org[i]] - 1; #end //Find pipe end #if(deg[des[i]] = 1) #local ponto_des = vertex_pos[des[i]] + <0.9,0,0.6>; //Only one available slot #elseif(deg[des[i]] = 2 & free_deg[des[i]] = 2) #local ponto_des = vertex_pos[des[i]] + <0.7,0,0.4>; #local free_deg[des[i]] = free_deg[des[i]] - 1; #elseif(deg[des[i]] = 2 & free_deg[des[i]] = 1) #local ponto_des = vertex_pos[des[i]] + <0.6,0,0.9>; #local free_deg[des[i]] = free_deg[des[i]] - 1; #elseif(deg[des[i]] = 3 & free_deg[des[i]] = 3) #local ponto_des = vertex_pos[des[i]] + <-0.7,0,0.4>; #local free_deg[des[i]] = free_deg[des[i]] - 1; #elseif(deg[des[i]] = 3 & free_deg[des[i]] = 2) #local ponto_des = vertex_pos[des[i]] + <0,0,1.8>; #local free_deg[des[i]] = free_deg[des[i]] - 1; #elseif(deg[des[i]] = 3 & free_deg[des[i]] = 1) #local ponto_des = vertex_pos[des[i]] + <0.7,0,0.4>; #local free_deg[des[i]] = free_deg[des[i]] - 1; #elseif(deg[des[i]] = 4 & free_deg[des[i]] = 4) #local ponto_des = vertex_pos[des[i]] + <0,-0.7,0.4>; #local free_deg[des[i]] = free_deg[des[i]] - 1; #elseif(deg[des[i]] = 4 & free_deg[des[i]] = 3) #local ponto_des = vertex_pos[des[i]] + <-0.7,0,0.4>; #local free_deg[des[i]] = free_deg[des[i]] - 1; #elseif(deg[des[i]] = 4 & free_deg[des[i]] = 2) #local ponto_des = vertex_pos[des[i]] + <0.7,0,0.4>; #local free_deg[des[i]] = free_deg[des[i]] - 1; #elseif(deg[des[i]] = 4 & free_deg[des[i]] = 1) #local ponto_des = vertex_pos[des[i]] + <0,0.7,0.4>; #local free_deg[des[i]] = free_deg[des[i]] - 1; #end object{interpola4_multi(ponto_org,na,array1,array2,ponto_des,nb)} #end } #end // ====================================================================== //Render #declare origens = array[6]{4, 2, 2, 1, 3, 1} #declare destins = array[6]{1, 3, 0, 2, 2, 0} object{gera_grafo(5,6,origens,destins,20,3,1000)} object{box{<-100,-100,-1>,<100,100,0>} texture{tx_chao}} #include "camlight.inc" #declare centro_cena = < 10.00, 10.00, 1.00 >; #declare raio_cena = 20.0; #declare dir_camera = < 10.00, 10.00, 10.00 >; #declare dist_camera = 5*raio_cena; #declare intens_luz = 1.20; camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)