// Last edited on 2019-07-17 05:12:25 by stolfilocal
// Processed by remove-cam-lights

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

#declare Yellow = rgb<255, 255, 0>;
#declare Black =  rgb < 0.4, 0.4, 0.4 >;

#declare tx_vidro =
  texture{
    pigment{ color rgb < 0.85, 0.95, 1.00 > filter 0.70 }
    finish{ diffuse 0.03 reflection 0.25 ambient 0.02 specular 0.25 roughness 0.005 }
  }

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

#declare esfera =
        sphere {
                < 0, 0,  0>, 0.25 // Near lower left corner
                 texture{ tx_fosca }
        }

#declare P = array[4][4];

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

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

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

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

#macro interpola(to, vo, t1, v1, tt )
        #local r = (tt-to)/(t1-to);
        #local s = 1-r;
        #local vv= s*vo+r*v1;
        vv
#end

#macro arcobezier(to, t1, a, b, c, d, tt )
        #local ab = interpola(to, a, t1, b, tt );
        #local bc = interpola(to, b, t1, c, tt );
        #local cd = interpola(to, c, t1, d, tt );
        #local abc = interpola(to, ab, t1, bc, tt );
        #local bcd = interpola(to, bc, t1, cd, tt );
        #local abcd = interpola(to, abc, t1, bcd, tt );
        abcd
#end

#macro arco(a0, a1, a2, a3, t0, t1, n)
        union{
        #declare passo = 1/n;
        #declare j = t0;
        #while (j <= t1)
                object { esfera translate arcobezier(t0,t1, a0, a1, a2, a3, j)}
                #declare j=j+passo;
        #end
        }
#end

#macro suaviza(i)
        #local j =  mod(i+1, 4);
        #local vv = (P[j][1]-P[i][2])/2;
        #declare P[i][2]= P[i][3]-vv;
        #declare P[j][1]= P[j][0]+vv;
#end

#macro poliArcos(n,l)
        #local i = 0;
        #while(i < 4 )
                suaviza(i)
                #local i = i+1;
        #end
        union{
                #declare lado = n/l;
                object {arco (P[0][0], P[0][1], P[0][2], P[0][3], 0, lado, n) }
                object {arco (P[1][0], P[1][1], P[1][2], P[1][3], lado, 2*lado, n) }
                object {arco (P[2][0], P[2][1], P[2][2], P[2][3], 2*lado, 3*lado, n) }
                object {arco (P[3][0], P[3][1], P[3][2], P[3][3], 3*lado, 4*lado, n) }
        }
#end

#macro noh(P1, n, m)
        union{
                #declare lado = n/m;
                object {arco (P[0][0], P1[0][1], P1[0][2], P1[0][3], 0, lado, m) }
                object {arco (P1[1][0], P1[1][1], P1[1][2], P1[1][3], lado, 2*lado, m) }
                object {arco (P1[2][0], P1[2][1], P1[2][2], P1[2][3], 2*lado, 3*lado, m) }
                object {arco (P1[3][0], P1[3][1], P1[3][2], P1[3][3], 3*lado, 4*lado, m) }
        }
#end

#macro suaviza(i)
        #local j =  mod(i+1, 4);
        #local vv = (P[j][1]-P[i][2])/2;
        #declare P[i][2]= P[i][3]-vv;
        #declare P[j][1]= P[j][0]+vv;
#end

#macro interpola3 (A, B, C, D, t0, t1, tt)
        #local AB = interpola(A, b, t0, t1, tt);
        #local BC = interpola(B, C, t0, t1, tt);
        #local CD = interpola(C, D, t0, t1, tt);
        #local ABC = interpola(AB, BC, t0, t1, tt);
        #local BCD = interpola(BC, CD, t0, t1, tt);
        #local ABC = interpola(BC, CD, t0, t1, tt);
        #local ABCD = interpola(ABC, BCD, t0, t1, tt);
        ABCD
#end

object{poliArcos(20, 4)}

#include "eixos.inc"
//object{ eixos(3.00) }

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