// Last edited on DATE TIME by USER
// Processed by remove-cam-lights

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

#declare tx_plastico =
  texture{
    pigment{ color rgb < 0.10, 0.80, 1.00 > }
    finish{ diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 }
  }

#declare tx_vermelho =
  texture{
    pigment{ color rgb < 0.80, 0.10, 0.10 > }
    finish{ diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 }
  }

#declare tx_pink =
  texture{
    pigment{ color rgb < 0.98, 0.05, 0.75 > }
    finish{ diffuse 0.8 ambient 0.2 specular 0.5 roughness 0.005 }
  }

#declare tx_orange =
  texture{
    pigment{ color rgb < 0.98, 0.20, 0.20 > }
    finish{ diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.05 }
  }

#declare tx_verde =
  texture{
    pigment{ color rgb < 0.20, 0.90, 0.10 > }
    finish{ diffuse 0.8 ambient 0.1 specular 0.5 roughness 0.005 }
  }

#declare tx_fosca =
  texture{
    pigment{ color rgb < 1.00, 0.80, 0.10 > }
    finish{ diffuse 0.9 ambient 0.1 }
  }

#declare tx_xadrez =
  texture{
    pigment{ checker color rgb < 0.00, 0.0, 0.00 >, color rgb < 1.00, 0.97, 0.90 > }
    finish{ diffuse 0.9 ambient 0.1 }
    scale 1.0
  }

#declare bola =
  union {
          sphere{ < 0,0,2 >, 0.70
          texture{ tx_verde }
          }
  }

#include "eixos.inc"

#macro interpola1matriz(P,Q,N,c0,c1,cc,R)
        #local i=0;
        #while(i<N)
                #local k=0;
                #while(k<4)
                        #declare R[i][k]=interpolalin(c0, P[i][k], c1, Q[i][k], cc);
                        #local k=k+1;
                #end
                #local i=i+1;
        #end
#end

#macro interpola1matriz2(P,N,c0,c1,cc,R,k0,k1)
        #local i=0;
        #while(i<N)
                #local k=0;
                #while(k<4)
                        #declare R[i][k]=interpolalin(c0, P[k0][i][k], c1, P[k1][i][k], cc);
                        #local k=k+1;
                #end
                #local i=i+1;
        #end
#end

#macro noh(P,N,M)
        union{
                #local t0=0;
                #local t1=M;
                #local i=0;
                #while(i<N)
                        #local tt=t0;
                        #while(tt<t1)
                                object{ bola translate arcobezier(t0,t1,P[i][0],P[i][1],P[i][2],P[i][3],tt)}
                                #local tt = tt+1;
                        #end
                        #local i=i+1;
                #end

        }
#end

#macro busca_tempo(clk, NK, tk)
        #for(i,0,NK-2,1)
                #if((tk[i]<=clk) & (clk<tk[i+1]))
                        #local kk=i;
                #end
        #end
        kk
#end

#macro interpolalin(t0, v0, t1, v1, tt)
        #local r=(tt-t0)/(t1-t0);
        #local s=1-r;
        #local vv=s*v0+r*v1;
        vv
#end

#macro arcobezier(t0,t1,A,B,C,D,tt)
        #local AB=interpolalin(t0,A,t1,B,tt);
        #local BC=interpolalin(t0,B,t1,C,tt);
        #local CD=interpolalin(t0,C,t1,D,tt);

        #local ABC=interpolalin(t0,AB,t1,BC,tt);
        #local BCD=interpolalin(t0,BC,t1,CD,tt);

        #local ABCD=interpolalin(t0,ABC,t1,BCD,tt);
        ABCD
#end

#macro suavizaZ(P,N,i,vv)

        #local j = mod(i+1, N);

        #declare P[i][2] = P[i][3] - vv;
        #declare P[j][1] = P[j][0] + vv;

#end

#macro suavizaX(P,N,i)

        #local j = mod(i+1, N);
        #local vv = (P[j][1] - P[i][2]) / 2;
        suavizaZ(P,N,i,vv)

#end

