Previous: fitbv Up: ../plot79_f.html Next: fitbz3
SUBROUTINE FITBZ2 (XFIT, YFIT, NFIT, MAXFIT, X, Y, N, K1, KN, X NEXTRA) C$ (Bezier 2-D) C$ Make an (N-1)-order Bezier fit to a set of N 2-D control C$ points. The points may be positioned arbitrarily, and need C$ not correspond to a single-valued function. A Bezier curve C$ does not normally pass through the original points, but C$ will form a smooth approximation along their general C$ direction. Bezier curves have several interesting and C$ useful properties: C$ C$ Although the fit is of high polynomial degree for C$ large numbers of control points, the Bezier curve C$ does not exhibit the oscillations characteristic C$ of ordinary polynomial fits. C$ C$ If the control points are distinct, the C$ derivatives of orders 0..N-1 are continuous. C$ C$ The Bezier curve passes exactly through the first C$ and last points, and at those points is tangent C$ to the adjacent line segment. In general, the C$ k-th derivative at the end points depends only C$ upon the k adjacent line segments, or C$ equivalently, upon the k+1 adjacent control C$ points. C$ C$ The curve along any four consecutive line C$ segments will always lie inside their convex C$ hull. This means that if four consecutive points C$ are colinear, the curve between the second and C$ third points will be a straight line. C$ C$ For four consecutive control points P1..P4, if P2 C$ = (P1+2Q)/3 and P3 = (P4+2Q)/3, then the curve C$ along them is a parabolic arc with endpoints at C$ P1 and P4 and end tangents intersecting at Q. C$ C$ If four consecutive points are (x+r,y), C$ (x+r,y+kr), (x+kr,y+r), and (x,y+r), where k = C$ 4(sqrt(2)-1)/3 (= 0.55228475), the curve is C$ almost a circular arc with radius varying between C$ r and 1.00027r. C$ C$ For four consecutive control points P(1)..P(4), C$ provided the distances P(1)..P(2) and P(3)..P(4) C$ do not exceed the distance P(1)..P(4), the Bezier C$ curve along them cannot have any loops. C$ C$ A simple formula exists for the area subtended by C$ the curve at the origin (see I.D. Faux and M.J. C$ Pratt, Computational Geometry for Design and C$ Manufacture, Ellis Horwood Publishers, Chichester C$ (1979), p. 151). This can be convenient, for C$ example, in determining the cross-sectional area C$ of a pipe or duct represented by a Bezier curve. C$ C$ Although the Bezier fit is a global one, a change C$ in the K-th control point will affect the curve C$ primarily along the four line segments K-2..K-1, C$ K-1..K, K..K+1, and K+1..K+2. This is the reason C$ for terming the original data point "control" C$ points. The globality of the fit means that all C$ N control points contribute to the curve value at C$ any point, and the interpolation is therefore C$ more expensive compared to local methods such as C$ B-spline fits. C$ C$ The Bezier curve is thus an exceedingly useful tool in C$ curve design, since simple experimentation with individual C$ control points can be used to obtain any desired curve C$ shape. It has the additional advantage that it generalizes C$ easily to 3-D and 4-D space curves. Because of its global C$ nature, it is not suited for fitting more to than a few C$ control points, say about a dozen. It is most frequently C$ used with four control points, in which case it is a cubic C$ curve. C$ C$ The output arguments are: C$ C$ XFIT(*), C$ YFIT(*)........Output data points. C$ NFIT...........Number of points actually stored in XFIT(*) C$ and YFIT(*) (will not exceed MAXFIT). The C$ points will be distributed at intervals of C$ approximately equal arc length along the C$ curve. C$ C$ The input arguments are: C$ C$ MAXFIT.........Limit on number of points desired in XFIT(*) C$ and YFIT(*). C$ X(*),Y(*)......Original data points. C$ N..............Number of original data points. C$ K1.............Number of times to implicitly repeat the C$ first original data point. If out of the C$ range 0..3, the nearer of 0 or 3 will be C$ used. C$ KN.............Number of times to implicitly repeat the C$ last original data point (point N+NEXTRA). C$ If out of the range 0..3, the nearer of 0 or C$ 3 will be used. C$ NEXTRA......... .LE. 0 - Use exactly N data points. C$ .GT. 0 - Use N+NEXTRA data points, wrapping C$ around in the arrays X(*) and C$ Y(*), so that position N+K indexes C$ the array at position K (actually C$ at mod(N+K-1,N)+1). C$ If NEXTRA is out of the range 0..N, the C$ nearer of 0 or N will be used. C$ C$ If the first three points are the same as the last three, C$ the Bezier curve will be a continuous closed curve. If the C$ data points form a convex polygon, the Bezier curve will C$ also be convex, and lie entirely inside the data point C$ polygon. Thus, given a set of points defining a polygon, C$ where the last is implicitly connected to the first, by C$ setting NEXTRA = 3, one can generate a fit which itself is C$ a polygon. C$ (10-OCT-84)