// Last edited on 2023-12-23 18:40:02 by stolfi background{ color rgb < 0.78, 0.80, 0.82 > } #declare tx_cano = texture{ pigment{ color rgb < 0.90, 0.60, 0.40 > } finish{ diffuse 0.8 ambient 0.2 } } #declare tx_aresta = texture{ pigment{ color rgb < 0.20, 0.70, 0.40 > } finish{ diffuse 0.8 ambient 0.2 } } #declare tx_estranha = texture{ pigment{ color rgb < 1.00, 0.20, 0.20 > } finish{ diffuse 0.8 ambient 0.2 } } #declare tx_azul = texture{ pigment{ color rgb < 0.10, 0.80, 1.00 > } finish{ diffuse 0.8 ambient 0.2 } } #declare tx_rosa = texture{ pigment{ color rgb < 0.70, 0.10, 0.30 > } finish{ diffuse 0.8 ambient 0.2 } } #declare tx_xadrez = texture { pigment { checker color rgb <1, 0, 0>, color rgb <0, 1, 0> scale 1 } finish { ambient 0.2 diffuse 0.8 } } #declare hcano = 3; #macro tanque1(xx,yy,zz) union{ object{ sphere { + <0,0,0>, 5 } texture{ tx_estranha } } object{ cylinder{ + <0,0,5>, + <0,0,5+hcano>, 0.5 texture{ tx_cano } } } } #end #macro tanque2(xx,yy,zz) union{ object{ cylinder{ + <0,0,0>, + <0,0,7>, 4 texture{ tx_xadrez } } } object{ cone{ + <0,0,7>, 4 + <0,0,10>, 2 texture{ tx_xadrez } } } object{ cylinder{ + <0,4,4>, + <0,4+hcano,4>, 0.5 texture{ tx_cano } } } object{ cylinder{ + <0,0,10>, + <0,0,10+hcano>, 0.5 texture{ tx_cano } } } } #end #macro tanque3(xx,yy,zz) union{ object{ cylinder{ + <0,0,0>, + <0,0,10>, 4 texture{ tx_rosa } } } object{ sphere { + <0,0,10>, 4 } texture{ tx_rosa } } object{ cylinder{ + <0,4,4>, + <0,4+hcano,4>, 0.5 texture{ tx_cano } } } object{ cylinder{ + <4,0,4>, + <4+hcano,0,4>, 0.5 texture{ tx_cano } } } object{ cylinder{ + <-4,0,4>, + <-4-hcano,0,4>, 0.5 texture{ tx_cano } } } } #end #macro tanque4(xx,yy,zz) union{ object{ cylinder{ + <0,0,0>, + <0,0,7>, 8 texture{ tx_azul } } } object{ cylinder{ + <0,0,7>, + <0,0,12>, 6 texture{ tx_azul } } } object{ cylinder{ + <0,8,4>, + <0,8+hcano,4>, 0.5 texture{ tx_cano } } } object{ cylinder{ + <0,-8,4>, + <0,-8-hcano,4>, 0.5 texture{ tx_cano } } } object{ cylinder{ + <8,0,4>, + <8+hcano,0,4>, 0.5 texture{ tx_cano } } } object{ cylinder{ + <1,2,12>, + <1,2,12+hcano>, 0.5 texture{ tx_cano } } } } #end // ------------------- Constantes utilizadas --------------------------- #declare na = 3; #declare nb = 1000; #declare nTotalTanques = 15; #declare aleatorio1 = seed(1345); #declare aleatorio2 = seed(23424); #declare NMAX = 10000; #declare arrayDeNos = array[NMAX]; #declare arrayDeGraus = array[NMAX]; #macro interpola1(tt,tt0,v0,tt1,v1) #local ss = (tt - tt0) / (tt1 - tt0); #local vv = (1 - ss) * v0 + ss * v1; vv #end #macro interpola3(tt, tta, ttb, v0, v1, v2, v3) #local v01 = interpola1(tt,tta,v0,ttb,v1); #local v12 = interpola1(tt,tta,v1,ttb,v2); #local v23 = interpola1(tt,tta,v2,ttb,v3); #local v012 = interpola1(tt,tta,v01,ttb,v12); #local v123 = interpola1(tt,tta,v12,ttb,v23); #local v0123 = interpola1(tt,tta,v012,ttb,v123); v0123 #end #macro interpola3_multi(tt, n, pInit, P1, P2, pFim) #local raio = 0.5; #local k = int(tt); #local Q0 = pInit; #local Q2 = pFim; #if (k > 0) #local Q0 = (P1[k] + P2[k - 1]) / 2; #end #if (k < n - 1) #local Q2 = (P1[k + 1] + P2[k]) / 2; #end #local c = interpola3(tt, k, k + 1, Q0, P1[k], P2[k], Q2); object{ sphere {c, raio} texture{ tx_aresta } } #end #macro terminaisGrau1(index) #local posicaoTerminais = array[1] #local posicaoTerminais[0] = arrayDeNos[index] + <0,0,5.5>; posicaoTerminais #end #macro terminaisGrau2(index) #local posicaoTerminais = array[2] #local posicaoTerminais[0] = arrayDeNos[index] + <0,5,3.5>; #local posicaoTerminais[1] = arrayDeNos[index] + <0,0,10.5>; posicaoTerminais #end #macro terminaisGrau3(index) #local posicaoTerminais = array[3] #local posicaoTerminais[0] = arrayDeNos[index] + <0,5,3.5>; #local posicaoTerminais[1] = arrayDeNos[index] + <5,0,3.5>; #local posicaoTerminais[2] = arrayDeNos[index] + <-5,0,3.5>; posicaoTerminais #end #macro terminaisGrau4(index) #local posicaoTerminais = array[4] #local posicaoTerminais[0] = arrayDeNos[index] + <0,9,3.5>; #local posicaoTerminais[1] = arrayDeNos[index] + <0,-9,3.5>; #local posicaoTerminais[2] = arrayDeNos[index] + <9,0,3.5>; #local posicaoTerminais[3] = arrayDeNos[index] + <1,2,12.5>; posicaoTerminais #end #macro geraTanques(nn, D) union { #local kk = 0; #while(kk < nn) #local xx = rand(aleatorio1) * D; #local yy = rand(aleatorio2) * D; #local zz = rand(aleatorio1) * D; #if(rand(aleatorio2) > 0.5) #local xx = xx * -1; #end #if(rand(aleatorio1) < 0.5) #local yy = yy * -1; #end #if(rand(aleatorio2) < 0.5) #local zz = zz * -1; #end #local tanqueEscolhido = rand(aleatorio1) * 4; #debug concat("!!", str(kk,0,0), " ", str(xx/D,0,3), " ", str(yy/D,0,3), " ", str(zz/D,0,3), " ", str(tanqueEscolhido,0,3), "\n") #if(tanqueEscolhido < 1) object { tanque1(xx,yy,zz) } #declare arrayDeNos[kk] = ; #declare arrayDeGraus[kk] = 1; #else #if(tanqueEscolhido < 2) object { tanque2(xx,yy,zz) } #declare arrayDeNos[kk] = ; #declare arrayDeGraus[kk] = 2; #else #if(tanqueEscolhido < 3) object { tanque3(xx,yy,zz) } #declare arrayDeNos[kk] = ; #declare arrayDeGraus[kk] = 3; #else object { tanque4(xx,yy,zz) } #declare arrayDeNos[kk] = ; #declare arrayDeGraus[kk] = 4; #end #end #end #local kk = kk + 1; #end } #end #macro conector(na,nb,pini,pfim,D) union{ #declare P1 = array[na]; #declare P2 = array[na]; #local k = 0; #while (k < na) #local newP1X = int(rand(aleatorio1) * D); #local newP1Y = int(rand(aleatorio1) * D); #local newP1Z = int(rand(aleatorio1) * D); #local newP2X = int(rand(aleatorio2) * D); #local newP2Y = int(rand(aleatorio2) * D); #local newP2Z = int(rand(aleatorio2) * D); #if(rand(aleatorio1) < 0.5) #local newP1X = newP1X * -1; #local newP2Y = newP2Y * -1; #end #if(rand(aleatorio1) > 0.5) #local newP1Y = newP1Y * -1; #local newP2Z = newP2Z * -1; #end #if(rand(aleatorio2) < 0.5) #local newP1Z = newP1Z * -1; #local newP2X = newP2X * -1; #end #declare P1[k] = ; #declare P2[k] = ; #local k = k + 1; #end #local tt = 0; #while (tt < na) object { interpola3_multi(tt, na, pini, P1, P2, pfim) } #local tt = tt + 1/nb; #end } #end #macro achaConectores(posicaoNo, grauNo) #if(grauNo = 1) #local posicaoConector = terminaisGrau1(posicaoNo); #else #if(grauNo = 2) #local posicaoConector = terminaisGrau2(posicaoNo); #else #if(grauNo = 3) #local posicaoConector = terminaisGrau3(posicaoNo); #else #local posicaoConector = terminaisGrau4(posicaoNo); #end #end #end posicaoConector #end #macro geraGrafo(nv, ne, org, dst, D, na, nb) union{ #local kk = 0; #while(kk < ne) #local posInicial = org[kk]; #local posDestino = dst[kk]; #local noInicial = arrayDeNos[posInicial]; #local grauNoInicial = arrayDeGraus[posInicial]; #local noDestino = arrayDeNos[posDestino]; #local grauNoDestino = arrayDeGraus[posDestino]; #if(grauNoInicial > 0 & grauNoDestino > 0) #local conectoresIniciais = achaConectores(posInicial, grauNoInicial); #local conectoresDestinos = achaConectores(posDestino, grauNoDestino); #local conectorInicial = conectoresIniciais[grauNoInicial - 1]; #local conectorFinal = conectoresDestinos[grauNoDestino - 1]; #if ((posInicial = posInicial) | (posDestino = 1)) object{ conector(na,nb,conectorInicial,conectorFinal,D) } #end #local arrayDeGraus[posInicial] = arrayDeGraus[posInicial] - 1; #local arrayDeGraus[posDestino] = arrayDeGraus[posDestino] - 1; #end #local kk = kk + 1; #end } #end #include "eixos.inc" #declare D = 70; #declare na = 4; #declare nb = 400; #declare ne = 8; #declare org = array[ne]; #declare dst = array[ne]; #declare org[0] = 1; #declare dst[0] = 2; #declare org[1] = 3; #declare dst[1] = 4; #declare org[2] = 5; #declare dst[2] = 6; #declare org[3] = 7; #declare dst[3] = 8; #declare org[4] = 9; #declare dst[4] = 10; #declare org[5] = 1; #declare dst[5] = 4; #declare org[6] = 1; #declare dst[6] = 7; #declare org[7] = 2; #declare dst[7] = 8; union { // object{ eixos(D+3) } object{ geraTanques(nTotalTanques, D) } object{ geraGrafo(nTotalTanques, ne, org, dst, D, na, nb) } } #declare cmin = -D * < 1,1,1 >; #declare cmax = +D * < 1,1,1 >; #include "gaiola.inc" // object{ gaiola(cmin,cmax) } #declare centro_cena = (cmin + cmax)/2; #declare raio_cena = 0.55*vlength(cmax-cmin); // #declare centro_cena = D*< 0.111, 0.830, -0.616 >; // #declare raio_cena = 0.20*vlength(cmax-cmin); #declare dist_camera = 7*raio_cena; #include "camlight.inc" #declare dir_camera = < 7, 5, 4 >; #declare intens_luz = 1.20; camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)