#macro palito()
        union{
                #declare t0=0.00;
                #declare t1=0.40;

                #declare v0=<0,0,0>;
                #declare v1=<0,10,0>;
                #declare tt=t0;
                #while(tt<t1)
                        object{ bola translate interpolalin(t0,v0,t1,v1,tt)}
                        #declare tt = tt+0.01;
                #end

                #declare v0=<0,10,0>;
                #declare v1=<0,10,10>;
                #declare tt=t0;
                #while(tt<t1)
                        object{ bola translate interpolalin(t0,v0,t1,v1,tt)}
                        #declare tt = tt+0.01;
                #end

                #declare v0=<0,10,10>;
                #declare v1=<0,0,10>;
                #declare tt=t0;
                #while(tt<t1)
                        object{ bola translate interpolalin(t0,v0,t1,v1,tt)}
                        #declare tt = tt+0.01;
                #end

                #declare v0=<0,0,10>;
                #declare v1=<0,0,0>;
                #declare tt=t0;
                #while(tt<t1)
                        object{ bola translate interpolalin(t0,v0,t1,v1,tt)}
                        #declare tt = tt+0.01;
                #end

        }
#end

#macro curvas()
        union{
                #declare M=200; //num de bolinhas
                #declare NK = 6; //Num de quadros
                #declare NA = 4; //Num arcos na curva
                #declare P = array[NK][NA][4]
                #declare R=array[NA][4]

                #for(i,0,NA-1,1)
                        #for(j,0,3,1)
                                #declare R[i][j]=<0,0,0>;
                        #end
                #end

                #declare P[0][0][0]=<0,0,0>;
                #declare P[0][0][1]=<0,10,0>;
                #declare P[0][0][2]=<0,10,5>;
                #declare P[0][0][3]=<0,5,7>;

                #declare P[0][1][0]=<0,5,7>;
                #declare P[0][1][1]=<-1,7,8>;
                #declare P[0][1][2]=<-2,3,8>;
                #declare P[0][1][3]=<-2,-7,10>;

                #declare P[0][2][0]=<-2,-7,10>;
                #declare P[0][2][1]=<10,7,4>;
                #declare P[0][2][2]=<7,7,4>;
                #declare P[0][2][3]=<1,10,12>;

                #declare P[0][3][0]=<1,10,12>;
                #declare P[0][3][1]=<-3,5,13>;
                #declare P[0][3][2]=<5,2,10>;
                #declare P[0][3][3]=<0,0,0>;

                #declare P[1][0][0]=<2,-3,0>;
                #declare P[1][0][1]=<6,6,3>;
                #declare P[1][0][2]=<7,0,5>;
                #declare P[1][0][3]=<0,7,3>;

                #declare P[1][1][0]=<0,7,3>;
                #declare P[1][1][1]=<-1,7,8>;
                #declare P[1][1][2]=<-2,3,8>;
                #declare P[1][1][3]=<8,-3,10>;

                #declare P[1][2][0]=<8,-3,10>;
                #declare P[1][2][1]=<10,7,4>;
                #declare P[1][2][2]=<7,7,4>;
                #declare P[1][2][3]=<-5,-7,-2>;

                #declare P[1][3][0]=<-5,-7,-2>;
                #declare P[1][3][1]=<-3,5,13>;
                #declare P[1][3][2]=<5,2,10>;
                #declare P[1][3][3]=<2,-3,0>;

                #declare P[2][0][0]=<3,3,3>;
                #declare P[2][0][1]=<0,10,0>;
                #declare P[2][0][2]=<0,10,5>;
                #declare P[2][0][3]=<-5,8,4>;

                #declare P[2][1][0]=<-5,8,4>;
                #declare P[2][1][1]=<-1,7,8>;
                #declare P[2][1][2]=<-2,3,8>;
                #declare P[2][1][3]=<-2,-7,10>;

                #declare P[2][2][0]=<-2,-7,10>;
                #declare P[2][2][1]=<10,7,4>;
                #declare P[2][2][2]=<7,7,4>;
                #declare P[2][2][3]=<-3,5,4>;

                #declare P[2][3][0]=<-3,5,4>;
                #declare P[2][3][1]=<-3,5,13>;
                #declare P[2][3][2]=<5,2,10>;
                #declare P[2][3][3]=<3,3,3>;

                #declare P[3][0][0]=<7,3,5>;
                #declare P[3][0][1]=<6,6,3>;
                #declare P[3][0][2]=<7,0,5>;
                #declare P[3][0][3]=<0,7,3>;

                #declare P[3][1][0]=<0,7,3>;
                #declare P[3][1][1]=<-1,7,8>;
                #declare P[3][1][2]=<-2,3,8>;
                #declare P[3][1][3]=<-1,3,0>;

                #declare P[3][2][0]=<-1,3,0>;
                #declare P[3][2][1]=<10,7,4>;
                #declare P[3][2][2]=<7,7,4>;
                #declare P[3][2][3]=<5,7,2>;

                #declare P[3][3][0]=<5,7,2>;
                #declare P[3][3][1]=<-3,5,13>;
                #declare P[3][3][2]=<5,2,10>;
                #declare P[3][3][3]=<7,3,5>;

                #declare P[4][0][0]=<-3,2,7>;
                #declare P[4][0][1]=<0,10,0>;
                #declare P[4][0][2]=<0,10,5>;
                #declare P[4][0][3]=<0,-5,-7>;

                #declare P[4][1][0]=<0,-5,-7>;
                #declare P[4][1][1]=<-1,7,8>;
                #declare P[4][1][2]=<-2,3,8>;
                #declare P[4][1][3]=<-2,-7,10>;

                #declare P[4][2][0]=<-2,-7,10>;
                #declare P[4][2][1]=<10,7,4>;
                #declare P[4][2][2]=<7,7,4>;
                #declare P[4][2][3]=<-1,5,6>;

                #declare P[4][3][0]=<1,5,6>;
                #declare P[4][3][1]=<-3,5,13>;
                #declare P[4][3][2]=<5,2,10>;
                #declare P[4][3][3]=<-3,2,7>;

                #declare P[5][0][0]=<0,0,0>;
                #declare P[5][0][1]=<0,10,0>;
                #declare P[5][0][2]=<0,10,5>;
                #declare P[5][0][3]=<0,5,7>;

                #declare P[5][1][0]=<0,5,7>;
                #declare P[5][1][1]=<-1,7,8>;
                #declare P[5][1][2]=<-2,3,8>;
                #declare P[5][1][3]=<-2,-7,10>;

                #declare P[5][2][0]=<-2,-7,10>;
                #declare P[5][2][1]=<10,7,4>;
                #declare P[5][2][2]=<7,7,4>;
                #declare P[5][2][3]=<1,10,12>;

                #declare P[5][3][0]=<1,10,12>;
                #declare P[5][3][1]=<-3,5,13>;
                #declare P[5][3][2]=<5,2,10>;
                #declare P[5][3][3]=<0,0,0>;

                #declare tk=array[NK]
                #declare tk[0]=0.000;
                #declare tk[1]=0.200;
                #declare tk[2]=0.400;
                #declare tk[3]=0.600;
                #declare tk[4]=0.800;
                #declare tk[5]=1.000;

                #local clk=clock;
                #local k=busca_tempo(clk, NK, tk);

                interpola1matriz2(P, NA, tk[k],tk[k+1], clk, R, k,k+1)
                object{ noh(R,NA,M) }

        }
#end

#macro roda(a,b,n,r)

        union{
                #while (a<b)
                        object { bola translate <r*sin(a), 0, r*cos(a)> }
                        #declare a = a+1/n;
                #end
        }
#end

curvas()

#include "camlight.inc"
#declare centro_cena = < 0.00, 0.00, 7.00>;
#declare raio_cena = 25.0;
#declare dir_camera = < 14.00, 7.00, 4.00 >;
#declare dist_camera = 50*raio_cena;
#declare intens_luz = 1.20;
camlight(centro_cena, raio_cena, dir_camera, dist_camera , z, intens_luz)