Let p0, p1, p2, p3 denote the control points of a cubic Bezier curve.
p0 and p3 are the start and end point respectively. To get a better
idea of the following, you should take paper and pencil and draw a
sketch. Connect the control points with lines.

Now place three points, q0, q1, q2, halfway between each two
consecutive control points. That it,
q0 = (p0 + p1) / 2
q1 = (p1 + p2) / 2
q3 = (p2 + p3) / 2

Now place two points, r0, r1, halfway between the q_s.
r0 = (q0 + q1) / 2
r1 = (q1 + q2) / 2

Finally place a point, s, halfway between r0 and r1.
s = (r0 + r1) / 2

This s is the midpoint in terms of the curve's parametrization. If you
just want to find s you could calculate it more simply as
s = (p0 + 3*p1 + 3*p2 + p3) / 8

But the intermediate steps of the above construction can be used if
you want to split the curve up.
The Bezier curve defined by the control points
p0, q0, r0, s
is exactly the first half of the original curve, up to the point s.
The Bezier curve defined by
s, r1, q2, p3
is the second half.

Now you can create a new path element and use the control points for
the first half to draw the segment of the original curve from p0 to s.
getTotalLength(), called on the half curve, gives you the arc length
at which s is on the original curve.

Calculating arc lengths of cubic curves would require integrating the
square root of a quartic polynomial. I suppose user agents implement
getTotalLength() by measuring closely approximating polylines. There
is no analytical solution for the general case. Arc length and the
polynomial parametrization aren't linked by an easily computable
function, so you should rely on the user agent's implementation of
getArcLength() for this task.


Note that it's easy to see now that the point s is not generally the
point of maximum curvature. If it is for the curve with control points
p0, p1, p2, p3 then we've just constructed two curves - given by p0,
q0, r0, s; and s, r1, q2, p3 - which attain their maximum curvature at
their end and start point respectively. The same goes for any local
geometric property of the curve.


Regards
Frank

--- In svg-developers@yahoogroups.com, "ddailey" <[EMAIL PROTECTED]> wrote:
>
> I've seen that some folks who pay attention to this list, also
happen to be relatively comfortable with the math of Bezier curves.
> 
> Suppose we have a path, P (involving a cubic Bezier : d="M x y C cx
cy dx dy ex ey"), then we can use
P.getPointAtLength(P.getTotalLength()/2) to get the point which is
halfway, in terms of arc length, from start to finish.  Let's call
that point H.
> 
> We may also calculate a (usually) different point M, defined by a
weighted average of the end points with the control points as shown in
[1]. 
> 
> That M and H are both points on the curve follows from the midpoint
theorem and from the definition of getPointAtLength() . That they need
not be the same can be verified by inspection of  few examples.
> 
> I would be curious to know  the arc length [2] of the curve from
(x,y) to M (so that I might figure out when a SMIL animation will
actually pass that point).  I can tell by looking at the form of the
parametric equation integrated over a radical involving its
derivative, that my calculus is way too many decades old to even begin
to work on it. Since M is sort of a special point, its arc length may
also be special.
> 
> Alternatively does anyone know where getPointAtLength is defined?
I'm assuming it uses some numerical approximation? Is that function
invertible (since I'd like to do just the opposite of what the
JavaScript function does)?
> 
> Ultimately I'm interested in the length of the arc to M since I'd
like to use it as a point at which to place a bud for a new sprout on
a branch -- it is also a point of sort of maximum curvature so it
seems like a likely point for a bud to happen in a biological system.
I can resort to using H instead -- since I can find it easily and I
can presumably differentiate the curve at the point H, so as to
generate a new sprout at some given angle relative to its parent
branch. But M just seems more interesting, being in the center of the
action, so to speak.
> 
> David
> 
> [1] http://homepage.smc.edu/kennedy_john/BEZIER.PDF
> [2] http://en.wikipedia.org/wiki/Arc_length
> 
> [Non-text portions of this message have been removed]
>



------------------------------------

-----
To unsubscribe send a message to: [EMAIL PROTECTED]
-or-
visit http://groups.yahoo.com/group/svg-developers and click "edit my 
membership"
----Yahoo! Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/svg-developers/

<*> Your email settings:
    Individual Email | Traditional

<*> To change settings online go to:
    http://groups.yahoo.com/group/svg-developers/join
    (Yahoo! ID required)

<*> To change settings via email:
    mailto:[EMAIL PROTECTED] 
    mailto:[EMAIL PROTECTED]

<*> To unsubscribe from this group, send an email to:
    [EMAIL PROTECTED]

<*> Your use of Yahoo! Groups is subject to:
    http://docs.yahoo.com/info/terms/

Reply via email to