Functional Objects           

Function
Two pendulums swing independently in xy plane and are connected with arms to a pen which draws on a bed which on a pendulum which is also free to swing in both x and y directions. Kinematics are based on simple harmonic motion with exponential damping.
Based on the simulation by Andy Giger
Harmonic1 by Kit : Simple Harmonic example
Ax? 
  
Ay? 
  
APx? 
  
APy? 
  
AF? 
  
AD? 
  
Bx? 
  
By? 
  
BPx? 
  
BPy? 
  
BF? 
  
BD? 
  
Cx? 
  
Cy? 
  
CPx? 
  
CPy? 
  
CF? 
  
CD? 
  
log? 
  
Randomly set the parameter values

Path Step size Scale Max Cycles
Line Line Width Line Color Padding

Function code

            function fn(t,p,scale) {  
            //  3 pendulums A=1,B=2,C=3
            //  x amplitude,y amplitude, phase x, phase y, frequency f, damping 
            //  input  px, px, degrees, degrees, cycles/second, s?
            
            var a1x =Ax;
            var a1y =Ay;
            var p1x =APx;
            var p1y =APy;
            var f1  =AF;
            var td1 =AD;
          
            var a2x =Bx;
            var a2y =By;
            var p2x =BPx;
            var p2y =BPy;
            var f2  =BF;
            var td2 =BD;
            
            var a3x =Cx;
            var a3y =Cy;
            var p3x =CPx;
            var p3y =CPy;
            var f3  =CF;
            var td3 =CD;
            
            //  pendulums arranged in right-angled triangle base R 
            
            var R = 100.0;  
            
            var Ax = 0.0, Ay = R;   // central position of A pendulum
            var Bx = R, By = 0.0;   // central position of B pendulum
            
            
            //pendulum position 
            //  x1,y1 Pendulum A  relative to centre
            //  x2,y2 Pendulum B  relative to centre
            //  x3,y3 Pendulum C  relative to centre
            
            
            // x,y damped sinusoidal positions 
            // same damping on all pendulums
            var d1 = td1==0 ? 1 : Math.exp(-t /360 / td1) ;
            var x1 = a1x * d1 * sin(f1 * t + p1x);
            var y1 = a1y * d1 * sin(f1 * t + p1y);
            
            var d2 =  d1;   // Math.exp(-t /360 / td2) ;	
            var x2 = a2x * d2 * sin(f2 * t + p2x);
            var y2 = a2y * d2 * sin(f2 * t + p2y);
            
            var d3 = d1;    // Math.exp(-t /360 / td3) 
            var x3 = a3x * d3 * sin(f3 * t + p3x);
            var y3 = a3y * d3 * sin(f3 * t + p3y);
            
            // Cx,Cy position of Pendulum A relative to origin	
            var Cx = x1 + Ax;  var Cy = y1 + Ay;  
            // Dx,Dy position of Pendulum B relative to origin	
            var Dx = x2 + Bx ; var Dy = y2 + By;
            // D relative to C
            var DCx = Cx - Dx; var DCy = Cy - Dy;
            // distance CD
            var CD = Math.sqrt(Math.pow(DCx,2) + Math.pow(DCy,2));
            
            // P is at the end of two links C-P, and D-P each of length L
            var L=R;
            
            // angle between C and P	
            var gamma = r2d(Math.acos( CD / (2 * L) ) + Math.acos( DCy / CD )) ;
            
            var Px = Cx - L * sin(gamma) ;
            var Py = Cy - L * cos(gamma);
            
            // point relative to pendulum C  ie on the paper surface relative to its centre	
            var x = Px - x3;  
            var y = Py - y3;

            if (log==1) 
              if (t % 36 == 0)
                console.log(t,x1,y1,x2,y2,x3,y3,Px,Py,x,y,d1,gamma);
            return [scale*x, scale*y];
            }