// ====================================================================== // MC937A/MO603A – Computacao Grafica - 2023-S2 // Trabalho de laboratorio 05 - 2023-09-13 // Grafo Desorientado // Parte 2 - Múltiplas interpolações // // RA108231 - Oscar dos Santos Esgalha Neto // ====================================================================== background{ color rgb < 0.7, 0.7, 0.9 > } #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 desenho_teste_interpola3_multi(pini, n, p1, p2, pfim, cor) union { #local i = 0; #while (i < n) #local centro = interpola3_multi(i, pini, n, p1, p2, pfim); object { sphere { <0, 0, 0>, 0.3 } texture{ pigment{ color rgb cor } finish{ diffuse 0.8 ambient 0.1 } } translate < centro.x, centro.y, centro.z > } #local i = i + 0.01; #end } #end #macro teste_interpola3_3n() #local pini = <0, 0, 0>; #local n = 3; #local p1 = array[n] { <1, 3, 5>, <4, 6, 2>, <7, 5, 4>, } #local p2 = array[n] { <3, 0, 3>, <5, 8, 3>, <9, 3, 1>, } #local pfim = <10, 4, 2>; #local cor = < 0.8, 0.5, 0.5 >; desenho_teste_interpola3_multi(pini, n, p1, p2, pfim, cor) #end #macro teste_interpola3_1n() #local pini = <-6, -4, -3>; #local n = 1; #local p1 = array[n] { <-5, -3, 0>, } #local p2 = array[n] { <-3, 0, -2>, } #local pfim = <-1, -1, -1>; #local cor = < 0.5, 0.8, 0.8 >; desenho_teste_interpola3_multi(pini, n, p1, p2, pfim, cor) #end // Teste para n = 1 e n = 3, identificados com cores diferentes union { object { teste_interpola3_1n() } object { teste_interpola3_3n() } } #include "camlight.inc" #declare centro_cena = < 0, 0, 3.00 >; #declare raio_cena = 15.0; #declare dir_camera = < 1, 2, 0 >; #declare dist_camera = 5*raio_cena; #declare intens_luz = 1.20; camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)