// Last edited on 2023-12-23 02:14:11 by stolfi #include "camlight.inc" #include "eixos.inc" #include "textures.inc" #include "objs.inc" // ====================================================================== // DESCRICAO DA CENA #declare raio = 1.000; #declare PI = 3.14159; #declare space = 2.000; /////////////// INTERPOLA //////////////////// #macro interpola(ti, t0, v0, t1, v1) #local ss = (ti - t0)/(t1 - t0); #local vv = ((1 - ss) * v0) + (ss * v1); vv #end #macro interpola3(ti, ta, tb, v0, v1, v2, v3) #local v01 = interpola(ti, ta, v0, tb, v1); #local v02 = interpola(ti, ta, v1, tb, v2); #local v03 = interpola(ti, ta, v2, tb, v3); #local v012 = interpola(ti, ta, v01, tb, v02); #local v123 = interpola(ti, ta, v02, tb, v03); #local v0123 = interpola(ti, ta, v012, tb, v123); v0123 #end #macro interpola3_multi(ti, n, p0, P1, P2, pf) #local k = int(ti); #local q0 = p0; #local q3 = pf; #local q1 = P1[k]; #local q2 = P2[k]; #if(k > 0) #local q0 = (P2[k - 1] + P1[k]) / 2; #end #if(k < n - 1) #local q3 = (P2[k] + P1[k + 1]) / 2; #end // definir q0, q1, q2, q3 #local pt = interpola3(ti, k, k + 1, q0, q1, q2, q3); pt #end #macro interpola_multi(n, p0, P1, P2, p3, qtde, raio) union { #local k = 0; #while(k < n) #local centro = interpola3_multi(k, n, p0, P1, P2, p3); sphere{ centro, raio texture{ tx_branca } } #local k = k + n / qtde; #end } #end #declare tanks = array[4] { tank_0, tank_1, tank_2, tank_3 } #declare tocos = array[5] { toco_1, toco_2, toco_3, toco_4, toco_5 } #declare pos_toco = array[5] { < 0, 1.5, 0.50 >, < 1.5, 0, 0.50 >, < 0, -1.5, 0.50 >, < -1.5, 0, 0.50 >, < 0, 0, 0.50 > } #macro posiciona_vertices(verts, edges, orig, dest, pos_tocos) #local raSeed = seed(220792); #local spac = 2 * PI / verts; #local rad = 10 / spac; #local idx_pos_tocos = 0; #for (i,0,verts - 1) #local tx = sin(i * spac) * rad; #local ty = cos(i * spac) * rad; #local k = 0; #for (j,0,edges - 1) #if ((orig[j] = i) | (dest[j] = i)) #local k = k + 1; #end #end object { tanks[k - 1] translate < tx, ty > } // begin tocos #local rnd_toco = rand(raSeed) * 5; #for (j,0, k - 1) #local idx = mod(rnd_toco + j, 5); object { tocos[idx] translate } #local pos_tocos[i][j] = pos_toco[idx] + ; #local idx_pos_tocos = idx_pos_tocos + 1; #end // end tocos #end #end #macro posiciona_arestas(verts, edges, orig, dest, pos_tocos) #local arseed = seed(1); // #local used_tocos = array[9] {0, 0, 0, 0, 0, 0, 0, 0, 0}; #local spac = 2 * PI / verts; #local rad = 10 / spac; #local idx_pos_tocos = 0; #for (i,0,verts - 1) #for (j,0,edges - 1) #if (orig[j] = i) #local tx_o = sin(i * spac) * rad; #local ty_o = cos(i * spac) * rad; #local tx_d = sin(dest[j] * spac) * rad; #local ty_d = cos(dest[j] * spac) * rad; #local p0 = < tx_o, ty_o, 1.0 >; #local p1 = < tx_o, ty_o, 2.0 >; #local p2 = < tx_o * rand(arseed), ty_o * rand(arseed), 1 >; #local p3 = < tx_d * rand(arseed), ty_d * rand(arseed), -1 >; #local p4 = < tx_d, ty_d, -2.0 >; #local p5 = < tx_d, ty_d, 1.0 >; #local P1 = array[4] { p1, p2, p3, p4 } #local P2 = array[4] { p1, p2, p3, p4 } interpola_multi(4, p0, P1, P2, p5, 500, 0.1) // #local tx_o = pos_tocos[i][used_tocos[i]].x; // #local ty_o = pos_tocos[i][used_tocos[i]].y; // #local tx_d = pos_tocos[j][used_tocos[j]].x; // #local ty_d = pos_tocos[j][used_tocos[j]].y; // #local p0 = pos_tocos[i][used_tocos[i]]; // #local p1 = pos_tocos[j][used_tocos[j]]; // #local p2 = < tx_o * rand(arseed), ty_o * rand(arseed), 1 >; // #local p3 = < tx_d * rand(arseed), ty_d * rand(arseed), -1 >; // #local p4 = < tx_d, ty_d, -2.0 >; // #local p5 = < tx_d, ty_d, 1.0 >; // #local P1 = array[4] { p1, p2, p3, p4 } // #local P2 = array[4] { p1, p2, p3, p4 } // interpola_multi(4, p0, P1, P2, p5, 300, 0.1) // #local used_tocos[i] = used_tocos[i] + 1; // #local used_tocos[j] = used_tocos[j] + 1; #end #end #end #end // Partes da cena: #declare orig = array[9] { 0, 1, 1, 2, 2, 3, 4, 5, 6 } #declare dest = array[9] { 3, 6, 3, 4, 3, 5, 1, 6, 2 } #declare pos_tocos = array[9][4] { {<0, 0, 0>, <0, 0, 0>, <0, 0, 0>, <0, 0, 0>}, {<0, 0, 0>, <0, 0, 0>, <0, 0, 0>, <0, 0, 0>}, {<0, 0, 0>, <0, 0, 0>, <0, 0, 0>, <0, 0, 0>}, {<0, 0, 0>, <0, 0, 0>, <0, 0, 0>, <0, 0, 0>}, {<0, 0, 0>, <0, 0, 0>, <0, 0, 0>, <0, 0, 0>}, {<0, 0, 0>, <0, 0, 0>, <0, 0, 0>, <0, 0, 0>}, {<0, 0, 0>, <0, 0, 0>, <0, 0, 0>, <0, 0, 0>}, {<0, 0, 0>, <0, 0, 0>, <0, 0, 0>, <0, 0, 0>}, {<0, 0, 0>, <0, 0, 0>, <0, 0, 0>, <0, 0, 0>} }; posiciona_vertices(7, 9, orig, dest, pos_tocos) posiciona_arestas(7, 9, orig, dest, pos_tocos) // #declare chao = box{ <-50,-50,-1>, <+50,+50,0> } // object{ chao translate < -50,-50,-50 > texture{ tx_xadrez } } #declare centro_cena = < 0.00, 0.00, 0.00 >; #declare raio_cena = 20.0; #declare dir_camera = < -45.00, 45.00, 45.00 >; #declare dist_camera = 5*raio_cena; #declare intens_luz = 1.0; camlight(centro_cena, raio_cena, dir_camera, dist_camera, z, intens_luz)