// ====================================================================== // MC937A/MO603A – Computacao Grafica - 2023-S2 // Trabalho de laboratorio 06 - 2023-09-20 // Grafo Desorientado III // // RA108231 - Oscar dos Santos Esgalha Neto // ====================================================================== background{ color rgb < 0.7, 0.7, 0.9 > } #declare roleta = seed(42); #declare tcano = cylinder{ < 0.00, 0.00, 0.00 >, < 0.00, 0.00, 1.0 >, 0.2 texture{ pigment{ color rgb < 0.8, 0.8, 0.8 > } finish{ diffuse 0.8 ambient 0.1 } } } #macro vertice1(xx, yy, zz) #local tq = union { sphere { <0, 0, 0>, 1 } texture{ pigment{ color rgb < 0.8, 0.5, 0.5 > } finish{ diffuse 0.8 ambient 0.1 } } translate < xx, yy, zz > } tq #end #macro vertice1_base(xx, yy, zz, j) < xx + 1, yy, zz > #end #macro vertice1_ponta(xx, yy, zz, j) < xx + 1, yy, zz + 0.2 > #end #macro vertice2(xx, yy, zz) #local tq = union { cylinder{ < 0.00, 0.00, 0.00 >, < 0.00, 0.00, 4.0 >, 1 } cone{ < 0, 0, 4 >, 0.8, < 0, 0, 5.5 >, 0.2 } texture{ pigment{ color rgb < 0.8, 0.2, 0.2 > } finish{ diffuse 0.8 ambient 0.1 } } translate < xx, yy, zz > } tq #end #macro vertice2_base(xx, yy, zz, j) #if (j = 0) #local base = < xx+1, yy, zz + 2.7 >; #end #if (j = 1) #local base = < xx-2, yy, zz + 2.7 >; #end base #end #macro vertice2_ponta(xx, yy, zz, j) #if (j = 0) #local ponta = < xx+2, yy, zz + 2.7 >; #end #if (j = 1) #local ponta = < xx-3, yy, zz + 2.7 >; #end ponta #end #macro vertice3(xx, yy, zz) #local tq = union { cone{ < 0, 0, 0 >, 1, < 0, 0, 1 >, 0.5 } cylinder{ < 0.00, 0.00, 1 >, < 0.00, 0.00, 3.0 >, 0.5 } cone{ < 0, 0, 3 >, 0.5, < 0, 0, 4 >, 1 } texture{ pigment{ color rgb < 0.5, 0.8, 0.5 > } finish{ diffuse 0.8 ambient 0.1 } } translate < xx, yy, zz > } tq #end #macro vertice3_base(xx, yy, zz, j) #if (j = 0) #local base = < xx + cos(radians(120)), yy + sin(radians(120)), zz + 2 >; #elseif (j = 1) #local base = < xx + cos(radians(240)), yy + sin(radians(240)), zz + 2 >; #elseif (j = 2) #local base = < xx + 1, yy, zz + 2 >; #end base #end #macro vertice3_ponta(xx, yy, zz, j) #if (j = 0) #local ponta = < xx + 2*cos(radians(120)), yy + 2*sin(radians(120)), zz + 2 >; #end #if (j = 1) #local ponta = < xx + 2*cos(radians(240)), yy + 2*sin(radians(240)), zz + 2 >; #end #if (j = 2) #local ponta = < xx + 2, yy, zz + 2 >; #end ponta #end #macro vertice4(xx, yy, zz) #local tq = union { box{ <0,0,0>, <1,3,1> } box{ <2,0,0>, <3,3,1> } box{ <1,0.6,0.3>, <2,1,0.6> } box{ <1,1.8,0.3>, <2,2.2,0.6> } texture{ pigment{ color rgb < 0.8, 0.8, 0.2 > } finish{ diffuse 0.8 ambient 0.1 } } translate < xx, yy, zz > } tq #end #macro vertice4_base(xx, yy, zz, j) #if (j = 0) #local base = < xx+0.5, yy+3, zz + 0.2 >; #end #if (j = 1) #local base = < xx+2.5, yy+3, zz + 0.2 >; #end #if (j = 2) #local base = < xx+0.5, yy-1, zz + 0.2 >; #end #if (j = 3) #local base = < xx+2.5, yy-1, zz + 0.2 >; #end base #end #macro vertice4_ponta(xx, yy, zz, j) #if (j = 0) #local ponta = < xx+1.5, yy+3, zz + 0.2 >; #end #if (j = 1) #local ponta = < xx+3.5, yy+3, zz + 0.2 >; #end #if (j = 2) #local ponta = < xx+1.5, yy-1, zz + 0.2 >; #end #if (j = 3) #local ponta = < xx+3.5, yy-1, zz + 0.2 >; #end ponta #end #macro interpola1(tt, t0, v0, t1, v1) #local ss = (tt - t0) / (t1 - t0); #local vv = (1 - ss) * v0 + ss * v1; vv #end #macro interpola3(tt, ta, tb, v0, v1, v2, v3) #local v01 = interpola1(tt, ta, v0, tb, v1); #local v12 = interpola1(tt, ta, v1, tb, v2); #local v23 = interpola1(tt, ta, v2, tb, v3); #local v012 = interpola1(tt, ta, v01, tb, v12); #local v123 = interpola1(tt, ta, v12, tb, v23); #local v0123 = interpola1(tt, ta, v012, tb, v123); v0123 #end // tt = passo // pini = ponto inicial // n = tamanho das arrays p1 e p2, quantidade de curvas unidas // p1 = array com o segundo ponto de cada curva de bezier // p2 = array com o terceiro ponto de cada curva de bezier // pfim = último ponto // #macro interpola3_multi(tt, pini, n, p1, p2, pfim) #local k = int(tt); #if (k = 0) #local q0 = pini; #else #local q0 = (p1[k] + p2[k-1]) / 2; #end #if (k = n - 1) #local q3 = pfim; #else #local q3 = (p1[k+1] + p2[k]) / 2; #end #local q1 = p1[k]; #local q2 = p2[k]; interpola3(tt, k, k+1, q0, q1, q2, q3) #end #macro conetor(na, nb, pini, tini, pfin, tfin, D) #local p1 = array[na]; #local p2 = array[na]; #local p1[0] = pfin; #local p2[na - 1] = tfin; #local i = 1; // pula o p1[0] #while (i < na) #local xi = int(D*rand(roleta)); #local yi = int(D*rand(roleta)); #local zi = int(D*rand(roleta)); #local p1[i] = ; #local i = i + 1; #end #local i = 0; #while (i < na - 1) // ate p2[na - 2] #local xi = int(D*rand(roleta)); #local yi = int(D*rand(roleta)); #local zi = int(D*rand(roleta)); #local p2[i] = ; #local i = i + 1; #end #local inc = na / nb; union { #local i = 0; #while (i < na) #local centro = interpola3_multi(i, pini, na, p1, p2, pfin); object { sphere { <0, 0, 0>, 0.3 } texture{ pigment{ color rgb < 0.6, 0.6, 0.6 > } finish{ diffuse 0.8 ambient 0.1 } } translate < centro.x, centro.y, centro.z > } #local i = i + inc; #end } #end #macro gera_grafo(nv, ne, org, dst, D, na, nb) #local deg = array[nv]; // Calcular grau dos vertices #local i = 0; #while (i < nv) #local deg[i] = 0; #local i = i + 1; #end #local i = 0; #while (i < ne) #local ov = org[i]; #local dv = dst[i]; #local deg[ov] = deg[ov] + 1; #local deg[dv] = deg[dv] + 1; #local i = i + 1; #end // Calcular posicoes dos vertices #local posicoes = array[nv]; #local i = 0; #while (i < nv) #local xi = int(D*rand(roleta)); #local yi = int(D*rand(roleta)); #local zi = int(D*rand(roleta)); #local posicoes[i] = ; #local i = i + 1; #end union { // Desenhar vertices #local i = 0; #while (i < nv) #if (deg[i] = 1) object { vertice1(posicoes[i].x, posicoes[i].y, posicoes[i].z) } #end #if (deg[i] = 2) object { vertice2(posicoes[i].x, posicoes[i].y, posicoes[i].z) } #end #if (deg[i] = 3) object { vertice3(posicoes[i].x, posicoes[i].y, posicoes[i].z) } #end #if (deg[i] = 4) object { vertice4(posicoes[i].x, posicoes[i].y, posicoes[i].z) } #end #local i = i + 1; #end // Desenhar arestas #local i = 0; #while (i < ne) #local ov = org[i]; #if (deg[ov] = 1) #local pini = vertice1_base(posicoes[ov].x, posicoes[ov].y, posicoes[ov].z, deg[ov] - 1); #local pfin = vertice1_ponta(posicoes[ov].x, posicoes[ov].y, posicoes[ov].z, deg[ov] - 1); #elseif (deg[ov] = 2) #local pini = vertice2_base(posicoes[ov].x, posicoes[ov].y, posicoes[ov].z, deg[ov] - 1); #local pfin = vertice2_ponta(posicoes[ov].x, posicoes[ov].y, posicoes[ov].z, deg[ov] - 1); #elseif (deg[ov] = 3) #local pini = vertice3_base(posicoes[ov].x, posicoes[ov].y, posicoes[ov].z, deg[ov] - 1); #local pfin = vertice3_ponta(posicoes[ov].x, posicoes[ov].y, posicoes[ov].z, deg[ov] - 1); #elseif (deg[ov] = 4) #local pini = vertice4_base(posicoes[ov].x, posicoes[ov].y, posicoes[ov].z, deg[ov] - 1); #local pfin = vertice4_ponta(posicoes[ov].x, posicoes[ov].y, posicoes[ov].z, deg[ov] - 1); #end #local deg[ov] = deg[ov] - 1; #local dv = dst[i]; #if (deg[dv] = 1) #local tini = vertice1_base(posicoes[dv].x, posicoes[dv].y, posicoes[dv].z, deg[dv] - 1); #local tfin = vertice1_ponta(posicoes[dv].x, posicoes[dv].y, posicoes[dv].z, deg[dv] - 1); #elseif (deg[dv] = 2) #local tini = vertice2_base(posicoes[dv].x, posicoes[dv].y, posicoes[dv].z, deg[dv] - 1); #local tfin = vertice2_ponta(posicoes[dv].x, posicoes[dv].y, posicoes[dv].z, deg[dv] - 1); #elseif (deg[dv] = 3) #local tini = vertice3_base(posicoes[dv].x, posicoes[dv].y, posicoes[dv].z, deg[dv] - 1); #local tfin = vertice3_ponta(posicoes[dv].x, posicoes[dv].y, posicoes[dv].z, deg[dv] - 1); #elseif (deg[dv] = 4) #local tini = vertice4_base(posicoes[dv].x, posicoes[dv].y, posicoes[dv].z, deg[dv] - 1); #local tfin = vertice4_ponta(posicoes[dv].x, posicoes[dv].y, posicoes[dv].z, deg[dv] - 1); #end #local deg[dv] = deg[dv] - 1; conetor(na, nb, pini, tini, pfin, tfin, D) #local i = i + 1; #end } #end #macro testa_gera_grafo() #local nv = 4; #local ne = 6; #local org = array[ne] { 0, 2, 2, 3, 1, 3 } #local dst = array[ne] { 2, 0, 1, 0, 3, 3 } #local d = 30; #local na = 4; #local nb = 100; gera_grafo(nv, ne, org, dst, d, na, nb) #end object { testa_gera_grafo() } #include "camlight.inc" #declare centro_cena = < 0, 0, 3.00 >; #declare raio_cena = 40.0; #declare dir_camera = < 1, 2, 2 >; #declare dist_camera = 5*raio_cena; #declare intens_luz = 1.20; camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)