Laxkit
0.0.7.1
|
Say you want a cubic curve defined by two vertex points (p0 and p3) and two control points (p1 and p2). The tangent at a vertex will be proportional to the vector from the vertex point to the control point. Define the curve so that it is a function of t going from 0 to 1. Then:
If we take g=3, then we have the most common type of this sort of cubic curve. So from the above we find:
or
Note that and that .
This curve has the convenient subdividable property that with points p0 to p3, we can subdivide this so that we have 2 new segments whose points are [p0 q1 q2 q6] and [q6 q4 q5 p3]. Note also that a bezier segment will always be contained within the bouning box of the vertex and control points. More specifically, the curve will always be contained within the convex hull of those points.
Say you want to approximate a circular arc with a cubic bezier line. For approximation purposes, the t=.5 point of the bezier curve must pass through the middle of the arc. Then for a circle of radius r and arc angle , it follows that the length of the vector connecting a vertex point and its control point is v:
where p are either the x or y coordinates of the points, depending on whether you want the x or y coordinate of P.
Have the patch be defined as a funtion of and that each run from 0 to 1. You want a section of the patch as a function of and which also run from 0 to 1.
For and , make corresponding matrices:
These will be linearly related to and like this:
So , and where:
Use those plus the above equation for a patch and get points Q:
where is the plain bezier curve matrix, is the coordinate matrix of the original patch as above, and magically contains the coordinate matrix of the new patch for u and v.