I am well aware that there are several ways to find the tangents to a Bezier curve. However, I choose to just substitute the result of differentiating the Bezier curve equation.
So, given four control points,
// Differentiate x with respect to t float dxdt = -3*(1 - t)*(1 - t)*ptOne.x + 3*(1 - 4*t + 3*t*t)*ptTwo.x + 3*(2*t - 3*t*t)*ptThree.x + 3*t*t*ptFour.x; // Differentiate y with respect to t float dydt = -3*(1 - t)*(1 - t)*ptOne.y + 3*(1 - 4*t + 3*t*t)*ptTwo.y + 3*(2*t - 3*t*t)*ptThree.y + 3*t*t*ptFour.y; // Find the tangent, dy/dx float dydx = dydt * (1/dxdt); // Find the rotation angle in degrees float angle = atan(dydx) * 180/M_PI;
The strange thing is that this does not seem to be working for all kinds of curve. For example, if I draw a curve like this, with the first control point being the second leftmost point and then in a clockwise direction:
and attempt to draw the tangents:
You can see that some tangents (in particular, the first two and very last one) are not oriented in the right direction. Why might this be happening? I triple checked my differentiation and can't find anything wrong...