Angle between two points in Cartesian coordinate system C++ I'm trying to rotate a rectangle so that it faces another rectangle in a spiral.

Im using the Bullet pyhics library and freeglut for the 3d application, for anyone interested https://github.com/damorton/bullet-dominos



float x = 0;
float z = 0;
float angle = 0.0f;
int a = 2, b = 2;
float previousX = 0.0f;
float previousZ = 0.0f;

for (int i = 4; i &lt; maxPoints; i++)
{
    angle = 0.1 * i;
    x = (a + b * angle) * cos(angle);
    z = (a + b * angle) * sin(angle);

    GameObject* temp = CreateGameObject(x, 0, z);

    float newAngle = atan2(previousZ - z, previousX - x) * 180 / PI;
    temp-&gt;setRotationYaw(newAngle);

    previousX = x;
    previousZ = z;
}


You can see from the top view that the rectangles are not pointing towards the previous rectangles position. 



EDIT: After trying the below code

float x = 0;
float z = 0;
float angle = 0.0f;
int a = 2, b = 2;
float previousX = 0.0f;
float previousZ = 0.0f;

for (int i = 0; i &lt; maxPoints; i++)
{
    angle = 0.1 * i;
    x = (a + b * angle) * cos(angle);
    z = (a + b * angle) * sin(angle);

    GameObject* temp = CreateGameObject(x, 0, z);

    float dirX = -(a + b * angle) * sin(angle) + b * cos(angle);
    float dirZ = (a + b * angle) * cos(angle) + b * sin(angle);
    float newAngle = atan2(dirZ, dirX) * 180 / PI;
    temp-&gt;setRotationYaw(newAngle);

    previousX = x;
    previousZ = z;
}


The result is:



Console output:



EDIT: Solution. Some things to note are that the result of atan2() was not converted to degrees using atan2() * 180 / PI. Also that I passed in atan2(X, Z) compared to atan2(Z, X) that is sometimes done for hysterical raisins http://www2.tcl.tk/10814.

// create spiral dominos
float x = 0;
float z = 0;
float angle = 0.0f;
int a = 2, b = 2;
float previousX = 0.0f;
float previousZ = 0.0f;

float dominoHeight = 2.0f;

for (int i = 2; i &lt; maxPoints; i++)
{
    if (i % 30 == 0) dominoHeight++;

    angle = 0.15 * i;
    x = (a + b * angle) * cos(angle);
    z = (a + b * angle) * sin(angle);

    GameObject* temp = CreateGameObject(x, 0, z);

    float dirX = -(a + b * angle) * sin(angle) + (b * cos(angle));
    float dirZ = (a + b * angle) * cos(angle) + (b * sin(angle));
    float newAngle = atan2(dirX, dirZ);
    printf("dirX: %f - dirZ: %f - angle: %f\n", dirX, dirZ, newAngle);
    temp-&gt;setRotationYaw(newAngle);

    previousX = x;
    previousZ = z;
}
The parametric equation for a spiral is:

$$
\begin{eqnarray}
\begin{aligned}
    x &amp;= &amp;(a + b \theta) \times \cos(\theta)\\
    z &amp;= &amp;(a + b \theta) \times \sin(\theta)
\end{aligned}
\end{eqnarray}
$$

The direction on the spiral point is simply the derivative of the system with respect to $\theta$. Thus the direction is: 

$$
\begin{eqnarray}
\begin{aligned}
 x_{dir} &amp;=&amp;-(a + b \theta) \times \sin(\theta) + b \times \cos(\theta)\\
 z_{dir} &amp;=&amp;(a + b \theta) \times \cos(\theta) + b \times \sin(\theta)
\end{aligned}
\end{eqnarray}
$$

Finally angle is is simply atan2 of the direction equation. 



Image 1: This is what I get when i plot squares at $(x, z)$ with direction $(x_{dir}, z_{dir})$

Mathematica source for image