// ======================================================================
// CORES E TEXTURAS

background{ color rgb < 0.75, 0.80, 0.85 > }

#declare tx_tronco = 
  texture{
    pigment{ color rgb < 0.85, 0.50, 0.30 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare tx_certo = 
  texture{
    pigment{ color rgb < 0.15, 0.40, 0.15 > }
    finish{ diffuse 0.9 ambient 0.8 }
  }

#declare tx_erro =
  texture{
    pigment{ color rgb < 0.60, 0.1, 0.1 >}
    finish{ diffuse 0.9 ambient 0.1 }
    scale 2.0
  }


//===============================================
// Declaracoes 

#declare raio = 0.1;

#declare ponto = 
  sphere {
    <0,0,0>,raio
    texture{tx_tronco}
  }


//Macro interpola========================================================

#macro interpola (f0, v0, f1, v1, f)
  #local ss = (f-f0)/(f1-f0);
  #local rr = 1-ss;
  (rr*v0+ss*v1)
#end


#macro interpola4 (t0, v0, v1, v2, v3, t3, tt)
  
  #local v01 = interpola(t0, v0, t3, v1, tt);
  #local v12 = interpola(t0, v1, t3, v2, tt);
  #local v23 = interpola(t0, v2, t3, v3, tt);

  #local v012 = interpola (t0, v01, t3, v12, tt);
  #local v123 = interpola (t0, v12, t3, v23, tt);

  #local v0123 = interpola(t0, v012, t3, v123, tt);

  v0123

#end

//Macro Grafico==========================================================

#macro grafico (x0, y0, y1, y2, y3, x3, n)
  
  #local q = 0;
  #local num = (x3-x0)/n;

union{
  #while (q < n)
    #local xx = x0 + (q*num);  
    #local yy = interpola4 (x0, y0, y1, y2, y3, x3, xx);
    object {ponto translate <xx,yy,0>}
    #local q = q+1;
  #end
}

#end

//=======================================================================
#macro ponto_medio (v1, v2)

  #local p = (v2 + v1)/2;
  p
#end

// ======================================================================
// DESCRIÇÃO DA CENA 


#include "eixos.inc"

// Aqui está a cena, finalmente:

union{
  object { eixos(3.0) }
  
  //object {grafico (0, 3, 5, -4, 10, 15, 20)}
  
  object {grafico (0, 10, -2, 5, ponto_medio(5, -8), 5, 50)}
  object {grafico (5, ponto_medio(5, -8), -8, 9, ponto_medio(9, -3), 10, 50)}
  object {grafico (10, ponto_medio(9, -3), -3, 7, ponto_medio(7, 0), 15, 50)}
  object {grafico (15, ponto_medio(7, 0), 0, 3, -4, 20, 50)}
  
}
 
#include "camlight.inc"
#declare centro_cena = < 0.00, 0.00, 0.00 >;
#declare raio_cena = 20.0;
#declare dir_camera = < 10.00, 7.00, 4.00 >;
#declare dist_camera = 16.0;
#declare intens_luz = 1.00;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)