Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

Hermite.cc

Go to the documentation of this file.
00001 /*
00002     File:       Hermite.cc
00003 
00004     Function:   
00005 
00006     Author:     Andrew Willmott
00007 
00008     Notes:      
00009 */
00010 
00011 #include "gcl/Hermite.h"
00012 
00013 
00014 /* This basis takes [x(0),x(1),x'(0),x'(1)] as knot points   
00015    Each column holds the coefficients of one of the Hermite 
00016    polynomials. */
00017 
00018 static Transform gHermiteMatrix(
00019      1.0,  0.0,  0.0,  0.0, 
00020      0.0,  0.0,  1.0,  0.0,
00021     -3.0,  3.0, -2.0, -1.0,
00022      2.0, -2.0,  1.0,  1.0
00023 );
00024 
00025 
00026 /*
00027     Calculate hermite coefficients.
00028 
00029     t0, y0, ySlope0 are start time, value, and slope.
00030     t1, y1, ySlope1 are end time, value, and slope.
00031     t1 had better not equal t0.
00032         
00033     For automatic slope control, set 
00034         ySlope1 = (y2 - y0) / (t2 - t0);
00035         ySlope0 = (y1 - y-1) / (t1 - t-1);
00036 */
00037 
00038 Void CalcHermiteCoeffs(
00039         GCLReal     t0,
00040         GCLReal     t1,
00041         GCLReal     y0,
00042         GCLReal     y1,
00043         GCLReal     ySlope0,
00044         GCLReal     ySlope1,
00045         Cubic       &result
00046     )
00047 {
00048     result = gHermiteMatrix * 
00049         Cubic(y0, y1, ySlope0 * (t1 - t0), ySlope1 * (t1 - t0));
00050 }
00051 
00052 GCLReal EvalCubic(Cubic &cubicCoeffs, GCLReal t, GCLReal t0, GCLReal t1)
00053 //  evaluate y(t), using coeffs computed by CalcHermiteCoeffs().
00054 //  t0, t1 have to be same as you supplied to CalcHermiteCoeffs().
00055 //  t should be between t0 and t1, inclusive.
00056 {
00057     GCLReal u = (t - t0) / (t1 - t0);
00058     Cubic   uCubic(1, u, sqr(u), sqr(u) * u);
00059 
00060     return(dot(uCubic, cubicCoeffs));
00061 }
00062 
00063 
00064 /*
00065     Here's a dumb sample program that interpolates values of y between
00066     frame 0 and frame 30:
00067 */
00068 
00069 #ifdef HM_DEBUG
00070 #include <stdio.h>
00071 
00072 main()
00073 {
00074     Cubic   coeffs;
00075     GCLReal t0 = 0, t1 = 30;
00076     GCLReal y0 = 1,  y1 = 3;
00077     GCLReal dy0 = .2, dy1 = 0;
00078     Int     t;
00079 
00080     CalcHermiteCoeffs(t0, t1, y0, y1, dy0, dy1, coeffs);
00081 
00082     for(t = 0; t < 31; t++)
00083         printf("\ny(%d) = %f", t, EvalCubic(coeffs, t, t0, t1) );
00084 }
00085 
00086 #endif

Generated at Sat Aug 5 00:16:59 2000 for Graphics Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000