// PoVRay 3.7 Scene File " ... .pov"
// author:  ...
// date:    ...
//--------------------------------------------------------------------------
#version 3.7;
global_settings{ assumed_gamma 1.0 }
//--------------------------------------------------------------------------
#include "colors.inc"
#include "textures.inc"
#include "glass.inc"
#include "metals.inc"
#include "golds.inc"
#include "stones.inc"
#include "woods.inc"
#include "shapes.inc"
#include "shapes2.inc"
#include "functions.inc"
#include "math.inc"
#include "transforms.inc"
#include "mrg_misc3.inc"
#include "platonic_solids.inc"

#declare lclock=clock+0;
#declare disk_radius=2.8;
#declare disk_sep=.45*disk_radius;
#declare dr=.2;

//move test charge around  1-11 
    //corkscrew around line

#declare test_r=.5*disk_sep*(1-1.2*cos(1.875*pi*trans((lclock-1)/10)))*y+.5*z+1.4*disk_radius*sin(1.87*pi*trans((lclock-1)/10))*x;     //not quite one orbit (1.875*pi)
/* test charge test trajectory
torus { 1.0,0.025  rotate<0,0,0>
        texture { pigment{ color Orange} finish { phong 1 reflection{ 0.00 metallic 0.00} } 
                } // end of texture
         rotate x*90 scale <1.4*disk_radius,.6*disk_sep,1>  translate<0,.5*disk_sep,.5>
      } // end of torus  -------------------------------              
*/

                             
//fade in efield marker array 11-13
#declare t2F=trans((lclock-11)/2);


// rotate perspective  13-21

#declare cpos= vrotate (<.5, 1.5-1.5*sin(2*pi*trans((lclock-13)/8)), 7>, 180*trans((lclock-13)/8)*y);


//fade in efield lines phade out efied markers 21-23
#declare t4F=trans((lclock-21)/2); 

//and rotate perspective   23-31

#declare cpos= vrotate (cpos, 180*trans((lclock-23)/8)*y)-1.5*sin(2*pi*trans((lclock-23)/8))*y;


// perspective (default, not required) camera
camera {
  perspective
  location  cpos
  look_at   <0, 0,  0>
  right     -x*image_width/image_height  // aspect &RH coords
  // direction z                        // direction and zoom
  // angle 67                           // field (overides direction zoom)
}
// create a regular point light source
light_source {
  0*x                  // light's position (translated below)
  color rgb <1,1,1>    // light's color
  translate 5*<-20, 40, 20>
}


#declare p_texture= texture {pigment{color rgb <.7,.0,.0>} finish{Shiny}} ;
#declare test_texture= texture {pigment{color rgb .5*<1,.025,.10>} finish{Shiny}} ;
#declare n_texture= texture {pigment{color rgb <.0,.0,.7>} finish{Shiny}} ;
#declare Efieldlinetexture=texture{pigment{color rgb <1,.15,.1>} finish{Shiny}}; 
#declare Bfieldlinetexture=texture{pigment{color rgb <.1,.1,1>} finish{Luminous}}; 
#declare charge_radius=.12;
#declare test_charge_radius=.4*charge_radius;
 
//arras positive charges, mod from dipole

#declare n_area=ceil(pi*disk_radius*disk_radius/(dr*dr));
#declare qq = array[2*n_area];     //
#declare pq = array[2*n_area];
#declare q1=1.2/n_area; 

#declare nq=0;
#declare xnow=-disk_radius;
#while (xnow<= disk_radius)
    #declare znow=-disk_radius;
    #while (znow<= disk_radius)
        #declare pnow=<xnow,0,znow>;
        #if(vlength(pnow)<=disk_radius)
            #declare qq[nq]=q1;    
            #declare pq[nq]=pnow+.5*disk_sep*y;    
            sphere { pnow+.5*disk_sep*y, .5*charge_radius texture{p_texture}}   
            #declare qq[nq+1]=-q1;    
            #declare pq[nq+1]=pnow-.5*disk_sep*y;    
            sphere { pnow-.5*disk_sep*y , .5*charge_radius texture{n_texture}}   
            #declare nq=nq+2;
        #end

    
        #declare znow=znow+dr;
    #end


    #declare xnow=xnow+dr;
#end

/**/




#declare E_field_out=<1,1,1>;

