Sign in to follow this  

How to evaluate a Bezier Curve used as mapping function

This topic is 2814 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Blender uses for example for animations bezier curves. This is though not a normal curve but a mapping function type curve so the shape is limited so the curve is usable to uniquely map an X value to an Y value. Now I implemented a bezier curve like this which is mostly a common bezier curve just that I make sure the required constraints are met. My problem now is though how to evaluate the curve. A bezier curve Bi(t) yields for the i-th segment the (x,y) value for the given position t along the curve. For the mapping though we are not interested in evaluating Bi(t) but actually y=Bi(x). For a given X value there is exactly one t value and vice versa. So the task at hand is to calculate the t value which corresponds to the given X value. Now this boils down to solving the following equation: 0 = a*(t**3) + b*(t**2) + c*t + d whereas the constants a, b, c, and d are: a = p1.x - 3*p2.x + 3*p3.x - p4.x b = 3*p2.x - 6*p3.x + 3*p4.x c = 3*p3.x - 3*p4.x d = p4.x - x whereas p1, p2, p3 and p4 are the segment end points (p1,p4) and the respective handles (p2,p3) and x the input value with p1.x <= x <= p4.x . From a math article on the website I figured out that this 3rd degree equation can be solved using the following ( using a substitution x=y-b/(3a) ): p = (3*a*c - b**2)/(3*(a**2)) q = (2*(b**3))/(27*(a**3)) - (b*c)/(3*(a**2)) + d/a with the discriminant D = (q/2)**2 + (p/3)**3 which is positive or 0 due to the restrictions on the curve due to usage as a mapping function (limited in the sense as there can be at max one real solution and 2 imaginary ones). This gives then u = 3rd-root( -q/2 + 2nd-root(D) ) v = 3rd-root( -q/2 - 2nd-root(D) ) y = u + v and therefore (after back-substitution) t = y - b/(3*a) Now this does not seem to work at all. Furthermore this contains a square roots and cubic roots. Now what interests me is: - Would this procedure above actually return the correct t to obtain B(t) for a given x? - If not, what did I do wrong? - Is there a better way to evaluate a bezier curve used as mapping function?

Share this post

Link to post
Share on other sites
Sign in to follow this