Wrong tangential directions for cubic bezier curve 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, ptOne, ptTwo, ptThree and ptFour:

// 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...
Using what Rahul kindly suggested in the comments, I realised that my tangent can be rotated in the opposite direction for two cases:


if dy/dt and dx/dt are both negative, yet dy/dx ends up being positive
if dy/dt is negative and dx/dt is positive, so the overall dy/dx is negative


This is because my angle calculation, which is done by float angle = atan(dydx) * 180/M_PI; will only calculate acute angles from the horizontal, and hence miss out the opposite cases.

Thanks a bunch!