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...
dydx
computation, which cannot distinguish between equal and opposite tangents, e.g. $(1,0)$ and $(-1,0)$. You should just use $(dy/dt, dx/dt)$ as the tangent vector and normalize it. $\endgroup$