#macro E_field(_fieldpoint)
    #local _ic=0;
    #declare E_field_out=E_field_out*0;
    #while(_ic<nq) 
        #declare E_field_out=E_field_out+ qq[_ic]*(_fieldpoint-pq[_ic])/pow(vlength(_fieldpoint-pq[_ic]),3);
        #declare _ic=_ic+1;
    #end
   E_field_out     //return value
#end
 

//Make_Vector(vec,head_length,post_diameter,head_diameter)

#declare post_diameter=.2*test_charge_radius;
#declare head_diameter=3*post_diameter;
#declare head_length=3*head_diameter;

//testcharge
#declare E=E_field(test_r);
sphere { <0,0,0>, test_charge_radius texture{test_texture} translate test_r}  // end of sphere ----------------------------------- 
object{Make_Vector(E,head_length,post_diameter,head_diameter) translate test_r texture{Efieldlinetexture}}    


#if((t2F>0)&(t4F<1))
    #declare ds=.75;
    #declare smax=3 ;
    
    #declare snowx=-smax;
    #while (snowx<= smax)
        #declare snowy=-smax;
        #while (snowy<= smax)
            #declare snowz=-smax;
            #while (snowz<= smax)
                #declare snow=<snowx,snowy,snowz>;
                #if( (abs(snowy)-.5*disk_sep>.5*ds)|(sqrt(snowx*snowx+snowy*snowy)<disk_radius+.5*ds)  )
                    #declare E=E_field(snow);
                    #declare Etexturefadein=texture{pigment{color rgbt <1,.15,.1,1-t2F+t4F>} finish{Shiny}}; 
    
                    object{Make_Vector(E,head_length,post_diameter,head_diameter) translate snow texture{Etexturefadein}}    
                    
                
                #end
                #declare snowz=snowz+ds;
            #end
            #declare snowy=snowy+ds;
        #end
        #declare snowx=snowx+ds;
    #end
#end

//field lines
#if(t4F>0)

    #macro draw_field_line(_fieldpoint)
        #local s_fieldline=0;
        union{
        #while((s_fieldline<10))
            #local Etmp=E_field(fieldline_point);
            #local new_fieldline_point=fieldline_point+ds*Etmp/vlength(Etmp);
            sphere{fieldline_point,post_diameter }
            cylinder{fieldline_point,new_fieldline_point,post_diameter texture{Etexturefadein}}
            #if((abs(fieldline_point.y)<.5*ds))
               object{Make_Vector(Etmp/vlength(Etmp)*head_length*1.01,head_length,post_diameter,head_diameter) translate fieldline_point} 
            #end
             
            #local fieldline_point=new_fieldline_point;
            #local s_fieldline=s_fieldline+ds;
        #end
        }
    #end



    #declare Etexturefadein=texture{pigment{color rgbt <1,.15,.1,1-t4F>} finish{Shiny}}; 

    #declare ds=.4*charge_radius;
   
    #declare fieldline_point=.5*(disk_sep-ds)*y; 
    object{ draw_field_line(fieldline_point)  texture{Etexturefadein}}
  
       /*
    #declare qrot=0;
    #while(qrot<360)
        
        #declare fieldline_point=.5*(disk_sep-ds)*y+vrotate(disk_radius*z,qrot*y);; 
        object{ draw_field_line(fieldline_point)  texture{Etexturefadein}}
        #declare fieldline_point=.5*(disk_sep-ds)*y+vrotate(.5*disk_radius*z,qrot*y);; 
        object{ draw_field_line(fieldline_point)  texture{Etexturefadein}}
        #declare fieldline_point=.5*(disk_sep-ds)*y+vrotate(sqrt(.75)*disk_radius*z,(qrot+30)*y);; 
        object{ draw_field_line(fieldline_point)  texture{Etexturefadein}}
        #declare qrot=qrot+60;        
    #end
     */


 
    #declare xnow=-disk_radius;
    #while (xnow<= 0)
        #declare znow=-disk_radius;
        #while (znow<= 0)
            #declare pnow=<xnow,0,znow>;
            #if(vlength(pnow)<=disk_radius)
                #declare fieldline_point=pnow+.5*(disk_sep-ds)*y; 
                #declare fline=object{ draw_field_line(fieldline_point)  texture{Etexturefadein}}
                object{fline}
                object{fline scale <1,1,-1>}
                object{fline scale <-1,1,-1>}
                object{fline scale <-1,1,1>}
            #end

            #declare znow=znow+2*dr;
        #end
        #declare xnow=xnow+2*dr;
    #end
   
    
#end  
    
 
    
    