## Piston-Driven Wheel Simulation

Edit: I noticed a small mistake in the formulas below. I’ll try to get it fixed this week.

I visited a railroad museum today, and I saw a display showing how the piston is linked to the train wheel. For fun and learning I wanted to model the basic mathematics of how the linkage moves with the wheel and the piston, without looking up the answer on the Internet. That part seemed very simple:

Since l and p are fixed length, it was a matter of simple trigonometry, as seen above. Then I threw the math into a simple Racket program to simulate the movement. That part not hard, but it took an hour or two to add enough lines and circles to make the graphic look half-way decent. Here is a video recording of it running (about 10 seconds):

Here is the source code packaged with the video:

ftp://lavender.qlfiles.net/Racket/piston-driven-wheel.7z

One interesting part of the math is the connection point of l and p (see the diagram above). Until you get very long lengths of l, you get something close to the cosine function but not quite the same.

## Emacs Calc: Angle Between Vectors

In my geometry studies, I learned that one can get the angle between two vectors with this formula:

$cos \theta = \frac{V_1 \cdot V_2}{| V_1 | | V_2 |}$

I.e., the cosine of the angle equals the dot product of the two vectors over the product of their magnitudes.

This is definitely doable in Emacs Calc, since we have a dot product function, called inner-product (press ‘x inner product’), But doing the angle formula involves a lot of steps, with either stack rotation or storing the vectors in variables. So I wanted to get the angle formula stored as a calc formula. Unfortunately, inner-product itself is only an interactive function, so this was problematic. However, inner-product actual calls another function, inner. So, this formula is possible:

arccos(inner(mul, add, v1, v2) / (abs(v1) abs(v2)))

How do you store this formula in Emacs? I could walk you through the steps described in section 18.4 of the Emacs Calc info manual, but the end result is that this code is stored in your ~/.emacs.d/calc.el:

(put 'calc-define 'calc-vectorsangle '(progn
(defun calc-vectorsangle nil (interactive) (calc-wrapper (calc-enter-result 2 "vect" (cons (quote calcFunc-vectorsangle) (calc-top-list-n 2)))))
(put 'calc-vectorsangle 'calc-user-defn 't)
(defun calcFunc-vectorsangle (v1 v2) (math-normalize (list (quote
calcFunc-arccos) (list (quote /) (list (quote calcFunc-inner) (quote
(var mul var-mul)) (quote (var add var-add)) v1 v2) (list (quote *)
(list (quote calcFunc-abs) v1) (list (quote calcFunc-abs) v2))))))
(put 'calcFunc-vectorsangle 'calc-user-defn '(calcFunc-arccos (/