# Three Pendulum Rotary Harmonograph

I'm trying to create a simulation of a three pendulum rotary harmonograph, the one you can see in action in this video or in these instructions.

As you can see in the video, there are 2 pendulum with 1 degree of freedom each (one axis of movement) plus 1 pendulum with 2 degrees of freedom (the one in the middle, holding the sheet of paper).

I'm currently able to simulate the movement of a pen attached to just 2 pendulum (with 1 degree of freedom each) using this formula

(t = time, f = frequency, p = phase, d = damping, a = amplitude)

The result of this formula will give me the position of the pen on the x axis. I can then use it a second time with different values to obtain the position of the pen on the y axis. Very straightforward: result is here.

So, how can I add the third pendulum (the one with 2 degrees of freedom)? This formula can compute the position of a rod connected to a pendulum with two degrees of freedom:

However, I don't think this is what I need. The formula only gives me as a result one number: the movement of the pendulum makes the sheet of paper move on two axis (and I would even say 3, judging by the fact that the sheet of paper doesn't stay parallel to the plane).

So how in the world do I project the movement of a pendulum moving in 3d space over a 2d plane? Is this what I really need to do? If yes how?

Finally, even assumed that I'm able to do so, how should I insert these results into the pen x and y position? I presume is a matter of just making an addition: am I wrong?

(p.s. please forgive any possible triviality in my question. As you probably have guessed, I've never been taught physics nor computer science)

EDIT:

here's my pain. I can only simulate figures on the left. The one on the right requires a third pendulum, and this third pendulum is not oscillating in just one direction but two (or three?!).. (Image from "Quadrivium: The Four Classical Liberal Arts of Number, Geometry, Music, & Cosmology").

-
+1 for introducing me to an amazingly awesome physical system that I'd never heard of before and what is now one of my favorite YouTube videos! –  joshphysics Feb 12 '13 at 0:21
Yep, I'm enjoying the "artistic" part of physics. Glad you like it... Try to play around with the simulator I've made. Just change the frequency of one of the pendulum to a multiple of the other and look at it go :) Hope someone may help to put in a third rotatory pendulum! –  Saturnix Feb 12 '13 at 0:23
The 3-D to 2-D mapping isn't really a problem. While your system will move in three dimensions, you can reduce the problem to one of 2 coordinates, which greatly improves the solvability of the system. An equation of constraint gives you the mapping between your 2 dynamical coordinates and your 3 spatial dimensions. (For example, imagine a marble racing around on the surface of a paraboloid; the marble is moving in 3 dimensions, but it obeys an equation of constraint: $z = x^2 + y^2$). –  KDN Feb 18 '13 at 12:22

One can reproduce the figures as follow.

Lets work in frame of the table, which means that the position of paper sheet is $\vec r(t) = -(R_{table} \cos(\omega_{table} t + \phi_{table}), R_{table} \sin(\omega_{table} t))$ .

Now we add to it the offset of a pen which is $\vec {\delta r}(t) = (R_x \cos(\omega_x t + \phi_x), R_y \cos(\omega_y t + \phi_y))$ with all variables indexed x belonging to X-pendulum and so on.

Thus the full answer (position of the pen relative to the paper) would be

$X(t) = R_{table} \cos(\omega_{table} t + \phi_{table}) + R_x \cos(\omega_x t + \phi_x)$

$Y(t) = R_{table} \sin(\omega_{table} t) + R_y \cos(\omega_y t + \phi_y)$

The final result is here and it mimics one of the pictures from here.

PS. We have neglected the tilt of the paper pad and corresponding geometry (i.e., assumed that paper is always parallel to the table), but IMHO it shouldn't change things dramatically.

-
+1 just for the js code. –  adavid Feb 16 '13 at 12:40
Code mostly came from Saturnix, I just added the pad :-) –  dmitry_romanov Feb 17 '13 at 12:40
thanks! :) by modifying your code a little I got what I was searching for! –  Saturnix Feb 20 '13 at 4:01